On 2015-03-11 17:11:55 +0100, Jakub Jelinek wrote: > On Wed, Mar 11, 2015 at 05:08:16PM +0100, Vincent Lefevre wrote: > > On 2015-03-11 14:27:25 +0100, Robbert Krebbers wrote: > > > But what about "long long" on 32 bits machines. For example: > > > > > > union { > > > long long a; > > > struct { char b1; long long b2; } b; > > > } u; > > > > > > Will GCC perform similar optimizations as for the case of big structs? I > > > tried to play around with long long in Martin's example, but failed to > > > trigger "unexpected" behaviors in GCC. > > > > I've not tried, but how about something like: > > > > struct S { long a, b, c, d; }; > > union U { > > struct S a; > > struct { char b1; struct S b2; } b; > > }; > > u.b.b2 = u.a; > > > > or: u.a = u.b.b2; > > > > IMHO, struct S should be large enough to avoid using registers as > > a temporary area (just in case...). > > There is some PR about it in our bugzilla, and the conclusion is that > it is both invalid
I agree that this is invalid, but Robbert wanted such an example of 6.5.16.1p3 showing that it was indeed undefined behavior. > (in C only one union member can be active at any time, > we as extension allow type punning through unions etc.) I disagree that it is an extension. The standard does not say that "one union member can be active at any time". The interpretation under which this is allowed in confirmed by Note 95 of 6.5.2.3p3. > and we really don't want to support it. -- Vincent Lefèvre <vinc...@vinc17.net> - Web: <https://www.vinc17.net/> 100% accessible validated (X)HTML - Blog: <https://www.vinc17.net/blog/> Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon)