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 (in C only one union member can be active at any time,
we as extension allow type punning through unions etc.)
and we really don't want to support it.
Jakub