From 673ddb9e58883da5a8840fa7f5b16a439b3f5dd7 Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Wed, 20 Feb 2019 18:20:40 -0800 Subject: Fix emittype for unions Thanks to Andrew Chambers for the bug report. --- qbe.c | 4 +++- tests/union-passing.c | 2 ++ tests/union-passing.qbe | 7 +++++++ 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 tests/union-passing.c create mode 100644 tests/union-passing.qbe 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 +} -- cgit v1.2.3