https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51628
--- Comment #46 from Alexey Salmin <alexey.salmin at gmail dot com> --- Tested the latest patch, behavior looks very reasonable even in tricky cases. 1) No warning, gcd(12, 8) == 4 struct tuple_t { char c[12]; __int128_t i; } __attribute__((packed, aligned(8))); typedef struct unaligned_int128_t_ { __int128_t value; } __attribute__((packed, aligned(4))) unaligned_int128_t; struct tuple_t p = {0, 1}; unaligned_int128_t *addr = (unaligned_int128_t *)(&p.i); 2) Gives a warning, gcd(10, 8) < 4 struct tuple_t { char c[10]; __int128_t i; } __attribute__((packed, aligned(8))); typedef struct unaligned_int128_t_ { __int128_t value; } __attribute__((packed, aligned(4))) unaligned_int128_t; struct tuple_t p = {0, 1}; unaligned_int128_t *addr = (unaligned_int128_t *)(&p.i);