On Fri, 10 Nov 2006, Daniel Berlin wrote: > > > It will load the value from memory, true, but who says that the store to > > > memory will happen before that? The compiler is allowed to reorder the > > > statements since it "knows" that foo and *arg cannot alias. > > > > > > > If the compiler is smart enough to know how to reorder the statements, > > then it should be smart enough to know that reordering will still leave > > foo uninitialized, which is obviously an error. > > It's also undefined, so we can *and will* reorder things involving > uninitialized variables.
> > Any time an > > optimization/reordering visibly changes the results, that reordering is > > broken. > Not in this case. > also Note that gcc *guarantees* the union trick will work, even though > the standard does not. > > > And we already know that gcc is smart enough to recognize > > attempts to use uninitialized variables, so there's no reason for it to > > go there. > We already do, particularly when it comes to constant propagation > > Relying on the idea that "oh, well, this is uninitialized, so the > compiler can't touch it" is going to get you hurt one of these days :) while speaking about uninitialized variables gcc developers probably want to look at their own sources first: gcc/testsuite/gcc.dg/vect/vect-27.c int ia[N]; int ib[N+1]; for (i=0; i < N; i++) { ib[i] = i; } for (i = 1; i <= N; i++) { ia[i-1] = ib[i]; } /* check results: */ for (i = 1; i <= N; i++) { if (ia[i-1] != ib[i]) abort (); } I hope that's not intentional, since higher optimizations in some compilers break this incorrect code already. Alex.