[gcc r16-5920] libstdc++: Consolidate bullet 1 __common_reference_impl partial specs
Patrick Palka
ppalka@gcc.gnu.org
Fri Dec 5 18:44:41 GMT 2025
https://gcc.gnu.org/g:cbdbbdd1fccfd789e6fbcb37b1b602bb7482de4b
commit r16-5920-gcbdbbdd1fccfd789e6fbcb37b1b602bb7482de4b
Author: Patrick Palka <ppalka@redhat.com>
Date: Fri Dec 5 13:43:26 2025 -0500
libstdc++: Consolidate bullet 1 __common_reference_impl partial specs
... and in passing use requires-clauses instead of void_t based SFINAE.
This is a non-functional change that'll simplify implementing the
P2655R3 change to common_reference.
PR c++/120446
libstdc++-v3/ChangeLog:
* include/std/type_traits (__common_reference_impl): Rewrite
partial specializations to use requires-clause instead of
an additional void_t template parameter. Consolidate the
partial specializations corresponding to bullet 1.
Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
Diff:
---
libstdc++-v3/include/std/type_traits | 40 ++++++++++++------------------------
1 file changed, 13 insertions(+), 27 deletions(-)
diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits
index 5c09fac86629..418e21877797 100644
--- a/libstdc++-v3/include/std/type_traits
+++ b/libstdc++-v3/include/std/type_traits
@@ -4225,7 +4225,7 @@ template<typename _Ret, typename _Fn, typename... _Args>
{ using type = _Tp0; };
/// @cond undocumented
- template<typename _Tp1, typename _Tp2, int _Bullet = 1, typename = void>
+ template<typename _Tp1, typename _Tp2, int _Bullet = 1>
struct __common_reference_impl
: __common_reference_impl<_Tp1, _Tp2, _Bullet + 1>
{ };
@@ -4238,46 +4238,32 @@ template<typename _Ret, typename _Fn, typename... _Args>
// If T1 and T2 are reference types and COMMON-REF(T1, T2) is well-formed, ...
template<typename _Tp1, typename _Tp2>
- struct __common_reference_impl<_Tp1&, _Tp2&, 1,
- void_t<__common_ref<_Tp1&, _Tp2&>>>
- { using type = __common_ref<_Tp1&, _Tp2&>; };
-
- template<typename _Tp1, typename _Tp2>
- struct __common_reference_impl<_Tp1&&, _Tp2&&, 1,
- void_t<__common_ref<_Tp1&&, _Tp2&&>>>
- { using type = __common_ref<_Tp1&&, _Tp2&&>; };
-
- template<typename _Tp1, typename _Tp2>
- struct __common_reference_impl<_Tp1&, _Tp2&&, 1,
- void_t<__common_ref<_Tp1&, _Tp2&&>>>
- { using type = __common_ref<_Tp1&, _Tp2&&>; };
-
- template<typename _Tp1, typename _Tp2>
- struct __common_reference_impl<_Tp1&&, _Tp2&, 1,
- void_t<__common_ref<_Tp1&&, _Tp2&>>>
- { using type = __common_ref<_Tp1&&, _Tp2&>; };
+ requires is_reference_v<_Tp1> && is_reference_v<_Tp2>
+ && requires { typename __common_ref<_Tp1, _Tp2>; }
+ struct __common_reference_impl<_Tp1, _Tp2, 1>
+ { using type = __common_ref<_Tp1, _Tp2>; };
// Otherwise, if basic_common_reference<...>::type is well-formed, ...
template<typename _Tp1, typename _Tp2>
- struct __common_reference_impl<_Tp1, _Tp2, 2,
- void_t<__basic_common_ref<_Tp1, _Tp2>>>
+ requires requires { typename __basic_common_ref<_Tp1, _Tp2>; }
+ struct __common_reference_impl<_Tp1, _Tp2, 2>
{ using type = __basic_common_ref<_Tp1, _Tp2>; };
// Otherwise, if COND-RES(T1, T2) is well-formed, ...
template<typename _Tp1, typename _Tp2>
- struct __common_reference_impl<_Tp1, _Tp2, 3,
- void_t<__cond_res<_Tp1, _Tp2>>>
+ requires requires { typename __cond_res<_Tp1, _Tp2>; }
+ struct __common_reference_impl<_Tp1, _Tp2, 3>
{ using type = __cond_res<_Tp1, _Tp2>; };
// Otherwise, if common_type_t<T1, T2> is well-formed, ...
template<typename _Tp1, typename _Tp2>
- struct __common_reference_impl<_Tp1, _Tp2, 4,
- void_t<common_type_t<_Tp1, _Tp2>>>
+ requires requires { typename common_type_t<_Tp1, _Tp2>; }
+ struct __common_reference_impl<_Tp1, _Tp2, 4>
{ using type = common_type_t<_Tp1, _Tp2>; };
// Otherwise, there shall be no member type.
template<typename _Tp1, typename _Tp2>
- struct __common_reference_impl<_Tp1, _Tp2, 5, void>
+ struct __common_reference_impl<_Tp1, _Tp2, 5>
{ };
// Otherwise, if sizeof...(T) is greater than two, ...
@@ -4296,7 +4282,7 @@ template<typename _Ret, typename _Fn, typename... _Args>
{ };
/// @endcond
-#endif // C++2a
+#endif // C++20
#if __cplusplus >= 201103L
// Stores a tuple of indices. Used by tuple and pair, and by bind() to
More information about the Libstdc++-cvs
mailing list