diff options
| -rw-r--r-- | decl.c | 10 | ||||
| -rw-r--r-- | tests/union.c | 4 | ||||
| -rw-r--r-- | tests/union.qbe | 2 | 
3 files changed, 14 insertions, 2 deletions
| @@ -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, } | 
