diff --git a/tccgen.c b/tccgen.c index a5de7e9..1efbc1f 100644 --- a/tccgen.c +++ b/tccgen.c @@ -3391,6 +3391,9 @@ static void struct_layout(CType *type, AttributeDef *ad) (ofs2 / (typealign * 8)) > (size/typealign))) { c = (c + ((bit_pos + 7) >> 3) + typealign - 1) & -typealign; bit_pos = 0; + } else while (bit_pos + bit_size > size * 8) { + c += size; + bit_pos -= size * 8; } offset = c; /* In PCC layout named bit-fields influence the alignment diff --git a/tests/tcctest.c b/tests/tcctest.c index dc6a060..aee0120 100644 --- a/tests/tcctest.c +++ b/tests/tcctest.c @@ -2082,6 +2082,12 @@ void bitfield_test(void) char c; } st5 = { 1, 2, 3, 4, -3, 6 }; printf("st5 = %d %d %d %d %d %d\n", st5.a, st5.b, st5.x, st5.y, st5.z, st5.c); + struct sbf6 { + short x : 12; + unsigned char y : 2; + } st6; + st6.y = 1; + printf("st6.y == %d\n", st6.y); } #ifdef __x86_64__