On 11/12/2010 07:45 PM, Francis Moreau wrote: > "Segher Boessenkool" <segher@xxxxxxxxxxxxxxxxxxx> writes: > >>> But you finally said >>> >>> - you can not access it as int: >>> >>> that object (t.i) does not have a stored value therefore it >>> doesn't exist. >> >> (Your words, not mine -- and such sloppy wording gets you into trouble, >> the standard does not talk about any of this. It is one way of looking >> at it though). > > So what did you mean by this ? > > > could you tell me what the effective type of 't.i' object ? > > int, if you can say that object exists at all: it does not have a stored > value. The stored value of t is a double with value 3.0 . You can > take its address and access it via that as "double" (or "char"), or you > can access it as the union it is. You can not access it as "int". > >>> This is what I understood from what you said, please correct me if I'm >>> wrong. >>> >>> However doing: >>> >>> int i = t.i; >>> >>> is defined in C (as long as there's no trap representation) even if 't.i' >>> object has no stored value. >> >> Actually, I think this is a GCC extension, and I was mistaken to say it >> is valid C99 before. Standard C allows you to read from t.d or t, but not >> t.i, after storing into t.d . > > No. > > t.d = 3.0; > i = t.i; > > is well defined in C. > > Again, what's ambiguous is the example given by the GCC man: > > int *ip; > t.d = 3.0; > ip = &t.i; > return *ip; > > which produces code that might or not work. > > 6.5p7 lists this as a possible alias case and I can't find any rule in > the standard that could invalidate it. > > So either GCC is not conformant in this regard or I'm missing something. It's worth looking at http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_236.htm Andrew.