http://lists.gnu.org/archive/html/tinycc-devel/2005-07/msg00008.html --- tcc.c +++ tcc.c @@ -6442,7 +6487,7 @@ { int a, v, size, align, maxalign, c, offset; int bit_size, bit_pos, bsize, bt, lbit_pos; - Sym *s, *ss, **ps; + Sym *s, *ss, *ass, **ps; AttributeDef ad; CType type1, btype; @@ -6513,7 +6558,9 @@ v = 0; type1 = btype; if (tok != ':') { - type_decl(&type1, &ad, &v, TYPE_DIRECT); + type_decl(&type1, &ad, &v, TYPE_DIRECT | TYPE_ABSTRACT); + if (v == 0 && (type1.t & VT_BTYPE) != VT_STRUCT) + expect("identifier"); if ((type1.t & VT_BTYPE) == VT_FUNC || (type1.t & (VT_TYPEDEF | VT_STATIC | VT_EXTERN | VT_INLINE))) error("invalid type for '%s'", @@ -6576,7 +6623,7 @@ } else { bit_pos = 0; } - if (v) { + if (v != 0 || (type1.t & VT_BTYPE) == VT_STRUCT) { /* add new memory data only if starting bit field */ if (lbit_pos == 0) { @@ -6602,6 +6649,15 @@ } printf("\n"); #endif + } + if (v == 0 && (type1.t & VT_BTYPE) == VT_STRUCT) { + ass = type1.ref; + while ((ass = ass->next) != NULL) { + ss = sym_push(ass->v, &ass->type, 0, offset + ass->c); + *ps = ss; + ps = &ss->next; + } + } else if (v) { ss = sym_push(v | SYM_FIELD, &type1, 0, offset); *ps = ss; ps = &ss->next;