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.



>
>
>
> 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
>
>

Reply via email to