1 /* { dg-do run } */
2 /* { dg-options "-O3 -fstrict-aliasing" } */
3 
4 union U {
5   struct A { int : 2; int x : 8; } a;
6   struct B { int : 6; int x : 8; } b;
7 };
8 
9 int __attribute__((noipa))
foo(union U * p,union U * q)10 foo (union U *p, union U *q)
11 {
12   p->a.x = 1;
13   q->b.x = 1;
14   return p->a.x;
15 }
16 
17 int
main()18 main()
19 {
20   union U x;
21   if (foo (&x, &x) != x.a.x)
22     __builtin_abort ();
23   return 0;
24 }
25 
26 /* We support arbitrary punning through unions when it happens through
27    the union type and thus p == q is valid here.  */
28