aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Forney <mforney@mforney.org>2019-02-20 18:20:40 -0800
committerMichael Forney <mforney@mforney.org>2019-02-20 18:24:54 -0800
commit673ddb9e58883da5a8840fa7f5b16a439b3f5dd7 (patch)
treef6ab6d5d7738ba0350b0e0e4f2230a04da10a53f
parent9150901e4ebde2273bf266d608a7a05228e1d0df (diff)
Fix emittype for unions
Thanks to Andrew Chambers for the bug report.
-rw-r--r--qbe.c4
-rw-r--r--tests/union-passing.c2
-rw-r--r--tests/union-passing.qbe7
3 files changed, 12 insertions, 1 deletions
diff --git a/qbe.c b/qbe.c
index d3d14f2..75be4c5 100644
--- a/qbe.c
+++ b/qbe.c
@@ -1007,13 +1007,15 @@ emittype(struct type *t)
fputs("type :", stdout);
emitname(&t->repr->abi);
fputs(" = { ", stdout);
- for (m = t->structunion.members; m && t->kind == TYPESTRUCT; m = m->next) {
+ for (m = t->structunion.members; m; m = m->next) {
for (i = 1, sub = m->type; sub->kind == TYPEARRAY; sub = sub->base)
i *= sub->array.length;
emitrepr(sub->repr, true, true);
if (i > 1)
printf(" %" PRIu64, i);
fputs(", ", stdout);
+ if (t->kind == TYPEUNION)
+ break;
}
puts("}");
}
diff --git a/tests/union-passing.c b/tests/union-passing.c
new file mode 100644
index 0000000..14025c0
--- /dev/null
+++ b/tests/union-passing.c
@@ -0,0 +1,2 @@
+void f(union {int x;} u) {
+}
diff --git a/tests/union-passing.qbe b/tests/union-passing.qbe
new file mode 100644
index 0000000..96e8523
--- /dev/null
+++ b/tests/union-passing.qbe
@@ -0,0 +1,7 @@
+type :.1 = { w, }
+export
+function $f(:.1 %.1) {
+@start.1
+@body.2
+ ret
+}