From 7f4cc8140e3eae85e77c755fc14991456649af7e Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 27 Apr 2026 13:30:58 +0200 Subject: [PATCH] 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 struct is_fundamental : public __or_, 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 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 --- libstdc++-v3/include/std/type_traits | 6 +++++- .../testsuite/20_util/is_scalar/reflection.cc | 13 +++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 libstdc++-v3/testsuite/20_util/is_scalar/reflection.cc diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index 59be925e10a..1c03c22e8ee 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -871,7 +871,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template struct is_scalar : public __or_, 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 00000000000..d5ea9a4a520 --- /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 +#include + +void test01() +{ + using std::is_scalar; + using namespace __gnu_test; + + static_assert(test_category(true), ""); +}