+2008-06-25 Hans-Peter Nilsson <hp@axis.com>
+
+ * doc/invoke.texi (Optimize Options) <fstrict-aliasing>: Add
+ anchor for the type-punning blurb. Cross-reference "Structures
+ unions enumerations and bit-fields implementation". Provide a
+ cast-through-pointer example. Make final sentence self-contained.
+ * doc/implement-c.texi (Structures unions enumerations and
+ bit-fields implementation): Cross-reference the type-punning blurb
+ in the -fstrict-aliasing documentation.
+
2008-06-24 Andrew Pinski <andrew_pinski@playstation.sony.com>
PR middle-end/36594
different type (C90 6.3.2.3).}
The relevant bytes of the representation of the object are treated as
-an object of the type used for the access. This may be a trap
-representation.
+an object of the type used for the access. @xref{Type-punning}. This
+may be a trap representation.
@item
@cite{Whether a ``plain'' @code{int} bit-field is treated as a
@code{void*} or a @code{double}. A character type may alias any other
type.
-Pay special attention to code like this:
+@anchor{Type-punning}Pay special attention to code like this:
@smallexample
union a_union @{
int i;
recently written to (called ``type-punning'') is common. Even with
@option{-fstrict-aliasing}, type-punning is allowed, provided the memory
is accessed through the union type. So, the code above will work as
-expected. However, this code might not:
+expected. @xref{Structures unions enumerations and bit-fields
+implementation}. However, this code might not:
@smallexample
int f() @{
a_union t;
@}
@end smallexample
-Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
+Similarly, access by taking the address, casting the resulting pointer
+and dereferencing the result has undefined behavior, even if the cast
+uses a union type, e.g.:
+@smallexample
+int f() @{
+ double d = 3.0;
+ return ((union a_union *) &d)->i;
+@}
+@end smallexample
+
+The @option{-fstrict-aliasing} option is enabled at levels
+@option{-O2}, @option{-O3}, @option{-Os}.
@item -fstrict-overflow
@opindex fstrict-overflow