diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2022-10-04 13:00:52 +0100 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2022-10-04 17:42:59 +0100 |
commit | 6ddbbbffbb5759a6c1d56c191364a6bd021f733e (patch) | |
tree | e6feef8ceba7d62a9a38d24a060667fba47ba66c | |
parent | 68ed966793526db02fe96605ba9c0f8bbfd59ef0 (diff) | |
download | gcc-6ddbbbffbb5759a6c1d56c191364a6bd021f733e.zip gcc-6ddbbbffbb5759a6c1d56c191364a6bd021f733e.tar.gz gcc-6ddbbbffbb5759a6c1d56c191364a6bd021f733e.tar.bz2 |
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.
-rw-r--r-- | libstdc++-v3/include/std/type_traits | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index a015fd9..b74565e 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<typename _Tp> + struct remove_cv + { using type = __remove_cv(_Tp); }; +#else template<typename _Tp> struct remove_cv { using type = _Tp; }; @@ -1522,6 +1527,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct remove_cv<const volatile _Tp> { using type = _Tp; }; +#endif /// add_const template<typename _Tp> @@ -1570,17 +1576,23 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Reference transformations. /// remove_reference +#if __has_builtin(__remove_reference) template<typename _Tp> struct remove_reference - { typedef _Tp type; }; + { using type = __remove_reference(_Tp); }; +#else + template<typename _Tp> + struct remove_reference + { using type = _Tp; }; template<typename _Tp> struct remove_reference<_Tp&> - { typedef _Tp type; }; + { using type = _Tp; }; template<typename _Tp> struct remove_reference<_Tp&&> - { typedef _Tp type; }; + { using type = _Tp; }; +#endif /// add_lvalue_reference template<typename _Tp> @@ -3358,20 +3370,23 @@ template<typename _Ret, typename _Fn, typename... _Args> */ #define __cpp_lib_remove_cvref 201711L +#if __has_builtin(__remove_cvref) template<typename _Tp> struct remove_cvref - : remove_cv<_Tp> - { }; + { using type = __remove_cvref(_Tp); }; +#else + template<typename _Tp> + struct remove_cvref + { using type = typename remove_cv<_Tp>::type; }; template<typename _Tp> struct remove_cvref<_Tp&> - : remove_cv<_Tp> - { }; + { using type = typename remove_cv<_Tp>::type; }; template<typename _Tp> struct remove_cvref<_Tp&&> - : remove_cv<_Tp> - { }; + { using type = typename remove_cv<_Tp>::type; }; +#endif template<typename _Tp> using remove_cvref_t = typename remove_cvref<_Tp>::type; |