Commit 6791489e by Jonathan Wakely Committed by Jonathan Wakely

Define std::remove_cvref and std::remove_cvref_t for C++2a

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.

From-SVN: r259887
parent 31aac344
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> 2018-05-02 François Dumont <fdumont@gcc.gnu.org>
* include/bits/deque.tcc (deque<>::_M_assign_aux): Cast to void to * include/bits/deque.tcc (deque<>::_M_assign_aux): Cast to void to
......
...@@ -451,7 +451,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -451,7 +451,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _ValueType> template<typename _ValueType>
inline _ValueType any_cast(const any& __any) 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>(), static_assert(any::__is_valid_cast<_ValueType>(),
"Template argument must be a reference or CopyConstructible type"); "Template argument must be a reference or CopyConstructible type");
static_assert(is_constructible_v<_ValueType, const _Up&>, static_assert(is_constructible_v<_ValueType, const _Up&>,
...@@ -477,7 +477,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -477,7 +477,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _ValueType> template<typename _ValueType>
inline _ValueType any_cast(any& __any) 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>(), static_assert(any::__is_valid_cast<_ValueType>(),
"Template argument must be a reference or CopyConstructible type"); "Template argument must be a reference or CopyConstructible type");
static_assert(is_constructible_v<_ValueType, _Up&>, static_assert(is_constructible_v<_ValueType, _Up&>,
...@@ -491,7 +491,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -491,7 +491,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _ValueType> template<typename _ValueType>
inline _ValueType any_cast(any&& __any) 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>(), static_assert(any::__is_valid_cast<_ValueType>(),
"Template argument must be a reference or CopyConstructible type"); "Template argument must be a reference or CopyConstructible type");
static_assert(is_constructible_v<_ValueType, _Up>, static_assert(is_constructible_v<_ValueType, _Up>,
......
...@@ -1499,8 +1499,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -1499,8 +1499,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// Returns the std::tuple equivalent of a tuple-like type. // Returns the std::tuple equivalent of a tuple-like type.
template<typename _Tuple> template<typename _Tuple>
struct __make_tuple struct __make_tuple
: public __do_make_tuple<typename std::remove_cv : public __do_make_tuple<__remove_cvref_t<_Tuple>>
<typename std::remove_reference<_Tuple>::type>::type>
{ }; { };
// Combines several std::tuple's into a single one. // Combines several std::tuple's into a single one.
......
...@@ -2092,6 +2092,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -2092,6 +2092,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
return __declval<_Tp>(0); 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 /// result_of
template<typename _Signature> template<typename _Signature>
class result_of; class result_of;
...@@ -2193,8 +2198,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -2193,8 +2198,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _Res, typename _Class, typename _Arg> template<typename _Res, typename _Class, typename _Arg>
struct __result_of_memobj<_Res _Class::*, _Arg> struct __result_of_memobj<_Res _Class::*, _Arg>
{ {
typedef typename remove_cv<typename remove_reference< typedef __remove_cvref_t<_Arg> _Argval;
_Arg>::type>::type _Argval;
typedef _Res _Class::* _MemPtr; typedef _Res _Class::* _MemPtr;
typedef typename conditional<__or_<is_same<_Argval, _Class>, typedef typename conditional<__or_<is_same<_Argval, _Class>,
is_base_of<_Class, _Argval>>::value, is_base_of<_Class, _Argval>>::value,
...@@ -2209,8 +2213,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -2209,8 +2213,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _Res, typename _Class, typename _Arg, typename... _Args> template<typename _Res, typename _Class, typename _Arg, typename... _Args>
struct __result_of_memfun<_Res _Class::*, _Arg, _Args...> struct __result_of_memfun<_Res _Class::*, _Arg, _Args...>
{ {
typedef typename remove_cv<typename remove_reference< typedef __remove_cvref_t<_Arg> _Argval;
_Arg>::type>::type _Argval;
typedef _Res _Class::* _MemPtr; typedef _Res _Class::* _MemPtr;
typedef typename conditional<__or_<is_same<_Argval, _Class>, typedef typename conditional<__or_<is_same<_Argval, _Class>,
is_base_of<_Class, _Argval>>::value, is_base_of<_Class, _Argval>>::value,
...@@ -2399,8 +2402,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -2399,8 +2402,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// Internal type trait that allows us to sfinae-protect tuple_cat. // Internal type trait that allows us to sfinae-protect tuple_cat.
template<typename _Tp> template<typename _Tp>
struct __is_tuple_like struct __is_tuple_like
: public __is_tuple_like_impl<typename remove_cv< : public __is_tuple_like_impl<__remove_cvref_t<_Tp>>::type
typename remove_reference<_Tp>::type>::type>::type
{ }; { };
template<typename _Tp> template<typename _Tp>
...@@ -2942,6 +2944,17 @@ template <typename _From, typename _To> ...@@ -2942,6 +2944,17 @@ template <typename _From, typename _To>
big = __ORDER_BIG_ENDIAN__, big = __ORDER_BIG_ENDIAN__,
native = __BYTE_ORDER__ 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 #endif // C++2a
_GLIBCXX_END_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION
......
...@@ -289,7 +289,7 @@ namespace __variant ...@@ -289,7 +289,7 @@ namespace __variant
size_t size_t
__erased_hash(void* __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)); __variant::__ref_cast<_Tp>(__t));
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment