Andrew Haley <aph@xxxxxxxxxx> writes: > 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 IMHO, I believe the standard broken in this regard and therefore GCC is not conformant but for good reason. -- Francis