On Fri, Sep 5, 2025 at 4:06 AM Matthias Kretz <[email protected]> wrote:
>
> Okay for trunk? What about backports?
>
> (Also as PR at https://forge.sourceware.org/gcc/gcc-TEST/pulls/72)
>
> ------------------- 8< ----------------------
>
> Signed-off-by: Matthias Kretz <[email protected]>
>
> gcc/testsuite/ChangeLog:
>
>         * g++.dg/pr121801_float16_cst_mangling.C: New test.
>
> gcc/cp/ChangeLog:
>
>         * mangle.cc (write_real_cst): Handle reals that are smaller than
>         32 bits.
> ---
>  gcc/cp/mangle.cc                                    | 13 +++++++++++++
>  .../g++.dg/pr121801_float16_cst_mangling.C          | 12 ++++++++++++
>  2 files changed, 25 insertions(+)
>  create mode 100644 gcc/testsuite/g++.dg/pr121801_float16_cst_mangling.C
>
> diff --git a/gcc/cp/mangle.cc b/gcc/cp/mangle.cc
> index 80be40d2dce..3bc2ad2905a 100644
> --- a/gcc/cp/mangle.cc
> +++ b/gcc/cp/mangle.cc
> @@ -2178,6 +2178,19 @@ write_real_cst (const tree value)
>    tree type = TREE_TYPE (value);
>    int words = GET_MODE_BITSIZE (SCALAR_FLOAT_TYPE_MODE (type)) / 32;
>
> +  if (words == 0)
> +    {
> +      int bytes = GET_MODE_BITSIZE (SCALAR_FLOAT_TYPE_MODE (type)) / 8;
> +      real_to_target (target_real, &TREE_REAL_CST (value),
> +                     TYPE_MODE (type));
> +      sprintf (buffer, "%04lx", (unsigned long) target_real[0]);
> +      if (bytes == 2)
> +       write_chars (buffer, 4);
> +      else
> +       write_chars (buffer + 2, 2);
> +      return;
> +    }
> +
>    real_to_target (target_real, &TREE_REAL_CST (value),
>                   TYPE_MODE (type));
>
> diff --git a/gcc/testsuite/g++.dg/pr121801_float16_cst_mangling.C b/gcc/
> testsuite/g++.dg/pr121801_float16_cst_mangling.C
> new file mode 100644
> index 00000000000..030822ff1c8
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/pr121801_float16_cst_mangling.C
> @@ -0,0 +1,12 @@
> +// PR c++/121801
> +// { dg-do compile { target c++20 } }

Since you are using _Float16 and not  all target supports _Float16,
this should also use float16 as the target marker so:
// { dg-do compile { target {c++20 && float16 }  } }

Thanks,
Andrew Pinski

> +
> +template<_Float16 T> void f() {}
> +
> +void uses() {
> +  f<_Float16(1)>();
> +  f<_Float16(2)>();
> +}
> +
> +// { dg-final { scan-assembler "_Z1fILDF16_3c00EEvv" } }
> +// { dg-final { scan-assembler "_Z1fILDF16_4000EEvv" } }
>
>

Reply via email to