/* { dg-do run } */ /* { dg-options "-O -fno-strict-aliasing" } */ struct S { void *a; long double b; }; struct Z { long long l; short s; } __attribute__((packed)); struct S __attribute__((noclone, noinline)) foo (void *v, struct Z *z) { struct S t; t.a = v; *(struct Z *) &t.b = *z; return t; } struct Z gz; int main (int argc, char **argv) { struct S s; if (sizeof (long double) < sizeof (struct Z)) return 0; gz.l = 0xbeef; gz.s = 0xab; s = foo ((void *) 0, &gz); if ((((struct Z *) &s.b)->l != gz.l) || (((struct Z *) &s.b)->s != gz.s)) __builtin_abort (); return 0; }