1 extern void abort (void);
2 
3 struct S { int i; int j; };
4 struct X { struct S s; int k; };
5 struct Y { int k; struct S s; };
6 union U { struct X x; struct Y y; } __attribute__((may_alias));
7 
8 int __attribute__((noinline))
foo(union U * p,union U * q)9 foo (union U *p, union U *q)
10 {
11   p->x.s.j = 1;
12   q->y.s.i = 0;
13   return p->x.s.j;
14 }
15 
16 struct R { int i; int j; } __attribute__((may_alias));
17 
18 int __attribute__((noinline))
bar(struct R * p,struct R * q)19 bar (struct R *p, struct R *q)
20 {
21   p->i = 1;
22   q->j = 0;
23   return p->i;
24 }
25 
main()26 int main()
27 {
28   int a[3];
29   if (foo ((union U *)&a[0], (union U *)&a[0]) != 0)
30     abort ();
31   if (bar ((struct R *)&a[1], (struct R *)&a[0]) != 0)
32     abort ();
33   return 0;
34 }
35