Oh great, while replacing the '*' I messed up the indent. It's now using spaces where it should use a Tab. OK for trunk like this?
--------------- 8< -------------- Signed-off-by: Matthias Kretz <m.kr...@gsi.de> gcc/cp/ChangeLog: * mangle.cc (write_real_cst): Replace 8 spaces with Tab. --- gcc/cp/mangle.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcc/cp/mangle.cc b/gcc/cp/mangle.cc index c1aae2de52b..a0a75479666 100644 --- a/gcc/cp/mangle.cc +++ b/gcc/cp/mangle.cc @@ -2185,7 +2185,7 @@ write_real_cst (const tree value) if (words == 0) { /* _Float16 and std::bfloat16_t are the only supported types smaller than - 32 bits. */ + 32 bits. */ gcc_assert (bits == 16); sprintf (buffer, "%04lx", (unsigned long) target_real[0]); write_chars (buffer, 4); Matthias Kretz [Tuesday, 9 September 2025, 08:01:22 CEST]: > Pushed to trunk with fixed commit message (PR was missing) and one '*' > removed from comment. > > Will backport later. > > Matthias Kretz [Monday, 8 September 2025, 12:51:13 CEST]: > > * renamed the test to abi/pr121801.C > > > > * changed the comment to include std::bfloat16_t and another space. > > > > ----------------- 8< --------------- > > > > Signed-off-by: Matthias Kretz <m.kr...@gsi.de> > > > > gcc/testsuite/ChangeLog: > > * g++.dg/abi/pr121801.C: New test. > > > > gcc/cp/ChangeLog: > > * mangle.cc (write_real_cst): Handle 16-bit real and assert > > that reals have 16 bits or a multiple of 32 bits. > > > > --- > > > > gcc/cp/mangle.cc | 15 ++++++++++++++- > > gcc/testsuite/g++.dg/abi/pr121801.C | 13 +++++++++++++ > > 2 files changed, 27 insertions(+), 1 deletion(-) > > create mode 100644 gcc/testsuite/g++.dg/abi/pr121801.C > > > > diff --git a/gcc/cp/mangle.cc b/gcc/cp/mangle.cc > > index 80be40d2dce..2c7a92ac1c4 100644 > > --- a/gcc/cp/mangle.cc > > +++ b/gcc/cp/mangle.cc > > @@ -2176,11 +2176,24 @@ write_real_cst (const tree value) > > > > int i, limit, dir; > > > > tree type = TREE_TYPE (value); > > > > - int words = GET_MODE_BITSIZE (SCALAR_FLOAT_TYPE_MODE (type)) / 32; > > + int bits = GET_MODE_BITSIZE (SCALAR_FLOAT_TYPE_MODE (type)); > > + int words = bits / 32; > > > > real_to_target (target_real, &TREE_REAL_CST (value), > > > > TYPE_MODE (type)); > > > > + if (words == 0) > > + { > > + /* _Float16 and std::bfloat16_t are the only supported types > > smaller > > than > > + * 32 bits. */ > > + gcc_assert (bits == 16); > > + sprintf (buffer, "%04lx", (unsigned long) target_real[0]); > > + write_chars (buffer, 4); > > + return; > > + } > > + > > + gcc_assert (bits % 32 == 0); > > + > > > > /* The value in target_real is in the target word order, > > > > so we must write it out backward if that happens to be > > little-endian. write_number cannot be used, it will > > > > diff --git a/gcc/testsuite/g++.dg/abi/pr121801.C > > b/gcc/testsuite/g++.dg/abi/ pr121801.C > > new file mode 100644 > > index 00000000000..cd35186d888 > > --- /dev/null > > +++ b/gcc/testsuite/g++.dg/abi/pr121801.C > > @@ -0,0 +1,13 @@ > > +// PR c++/121801 > > +// { dg-do compile { target { c++20 && float16 } } } > > +// { dg-add-options float16 } > > + > > +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" } } -- ────────────────────────────────────────────────────────────────────────── Dr. Matthias Kretz https://mattkretz.github.io GSI Helmholtz Center for Heavy Ion Research https://gsi.de std::simd ──────────────────────────────────────────────────────────────────────────