On 04/07/17 08:47, Richard Biener wrote: > On Thu, 6 Apr 2017, Bernd Edlinger wrote: > >> On 04/06/17 21:05, Florian Weimer wrote: >>> On 04/06/2017 08:49 PM, Bernd Edlinger wrote: >>> >>>> For instance how do you "declare an object without a declared type"? >>> >>> malloc and other allocation functions return pointers to objects without >>> a declared type. >>> >> >> Thanks Florian, >> >> this discussion is very helpful. >> >> How about this for the documentation: >> >> @item typeless_storage >> @cindex @code{typeless_storage} type attribute >> In the context of section 6.5 paragraph 6 of the C11 standard, >> an object of this type behaves as if it has no declared type. >> In the context of section 6.5 paragraph 7 of the C11 standard, >> an object or a pointer if this type behaves as if it were a >> character type. >> This is attribute is similar to the @code{may_alias} attribute, >> except that it is not restricted to pointers. >> >> Example of use: >> >> @smallexample >> typedef int __attribute__((__typeless_storage__)) int_a; >> >> int >> main (void) >> @{ >> int_a a = 0x12345678; >> short *b = (short *) &a; >> >> b[1] = 0; >> >> if (a == 0x12345678) >> abort(); >> >> exit(0); >> @} >> @end smallexample > > Seriously, do not suggest such broken case. There's a union to > do this example portably. >
Well, it is just a mod of the other example above in the documentation of may_alias: typedef short __attribute__((__may_alias__)) short_a; int main (void) @{ int a = 0x12345678; short_a *b = (short_a *) &a; b[1] = 0; if (a == 0x12345678) abort(); exit(0); @} @end smallexample I just moved the attribute from "b" to "a", and that is what the C++ people want to do as well, just they call it a "class int_a { std::byte x[4]; }". I personally like to have the symmetry between the two concepts here, because it helps to understand the differences. Bernd. > Richard. >