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;