> > Bootstrapped/regtested x86_64-linux, OK? > > OK and thanks for the elaborate write-up and comments in the code ;)
Unforutnately our discussion on IRC let me construct another wrong code testcase based on mixing up base alias sets union U { long long i; long f; }; struct a {union U u;}; struct aa {struct a a;}; struct b {union U u;}; struct bb {struct b b;}; long foo (struct bb *bv, void *ptr) { struct aa *a = ptr; struct bb *b = ptr; bv->b.u.f = 1; a->a.u.i = 0; b->b.u.f = 0; return bv->b.u.f; } int main () { union C {struct aa aa; struct bb bb;} v; if (foo (&v.bb, &v) != 0) __builtin_abort (); return 0; } I think there is no undefined behaviour here (at least if we assume that first store to v.aa changes the type inmplied by earlier store to v.bb. Honza