aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--decl.c10
-rw-r--r--tests/union.c4
-rw-r--r--tests/union.qbe2
3 files changed, 14 insertions, 2 deletions
diff --git a/decl.c b/decl.c
index 31eb0b9..235c975 100644
--- a/decl.c
+++ b/decl.c
@@ -660,8 +660,14 @@ structdecl(struct scope *s, struct type *t)
if (align < m->type->align)
align = m->type->align;
t->size = ALIGNUP(t->size, align);
- m->offset = t->size;
- t->size += m->type->size;
+ if (t->kind == TYPESTRUCT) {
+ m->offset = t->size;
+ t->size += m->type->size;
+ } else {
+ m->offset = 0;
+ if (t->size < m->type->size)
+ t->size = m->type->size;
+ }
if (t->align < align)
t->align = align;
}
diff --git a/tests/union.c b/tests/union.c
new file mode 100644
index 0000000..9b4e5f9
--- /dev/null
+++ b/tests/union.c
@@ -0,0 +1,4 @@
+union {
+ int x;
+ double y;
+} a = {.x = 5}, b = {.y = 7.5};
diff --git a/tests/union.qbe b/tests/union.qbe
new file mode 100644
index 0000000..adbda57
--- /dev/null
+++ b/tests/union.qbe
@@ -0,0 +1,2 @@
+export data $a = align 8 { w 5, z 4 }
+export data $b = align 8 { d d_0x1.ep+2, }