diff --git a/parse.c b/parse.c index 5cf04759e5f46bcac911fd22b6f2824d366b8de3..cd175e638cc5bb8eda9a2c4ea2a80796ecdb0d10 100644 --- a/parse.c +++ b/parse.c @@ -858,6 +858,12 @@ static void write_gvar_data(Initializer *init, Type *ty, char *buf, int offset) return; } + if (ty->kind == TY_STRUCT) { + for (Member *mem = ty->members; mem; mem = mem->next) + write_gvar_data(init->children[mem->idx], mem->ty, buf, offset + mem->offset); + return; + } + if (init->expr) write_buf(buf + offset, eval(init->expr), ty->size); } diff --git a/test/initializer.c b/test/initializer.c index 6b2bb5ceb8c5cc0f0bbda890af79950a52efdb90..87c6089112d563acc5036018f1436f299418ae20 100644 --- a/test/initializer.c +++ b/test/initializer.c @@ -4,6 +4,9 @@ char g3 = 3; short g4 = 4; int g5 = 5; long g6 = 6; +int g9[3] = {0, 1, 2}; +struct {char a; int b;} g11[2] = {{1, 2}, {3, 4}}; +struct {int a[2];} g12[2] = {{{1, 2}}}; int main() { ASSERT(1, ({ int x[3]={1,2,3}; x[0]; })); @@ -72,6 +75,20 @@ int main() { ASSERT(5, g5); ASSERT(6, g6); + ASSERT(0, g9[0]); + ASSERT(1, g9[1]); + ASSERT(2, g9[2]); + + ASSERT(1, g11[0].a); + ASSERT(2, g11[0].b); + ASSERT(3, g11[1].a); + ASSERT(4, g11[1].b); + + ASSERT(1, g12[0].a[0]); + ASSERT(2, g12[0].a[1]); + ASSERT(0, g12[1].a[0]); + ASSERT(0, g12[1].a[1]); + printf("OK\n"); return 0; }