aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2022-07-19 10:55:52 +0100
committerJonathan Wakely <jwakely@redhat.com>2022-07-19 15:12:27 +0100
commit465802c0d40adca5fd5b0a2af6ff8a323a55b589 (patch)
tree84201afac23508847598e7bd7815f187543914a2
parent4a8aab9a23550dbf53d4640fef57c0bd6f6b0129 (diff)
downloadgcc-465802c0d40adca5fd5b0a2af6ff8a323a55b589.zip
gcc-465802c0d40adca5fd5b0a2af6ff8a323a55b589.tar.gz
gcc-465802c0d40adca5fd5b0a2af6ff8a323a55b589.tar.bz2
c++: Enable __has_builtin for new reference binding built-ins
The new built-ins need to be detectable using __has_builtin, and the library should use that to check for them. This fixes an error with Clang when C++23 is enabled. gcc/cp/ChangeLog: * cp-objcp-common.cc (names_builtin_p): Return true for RID_REF_CONSTRUCTS_FROM_TEMPORARY and RID_REF_CONVERTS_FROM_TEMPORARY. libstdc++-v3/ChangeLog: * include/std/type_traits (__cpp_lib_reference_from_temporary) (reference_constructs_from_temporary) (reference_converts_from_temporary): Only define when the built-ins are available.
-rw-r--r--gcc/cp/cp-objcp-common.cc2
-rw-r--r--libstdc++-v3/include/std/type_traits4
2 files changed, 6 insertions, 0 deletions
diff --git a/gcc/cp/cp-objcp-common.cc b/gcc/cp/cp-objcp-common.cc
index 0b70d55..4079a4b 100644
--- a/gcc/cp/cp-objcp-common.cc
+++ b/gcc/cp/cp-objcp-common.cc
@@ -461,6 +461,8 @@ names_builtin_p (const char *name)
case RID_IS_ASSIGNABLE:
case RID_IS_CONSTRUCTIBLE:
case RID_UNDERLYING_TYPE:
+ case RID_REF_CONSTRUCTS_FROM_TEMPORARY:
+ case RID_REF_CONVERTS_FROM_TEMPORARY:
return true;
default:
break;
diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits
index b1a1dee..14b029c 100644
--- a/libstdc++-v3/include/std/type_traits
+++ b/libstdc++-v3/include/std/type_traits
@@ -3505,6 +3505,9 @@ template<typename _Ret, typename _Fn, typename... _Args>
template<typename _Tp>
inline constexpr bool is_scoped_enum_v = is_scoped_enum<_Tp>::value;
+#if __has_builtin(__reference_constructs_from_temporary) \
+ && __has_builtin(__reference_converts_from_temporary)
+
#define __cpp_lib_reference_from_temporary 202202L
/// True if _Tp is a reference type, a _Up value can be bound to _Tp in
@@ -3544,6 +3547,7 @@ template<typename _Ret, typename _Fn, typename... _Args>
template<typename _Tp, typename _Up>
inline constexpr bool reference_converts_from_temporary_v
= reference_converts_from_temporary<_Tp, _Up>::value;
+#endif // __has_builtin for reference_from_temporary
#endif // C++23
#if _GLIBCXX_HAVE_IS_CONSTANT_EVALUATED