http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59520
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakub at gcc dot gnu.org --- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> --- > Let me raise another question that is unrelated, but perhaps you folks, in > particular Joseph, could help add some clarify as I have been baffled by a > couple of examples. > > In particular, are the following well-defined according the standard or they > have undefined behavior? AFAIK neither is well-defined according to base standards, in C (and C++?) the only valid accesses to union are to the last stored field, but it is accepted as GNU extension. > Ex 2 > ==== > > int printf (const char *, ...); > > struct S0 > { > char f0; > int f1; > }; > > union > { > int f0; > struct S0 f1; > } d; > > int > main () > { > struct S0 g = {0,0}; > d.f1 = g; > printf ("%d\n", d.f0); This is of course undefined behavior even with the GNU extensions, padding bits in g are undefined and you are then accessing them. It is the same thing as if you did struct S0 g = {0,0}; memcpy (&d.f0, &g, sizeof (int)); printf ("%d\n", d.f0);