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))
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))
19 bar (struct R *p, struct R *q)
20 {
21 p->i = 1;
22 q->j = 0;
23 return p->i;
24 }
25
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 }