summary refs log tree commit diff
path: root/parse.c
diff options
context:
space:
mode:
authorQuentin Carbonneaux <quentin@c9x.me>2017-04-08 21:11:33 -0400
committerQuentin Carbonneaux <quentin@c9x.me>2017-04-08 21:56:20 -0400
commit9d1c38d69547d835f7228651e71e8a7d744c456d (patch)
tree39b4b34af250d1f68b8a8f982cad299a2fbf5f94 /parse.c
parent81e2fdacc536dab7ad3c1e1da313b80f5ae935b7 (diff)
downloadroux-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;
};
Diffstat (limited to 'parse.c')
-rw-r--r--parse.c6
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;
 }