Andrew Pinski <[email protected]> writes:
> On Wed, Oct 8, 2025, 7:44 PM Sam James <[email protected]> wrote:
>
> We didn't explicitly say that type-punning through a union is undefined
> behavior in C++. Mention that, and that we support it as a GNU extension.
>
> This was reported on LLVM's Discourse (forums) [0].
>
> [0] https://discourse.llvm.org/t/ub-when-type-punning-through-unions/88527/6
>
> It also came up to a question to me on
> https://github.com/llvm/llvm-project/issues/162419#issuecomment-3381876892 . I
> didnt get around to answering it yet. And you beat me to adding the
> documentation. Please update the llvm issue pointing
> to this doc change too.
Heh. Done, thanks.
>
> gcc/ChangeLog:
>
> * doc/invoke.texi (-fstrict-aliasing): Explain that type-punning
> through a union in C++ is supported as a GNU extension.
> ---
> OK?
>
> gcc/doc/invoke.texi | 9 +++++----
> 1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index 089328b2e7f1..b438ece40689 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -15048,10 +15048,11 @@ int f() @{
> @end smallexample
> The practice of reading from a different union member than the one most
> 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 works as
> -expected. @xref{Structures unions enumerations and bit-fields
> -implementation}. However, this code might not:
> +@option{-fstrict-aliasing}, type-punning is allowed in C, provided the
> memory
> +is accessed through the union type. In ISO C++, type-punning through a
> union
> +type is undefined behavior, but GCC supports it as an extension. So, the
> code
> +above works as expected. @xref{Structures unions enumerations and
> +bit-fields implementation}. However, this code might not:
> @smallexample
> int f() @{
> union a_union t;
> --
> 2.51.0