From 7a3ba2aac1d8f8cef5215acab742820e68efe601 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Sun, 18 Aug 2019 20:35:17 +0900 Subject: [PATCH] Add struct initializer for global variable --- parse.c | 6 ++++++ test/initializer.c | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/parse.c b/parse.c index 5cf0475..cd175e6 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 6b2bb5c..87c6089 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; } -- GitLab