summary refs log tree commit diff
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
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;
};
-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;
 }