/* struct X is complete in this TU, this causes us to not merge Y and thus assign different alias-sets to them. */ struct X { int i; }; struct Y { struct X *p; int i; }; extern void abort (void); extern void foo(struct Y *); int __attribute__((noinline)) bar(struct Y *p) { p->i = 0; foo (p); return p->i; } int main() { struct Y y; if (bar (&y) != 1) abort (); return 0; }