From 17ea802ceaa76f55726488379959a983f891f631 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Sun, 23 Aug 2020 11:47:16 +0900 Subject: [PATCH] Handle zero-width bitfield member --- parse.c | 6 +++++- test/bitfield.c | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/parse.c b/parse.c index 1d6c94b..633bf97 100644 --- a/parse.c +++ b/parse.c @@ -2134,7 +2134,11 @@ static Type *struct_decl(Token **rest, Token *tok) { int bits = 0; for (Member *mem = ty->members; mem; mem = mem->next) { - if (mem->is_bitfield) { + if (mem->is_bitfield && mem->bit_width == 0) { + // Zero-width anonymous bitfield has a special meaning. + // It affects only alignment. + bits = align_to(bits, mem->ty->size * 8); + } else if (mem->is_bitfield) { int sz = mem->ty->size; if (bits / (sz * 8) != (bits + mem->bit_width - 1) / (sz * 8)) bits = align_to(bits, sz * 8); diff --git a/test/bitfield.c b/test/bitfield.c index 08f64ff..169081c 100644 --- a/test/bitfield.c +++ b/test/bitfield.c @@ -48,6 +48,10 @@ int main() { ASSERT(3, ({ T3 x={1,2,3}; ++x.b; })); ASSERT(4, ({ T3 x={1,2,3}; ++x.c; })); + ASSERT(4, sizeof(struct {int a:3; int c:1; int c:5;})); + ASSERT(8, sizeof(struct {int a:3; int:0; int c:5;})); + ASSERT(4, sizeof(struct {int a:3; int:0;})); + printf("OK\n"); return 0; } -- GitLab