/* { dg-do run } */ | |
/* { dg-options "-O3 -fstrict-aliasing" } */ | |
union U { | |
struct A { int : 2; int x : 8; } a; | |
struct B { int : 6; int x : 8; } b; | |
}; | |
int __attribute__((noipa)) | |
foo (union U *p, union U *q) | |
{ | |
p->a.x = 1; | |
q->b.x = 1; | |
return p->a.x; | |
} | |
int | |
main() | |
{ | |
union U x; | |
if (foo (&x, &x) != x.a.x) | |
__builtin_abort (); | |
return 0; | |
} | |
/* We support arbitrary punning through unions when it happens through | |
the union type and thus p == q is valid here. */ |