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);