Fix parsing attributes for struct decls

Given this code:

  struct __attribute__((...)) Name {...};

TCC was eating "Name", hence generating an anonymous struct.
It also didn't apply any packed attributes to the parsed
members.  Both fixed.  The testcase also contains a case
that isn't yet handled by TCC (under a BROKEN #define).
master
Michael Matz 2016-07-11 18:38:00 +02:00
parent 7e51546624
commit 2b618c1ab4
2 changed files with 35 additions and 4 deletions

View File

@ -3179,10 +3179,8 @@ static void struct_decl(CType *type, AttributeDef *ad, int u)
a = tok; /* save decl type */
next();
if (tok == TOK_ATTRIBUTE1 || tok == TOK_ATTRIBUTE2) {
if (tok == TOK_ATTRIBUTE1 || tok == TOK_ATTRIBUTE2)
parse_attribute(ad);
next();
}
if (tok != '{') {
v = tok;
next();
@ -3302,7 +3300,7 @@ static void struct_decl(CType *type, AttributeDef *ad, int u)
if (ad1.a.aligned) {
if (align < ad1.a.aligned)
align = ad1.a.aligned;
} else if (ad1.a.packed) {
} else if (ad1.a.packed || ad->a.packed) {
align = 1;
} else if (*tcc_state->pack_stack_ptr) {
if (align > *tcc_state->pack_stack_ptr)

View File

@ -108,6 +108,7 @@ void cmp_comparison_test(void);
void math_cmp_test(void);
void callsave_test(void);
void builtin_frame_address_test(void);
void attrib_test(void);
int fib(int n);
void num(int n);
@ -702,6 +703,7 @@ int main(int argc, char **argv)
intdiv_test();
if (via_volatile (42) != 42)
printf ("via_volatile broken\n");
attrib_test();
return 0;
}
@ -2957,3 +2959,34 @@ char via_volatile (char i)
vi = i;
return vi;
}
struct __attribute__((__packed__)) Spacked {
char a;
short b;
int c;
};
struct Spacked spacked;
typedef struct __attribute__((__packed__)) {
char a;
short b;
int c;
} Spacked2;
Spacked2 spacked2;
#ifdef BROKEN
/* This doesn't work for now. Requires adjusting field offsets/sizes
after parsing the struct members. */
typedef struct Spacked3_s {
char a;
short b;
int c;
} __attribute__((__packed__)) Spacked3;
Spacked3 spacked3;
#endif
void attrib_test(void)
{
printf("attr: %d %d %d %d\n", sizeof(struct Spacked),
sizeof(spacked), sizeof(Spacked2), sizeof(spacked2));
#ifdef BROKEN
printf("attr: %d %d\n", sizeof(Spacked3), sizeof(spacked3));
#endif
}