diff options
author | Quentin Carbonneaux <quentin@c9x.me> | 2017-04-08 21:11:33 -0400 |
---|---|---|
committer | Quentin Carbonneaux <quentin@c9x.me> | 2017-04-08 21:56:20 -0400 |
commit | 9d1c38d69547d835f7228651e71e8a7d744c456d (patch) | |
tree | 39b4b34af250d1f68b8a8f982cad299a2fbf5f94 | |
parent | 81e2fdacc536dab7ad3c1e1da313b80f5ae935b7 (diff) | |
download | roux-9d1c38d69547d835f7228651e71e8a7d744c456d.tar.gz |
fix bug in union size computation
The size of a union is the size of the largest element aligned with the largest alignment. For example, the size of the following union is 16, not 13 (as returned before this patch). union { char c[13]; int i; };
-rw-r--r-- | parse.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/parse.c b/parse.c index edb6c29..b393fc2 100644 --- a/parse.c +++ b/parse.c @@ -960,9 +960,9 @@ parseseg(Seg *seg, Typ *ty, int t) err(", or } expected"); seg[n].type = SEnd; a = 1 << al; - sz = (sz + a - 1) & -a; - if (sz >= ty->size) - ty->size = sz; + if (sz < ty->size) + sz = ty->size; + ty->size = (sz + a - 1) & -a; ty->align = al; } |