On 9/9/25 8:19 AM, Matthias Kretz wrote:
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?
OK (obvious).
--------------- 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" } }