Alexandre Oliva <[EMAIL PROTECTED]> writes: | On Jan 26, 2006, Gabriel Dos Reis <[EMAIL PROTECTED]> wrote: | | > I don't see anything in the ISO C standard that implies that. | | > This | | > x.v1 = 384; | > x.v2 = 94.08; | > int v = x.v2; | > x.v1 = v; | | > is valid fragment. | | But can you see anything in it that makes it undefined?
Excessive snippage is a perilious excercise. In this specific case, your leaving out the context misled you. I was specifically replying to Michael Veksler's assertion: # So, is union is a very useful feature in ISO C, without # gcc's extension? It seems that the only legal use of union # is to use the same type through the whole life of the object. # # Here is the rationale: # # Quoting Richard Guenther <[EMAIL PROTECTED]>: # > On 1/25/06, Alexandre Oliva <[EMAIL PROTECTED]> wrote: # > > On Jan 22, 2006, Richard Guenther <[EMAIL PROTECTED]> wrote: # > > # [...] # > > # > > > int ii; double dd; void foo (int *ip, double *dp) { # > > > *ip = 15; ii = *ip; *dp = 1.5; dd = *dp; } # > > > void test (void) { union { int i; double d; } u; # > > > foo (&u.i, &u.d); } # > > # > > So it is perfectly valid, but if GCC reorders the read from *ip past # > > the store to *dp, it turns the valid program into one that misbehaves. # > # > *ip = 15; ii = *ip; *dp = 1.5; dd = *dp; # > Here ^^^ # > you are accessing memory of type integer as type double. And gcc will # > happily reorder the read from *ip with the store to *dp based on TBAA # > unless it inlines the function and applies the "special" gcc rules about # > unions. # > So this example is invalid, too. # # So in theory, if there is a union of two non-char types: # union { T1 v1, T2 v2} x; # it is illegal to access both x.v1 and x.v2 for the same variable x # anywhere in the whole program. which I happen not to find any support for in the C standard. | Failing that, regular assignment and access rules apply, and so it is | valid. I could not agree more; and in fact, that was my point. -- Gaby