[gcc r16-8831] libstdc++: Fix up std::is_scalar for std::meta::info [PR125024]

Jakub Jelinek jakub@gcc.gnu.org
Thu Apr 30 11:10:18 GMT 2026


https://gcc.gnu.org/g:237521ba8af2fcd69ad87d721d731996a09fca03

commit r16-8831-g237521ba8af2fcd69ad87d721d731996a09fca03
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Mon Apr 27 13:30:58 2026 +0200

    libstdc++: Fix up std::is_scalar for std::meta::info [PR125024]
    
    https://eel.is/c++draft/basic.types.general#9.sentence-1 says that
    std::meta::info and its cv-qualified versions are scalar types too
    (and in https://eel.is/c++draft/basic.fundamental#19.sentence-1
    that they are fundamental types too).
    Now, on the reflection side, eval_is_scalar_type is handled
    in the compiler and uses SCALAR_TYPE_P (type) which includes
    REFLECTION_TYPE_P check and eval_is_fundamental_type includes that
    explicitly too.
    std::is_fundamental uses
       template<typename _Tp>
         struct is_fundamental
         : public __or_<is_arithmetic<_Tp>, is_void<_Tp>,
                        is_null_pointer<_Tp>
     #if __cpp_impl_reflection >= 202506L
                        , is_reflection<_Tp>
     #endif
                        >::type
         { };
    but for std::is_scalar we apparently forgot to include is_reflection.
    
    The following patch fixes that.
    
    2026-04-26  Jakub Jelinek  <jakub@redhat.com>
    
            PR libstdc++/125024
            * include/std/type_traits (std::is_scalar): For
            __cpp_impl_reflection >= 202506L handle is_reflection types as
            scalar.
            * testsuite/20_util/is_scalar/reflection.cc: New test.
    
    Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
    (cherry picked from commit 7f4cc8140e3eae85e77c755fc14991456649af7e)

Diff:
---
 libstdc++-v3/include/std/type_traits                   |  6 +++++-
 libstdc++-v3/testsuite/20_util/is_scalar/reflection.cc | 13 +++++++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits
index 59be925e10a6..1c03c22e8eed 100644
--- a/libstdc++-v3/include/std/type_traits
+++ b/libstdc++-v3/include/std/type_traits
@@ -871,7 +871,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   template<typename _Tp>
     struct is_scalar
     : public __or_<is_arithmetic<_Tp>, is_enum<_Tp>, is_pointer<_Tp>,
-                   is_member_pointer<_Tp>, is_null_pointer<_Tp>>::type
+                   is_member_pointer<_Tp>, is_null_pointer<_Tp>
+#if __cpp_impl_reflection >= 202506L
+		   , is_reflection<_Tp>
+#endif
+		   >::type
     { };
 
   /// is_compound
diff --git a/libstdc++-v3/testsuite/20_util/is_scalar/reflection.cc b/libstdc++-v3/testsuite/20_util/is_scalar/reflection.cc
new file mode 100644
index 000000000000..d5ea9a4a5200
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/is_scalar/reflection.cc
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++26 } }
+// { dg-additional-options "-freflection" }
+
+#include <type_traits>
+#include <testsuite_tr1.h>
+
+void test01()
+{
+  using std::is_scalar;
+  using namespace __gnu_test;
+
+  static_assert(test_category<is_scalar, decltype (^^::)>(true), "");
+}


More information about the Libstdc++-cvs mailing list