diff --git a/tccgen.c b/tccgen.c index 75959ad..a411e8f 100644 --- a/tccgen.c +++ b/tccgen.c @@ -3610,8 +3610,7 @@ static void struct_decl(CType *type, AttributeDef *ad, int u) alignoverride = 0; if (ad1.a.aligned) { int speca = 1 << (ad1.a.aligned - 1); - if (align < speca) - alignoverride = speca; + alignoverride = speca; } else if (ad1.a.packed || ad->a.packed) { alignoverride = 1; } else if (*tcc_state->pack_stack_ptr) { diff --git a/tests/tcctest.c b/tests/tcctest.c index 68f8db6..6c414f7 100644 --- a/tests/tcctest.c +++ b/tests/tcctest.c @@ -1087,6 +1087,18 @@ struct Large { }; } __attribute__((aligned(2 * sizeof(long)))); +typedef unsigned long long __attribute__((aligned(4))) unaligned_u64; + +struct aligntest9 { + unsigned int buf_nr; + unaligned_u64 start_lba; +}; + +struct aligntest10 { + unsigned int buf_nr; + unsigned long long start_lba; +}; + void struct_test() { struct1 *s; @@ -1136,6 +1148,10 @@ void struct_test() sizeof(struct aligntest7), __alignof__(struct aligntest7)); printf("aligntest8 sizeof=%d alignof=%d\n", sizeof(struct aligntest8), __alignof__(struct aligntest8)); + printf("aligntest9 sizeof=%d alignof=%d\n", + sizeof(struct aligntest9), __alignof__(struct aligntest9)); + printf("aligntest10 sizeof=%d alignof=%d\n", + sizeof(struct aligntest10), __alignof__(struct aligntest10)); printf("altest5 sizeof=%d alignof=%d\n", sizeof(altest5), __alignof__(altest5)); printf("altest6 sizeof=%d alignof=%d\n",