diff --git a/tccgen.c b/tccgen.c index 6748beb..c174e96 100644 --- a/tccgen.c +++ b/tccgen.c @@ -4768,7 +4768,7 @@ static void init_putz(CType *t, Section *sec, unsigned long c, int size) static void decl_initializer(CType *type, Section *sec, unsigned long c, int first, int size_only) { - int index, array_length, n, no_oblock, nb, parlevel, i; + int index, array_length, n, no_oblock, nb, parlevel, parlevel1, i; int size1, align1, expr_type; Sym *s, *f; CType *t1; @@ -4970,13 +4970,17 @@ static void decl_initializer(CType *type, Section *sec, unsigned long c, skip('}'); } else if (size_only) { /* just skip expression */ - parlevel = 0; - while ((parlevel > 0 || (tok != '}' && tok != ',')) && - tok != -1) { + parlevel = parlevel1 = 0; + while ((parlevel > 0 || parlevel1 > 0 || + (tok != '}' && tok != ',')) && tok != -1) { if (tok == '(') parlevel++; else if (tok == ')') parlevel--; + else if (tok == '{') + parlevel1++; + else if (tok == '}') + parlevel1--; next(); } } else { diff --git a/tests/tcctest.c b/tests/tcctest.c index 87e7ad1..0d98dcc 100644 --- a/tests/tcctest.c +++ b/tests/tcctest.c @@ -827,6 +827,27 @@ struct aligntest4 { double a[0]; }; +struct complexinit0 { + int a; + int b; +}; + +struct complexinit { + int a; + struct complexinit0 *b; +}; + +const static struct complexinit cix[] = { + [0] = { + .a = 0xfefa, + .b = (const struct complexinit0[]) { + { 0x80, 0x81 }, + { 0x82, 0x83 }, + {} + } + } +}; + void struct_test() { struct1 *s; @@ -856,6 +877,11 @@ void struct_test() printf("st2: %d %d %d\n", s->f1, s->f2, s->f3); printf("str_addr=%x\n", (int)st1.str - (int)&st1.f1); + printf("cix: %d %d %d %d %d %d %d\n", + cix[0].a, + cix[0].b[0].a, cix[0].b[0].b, + cix[0].b[1].a, cix[0].b[1].b, + cix[0].b[2].a, cix[0].b[2].b); /* align / size tests */ printf("aligntest1 sizeof=%d alignof=%d\n",