https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79671
--- Comment #41 from Jason Merrill <jason at gcc dot gnu.org> --- (In reply to Richard Biener from comment #38) > Simplified testcase for discussion (is not "miscompiled"): > > struct S { > union { int i; } u; > }; > > int main() > { > S s; > new (&s.u.i) float (2.0); > S q = s; > if (*reinterpret_cast<float *>(&q.u.i) != 2.0) > abort (); > } > > so you say q = s is valid because the object representation of the union > is copied. I say after storing 2.0 to s.u.i the access 's' in q = s is > invalid as you are accessing the stored value (a float) via a glvalue of > inappropriate type. I say what's wrong with this testcase is that storing a float in an int field is undefined.