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

Reply via email to