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; } |
