Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?

-- >8 --
[bit.cast]/2: Mandates: Neither To nor From are consteval-only types

but we are not checking this, so the attached test compiled.

        PR libstdc++/124096

libstdc++-v3/ChangeLog:

        * include/std/bit: Check that neither To nor From are consteval-only
        types.
        * testsuite/26_numerics/bit/bit.cast/124096.cc: New test.
---
 libstdc++-v3/include/std/bit                        |  4 ++++
 .../testsuite/26_numerics/bit/bit.cast/124096.cc    | 13 +++++++++++++
 2 files changed, 17 insertions(+)
 create mode 100644 libstdc++-v3/testsuite/26_numerics/bit/bit.cast/124096.cc

diff --git a/libstdc++-v3/include/std/bit b/libstdc++-v3/include/std/bit
index 6ea0f6eef83..f33acb999cf 100644
--- a/libstdc++-v3/include/std/bit
+++ b/libstdc++-v3/include/std/bit
@@ -93,6 +93,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       && is_trivially_copyable_v<_To> && is_trivially_copyable_v<_From>
 #endif
     {
+#if __cpp_impl_reflection >= 202506L
+      static_assert(!is_consteval_only_v<_To> && !is_consteval_only_v<_From>,
+                   "neither To nor From can be consteval-only types");
+#endif
       return __builtin_bit_cast(_To, __from);
     }
 #endif // __cpp_lib_bit_cast
diff --git a/libstdc++-v3/testsuite/26_numerics/bit/bit.cast/124096.cc 
b/libstdc++-v3/testsuite/26_numerics/bit/bit.cast/124096.cc
new file mode 100644
index 00000000000..12c93f712df
--- /dev/null
+++ b/libstdc++-v3/testsuite/26_numerics/bit/bit.cast/124096.cc
@@ -0,0 +1,13 @@
+// PR libstdc++/124096
+// { dg-do compile { target c++26 } }
+// { dg-additional-options "-freflection" }
+
+#include <bit>
+
+consteval void
+f ()
+{
+  (void) std::bit_cast<long long>(^^int);  // { dg-error "here" }
+}
+
+// { dg-error "static assertion failed:" "" { target *-*-* } 0 }

base-commit: 8a794643cc71301d96bb0e62c8d89494929fa0eb
-- 
2.53.0

Reply via email to