https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70166
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |RESOLVED Resolution|--- |INVALID --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- You are not accessing through the union type but through a pointer to double and int because u.a and p->d decay to a pointer: *(int *) &u.a = 1; *(double *) &p->d = 0.0; if (*(int *) &u.a != 0) { abort ();