]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Define std::remove_cvref and std::remove_cvref_t for C++2a
authorredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 May 2018 12:40:10 +0000 (12:40 +0000)
committerredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 May 2018 12:40:10 +0000 (12:40 +0000)
Also define __remove_cvref_t for internal use before C++2a.

* include/std/any (any_cast): Use __remove_cvref_t.
* include/std/tuple (__make_tuple): Likewise.
* include/std/type_traits (__remove_cvref_t): Define.
(__result_of_memobj, __result_of_memfun): Use __remove_cvref_t.
[__cplusplus > 201703L] (remove_cvref, remove_cvref_t): Define.
* include/std/variant (__erased_hash): Use __remove_cvref_t.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@259887 138bc75d-0d04-0410-961f-82ee72b054a4

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/any
libstdc++-v3/include/std/tuple
libstdc++-v3/include/std/type_traits
libstdc++-v3/include/std/variant

index 69a9eeba469445414aae6a1521ad8662e2538edd..692a46869fc24b39f2d81ea2b1ebe45dc9c5193d 100644 (file)
@@ -1,3 +1,12 @@
+2018-05-03  Jonathan Wakely  <jwakely@redhat.com>
+
+       * include/std/any (any_cast): Use __remove_cvref_t.
+       * include/std/tuple (__make_tuple): Likewise.
+       * include/std/type_traits (__remove_cvref_t): Define.
+       (__result_of_memobj, __result_of_memfun): Use __remove_cvref_t.
+       [__cplusplus > 201703L] (remove_cvref, remove_cvref_t): Define.
+       * include/std/variant (__erased_hash): Use __remove_cvref_t.
+
 2018-05-02  François Dumont  <fdumont@gcc.gnu.org>
 
        * include/bits/deque.tcc (deque<>::_M_assign_aux): Cast to void to
index a37eb38d665ddd7463fd50fb3ee47af2336e151f..11b59d6d575f29e0191dcad502294cf39eb898a8 100644 (file)
@@ -451,7 +451,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   template<typename _ValueType>
     inline _ValueType any_cast(const any& __any)
     {
-      using _Up = remove_cv_t<remove_reference_t<_ValueType>>;
+      using _Up = __remove_cvref_t<_ValueType>;
       static_assert(any::__is_valid_cast<_ValueType>(),
          "Template argument must be a reference or CopyConstructible type");
       static_assert(is_constructible_v<_ValueType, const _Up&>,
@@ -477,7 +477,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   template<typename _ValueType>
     inline _ValueType any_cast(any& __any)
     {
-      using _Up = remove_cv_t<remove_reference_t<_ValueType>>;
+      using _Up = __remove_cvref_t<_ValueType>;
       static_assert(any::__is_valid_cast<_ValueType>(),
          "Template argument must be a reference or CopyConstructible type");
       static_assert(is_constructible_v<_ValueType, _Up&>,
@@ -491,7 +491,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   template<typename _ValueType>
     inline _ValueType any_cast(any&& __any)
     {
-      using _Up = remove_cv_t<remove_reference_t<_ValueType>>;
+      using _Up = __remove_cvref_t<_ValueType>;
       static_assert(any::__is_valid_cast<_ValueType>(),
          "Template argument must be a reference or CopyConstructible type");
       static_assert(is_constructible_v<_ValueType, _Up>,
index 1d0074129b1101fa6ed85deb92b2da7b1a0d5eb0..16f69220abbed7fa78c5513c400c435a12e9efd3 100644 (file)
@@ -1499,8 +1499,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   // Returns the std::tuple equivalent of a tuple-like type.
   template<typename _Tuple>
     struct __make_tuple
-    : public __do_make_tuple<typename std::remove_cv
-            <typename std::remove_reference<_Tuple>::type>::type>
+    : public __do_make_tuple<__remove_cvref_t<_Tuple>>
     { };
 
   // Combines several std::tuple's into a single one.
index 711d6c50dd141ff3fb332ea88f5ce6f83958ada7..7c0ba727511055d248431645e476da3ac0d5c4fd 100644 (file)
@@ -2092,6 +2092,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       return __declval<_Tp>(0);
     }
 
+  // __remove_cvref_t (std::remove_cvref_t for C++11).
+  template<typename _Tp>
+    using __remove_cvref_t
+     = typename remove_cv<typename remove_reference<_Tp>::type>::type;
+
   /// result_of
   template<typename _Signature>
     class result_of;
@@ -2193,8 +2198,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   template<typename _Res, typename _Class, typename _Arg>
     struct __result_of_memobj<_Res _Class::*, _Arg>
     {
-      typedef typename remove_cv<typename remove_reference<
-        _Arg>::type>::type _Argval;
+      typedef __remove_cvref_t<_Arg> _Argval;
       typedef _Res _Class::* _MemPtr;
       typedef typename conditional<__or_<is_same<_Argval, _Class>,
         is_base_of<_Class, _Argval>>::value,
@@ -2209,8 +2213,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   template<typename _Res, typename _Class, typename _Arg, typename... _Args>
     struct __result_of_memfun<_Res _Class::*, _Arg, _Args...>
     {
-      typedef typename remove_cv<typename remove_reference<
-        _Arg>::type>::type _Argval;
+      typedef __remove_cvref_t<_Arg> _Argval;
       typedef _Res _Class::* _MemPtr;
       typedef typename conditional<__or_<is_same<_Argval, _Class>,
         is_base_of<_Class, _Argval>>::value,
@@ -2399,8 +2402,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   // Internal type trait that allows us to sfinae-protect tuple_cat.
   template<typename _Tp>
     struct __is_tuple_like
-    : public __is_tuple_like_impl<typename remove_cv<
-      typename remove_reference<_Tp>::type>::type>::type
+    : public __is_tuple_like_impl<__remove_cvref_t<_Tp>>::type
     { };
 
   template<typename _Tp>
@@ -2942,6 +2944,17 @@ template <typename _From, typename _To>
     big    = __ORDER_BIG_ENDIAN__,
     native = __BYTE_ORDER__
   };
+
+  /// Remove references and cv-qualifiers.
+  template<typename _Tp>
+    struct remove_cvref
+    {
+      using type = __remove_cvref_t<_Tp>;
+    };
+
+  template<typename _Tp>
+    using remove_cvref_t = __remove_cvref_t<_Tp>;
+
 #endif // C++2a
 
 _GLIBCXX_END_NAMESPACE_VERSION
index 48bec5284060e8243d675071bab0894a5964996c..f64c037a51406b050d2c339e7bc94399d64f9a8d 100644 (file)
@@ -289,7 +289,7 @@ namespace __variant
     size_t
     __erased_hash(void* __t)
     {
-      return std::hash<remove_cv_t<remove_reference_t<_Tp>>>{}(
+      return std::hash<__remove_cvref_t<_Tp>>{}(
          __variant::__ref_cast<_Tp>(__t));
     }