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