diff options
-rw-r--r-- | README.md | 1 | ||||
-rw-r--r-- | qbe.c | 13 | ||||
-rw-r--r-- | tests/union-passing.c | 2 | ||||
-rw-r--r-- | tests/union-passing.qbe | 2 |
4 files changed, 7 insertions, 11 deletions
@@ -10,7 +10,6 @@ Still TODO: - Come up with a name so it can be installed alongside the system `cc`. - The preprocessor (currently we are just using the system `cpp`). - Bit-fields. -- Passing structs with embedded unions by value. - Variable-length arrays. - `volatile`-qualified types (requires support from QBE). - `_Thread_local` storage-class specifier (requires support from QBE). @@ -979,12 +979,6 @@ emitrepr(struct representation *r, bool abi, bool ext) } /* XXX: need to consider _Alignas on struct members */ -/* XXX: this might not be right for something like -union { - struct { long long x; double y; }; - struct { double z; long long w; }; -}; -*/ static void emittype(struct type *t) { @@ -1008,14 +1002,17 @@ emittype(struct type *t) emitname(&t->repr->abi); fputs(" = { ", stdout); for (m = t->structunion.members; m; m = m->next) { + if (t->kind == TYPEUNION) + fputs("{ ", stdout); 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; + fputs(" } ", stdout); + else + fputs(", ", stdout); } puts("}"); } diff --git a/tests/union-passing.c b/tests/union-passing.c index 14025c0..ddf35f2 100644 --- a/tests/union-passing.c +++ b/tests/union-passing.c @@ -1,2 +1,2 @@ -void f(union {int x;} u) { +void f(union {int x; float y;} u) { } diff --git a/tests/union-passing.qbe b/tests/union-passing.qbe index 96e8523..2edd8db 100644 --- a/tests/union-passing.qbe +++ b/tests/union-passing.qbe @@ -1,4 +1,4 @@ -type :.1 = { w, } +type :.1 = { { w } { s } } export function $f(:.1 %.1) { @start.1 |