From 6ddbbbffbb5759a6c1d56c191364a6bd021f733e Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Tue, 4 Oct 2022 13:00:52 +0100 Subject: [PATCH] libstdc++: Use new built-ins __remove_cv, __remove_reference etc. libstdc++-v3/ChangeLog: * include/std/type_traits (remove_cv): Use __remove_cv built-in. (remove_reference): Use __remove_reference built-in. (remove_cvref): Use __remove_cvref built-in. Remove inheritance for fallback implementation. --- libstdc++-v3/include/std/type_traits | 33 ++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index a015fd95a719..b74565eb521e 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -1507,6 +1507,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { typedef _Tp type; }; /// remove_cv +#if __has_builtin(__remove_cv) + template + struct remove_cv + { using type = __remove_cv(_Tp); }; +#else template struct remove_cv { using type = _Tp; }; @@ -1522,6 +1527,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template struct remove_cv { using type = _Tp; }; +#endif /// add_const template @@ -1570,17 +1576,23 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Reference transformations. /// remove_reference +#if __has_builtin(__remove_reference) template struct remove_reference - { typedef _Tp type; }; + { using type = __remove_reference(_Tp); }; +#else + template + struct remove_reference + { using type = _Tp; }; template struct remove_reference<_Tp&> - { typedef _Tp type; }; + { using type = _Tp; }; template struct remove_reference<_Tp&&> - { typedef _Tp type; }; + { using type = _Tp; }; +#endif /// add_lvalue_reference template @@ -3358,20 +3370,23 @@ template */ #define __cpp_lib_remove_cvref 201711L +#if __has_builtin(__remove_cvref) template struct remove_cvref - : remove_cv<_Tp> - { }; + { using type = __remove_cvref(_Tp); }; +#else + template + struct remove_cvref + { using type = typename remove_cv<_Tp>::type; }; template struct remove_cvref<_Tp&> - : remove_cv<_Tp> - { }; + { using type = typename remove_cv<_Tp>::type; }; template struct remove_cvref<_Tp&&> - : remove_cv<_Tp> - { }; + { using type = typename remove_cv<_Tp>::type; }; +#endif template using remove_cvref_t = typename remove_cvref<_Tp>::type; -- 2.47.2