aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2017-04-29 21:23:43 +0200
committerMichael Matz <matz@suse.de>2017-04-29 21:25:31 +0200
commit28084420fed1f833da04a6f69380c276c9431cff (patch)
tree07ea58a262c7f570e7c586645e22707c2ae06a57
parent76e16465bfce78a2a7bbe54470723fe4d640e1e4 (diff)
downloadtinycc-28084420fed1f833da04a6f69380c276c9431cff.tar.gz
tinycc-28084420fed1f833da04a6f69380c276c9431cff.tar.bz2
Fix char bitfields corner case
See testcase.
-rw-r--r--tccgen.c2
-rw-r--r--tests/tcctest.c6
2 files changed, 7 insertions, 1 deletions
diff --git a/tccgen.c b/tccgen.c
index 2cdb4f1..d558ff8 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -3387,7 +3387,7 @@ static void struct_layout(CType *type, AttributeDef *ad)
int ofs = (c * 8 + bit_pos) % (typealign * 8);
int ofs2 = ofs + bit_size + (typealign * 8) - 1;
if (bit_size == 0 ||
- (typealign != 1 &&
+ ((typealign != 1 || size == 1) &&
(ofs2 / (typealign * 8)) > (size/typealign))) {
c = (c + ((bit_pos + 7) >> 3) + typealign - 1) & -typealign;
bit_pos = 0;
diff --git a/tests/tcctest.c b/tests/tcctest.c
index 988b212..c267fee 100644
--- a/tests/tcctest.c
+++ b/tests/tcctest.c
@@ -2069,6 +2069,12 @@ void bitfield_test(void)
} st3;
printf("sizeof(st3) = %d\n", sizeof(st3));
#endif
+ struct sbf4 {
+ int x : 31;
+ char y : 2;
+ } st4;
+ st4.y = 1;
+ printf("st4.y == %d\n", st4.y);
}
#ifdef __x86_64__