From 847e9cf81e5101f327e4cd5ac629df93b0afb581 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Tue, 11 Nov 2014 23:57:35 +0000 Subject: [PATCH] Define __void_t and SFINAE-friendly iterator_traits. * include/std/type_traits (__void_t): Define new alias template. (_GLIBCXX_HAS_NESTED_TYPE): Redefine using __void_t. * include/std/functional (_Maybe_get_result_type): Likewise. * include/bits/stl_iterator_base_types.h (__iterator_traits): Likewise. * include/bits/uses_allocator.h (__uses_allocator_helper): Likewise. * testsuite/20_util/bind/ref_neg.cc: Adjust dg-error. * testsuite/20_util/reference_wrapper/typedefs-3.cc: Adjust to changes in _GLIBCXX_HAS_NESTED_TYPE. From-SVN: r217395 --- libstdc++-v3/ChangeLog | 11 +++++++ .../include/bits/stl_iterator_base_types.h | 17 ++++++----- libstdc++-v3/include/bits/uses_allocator.h | 8 ++--- libstdc++-v3/include/std/functional | 11 ++++--- libstdc++-v3/include/std/type_traits | 30 ++++++------------- .../testsuite/20_util/bind/ref_neg.cc | 8 ++--- .../20_util/reference_wrapper/typedefs-3.cc | 3 +- 7 files changed, 43 insertions(+), 45 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index f19aabc7e26..4a17fd0b9b3 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +2014-11-11 Jonathan Wakely + + * include/std/type_traits (__void_t): Define new alias template. + (_GLIBCXX_HAS_NESTED_TYPE): Redefine using __void_t. + * include/std/functional (_Maybe_get_result_type): Likewise. + * include/bits/stl_iterator_base_types.h (__iterator_traits): Likewise. + * include/bits/uses_allocator.h (__uses_allocator_helper): Likewise. + * testsuite/20_util/bind/ref_neg.cc: Adjust dg-error. + * testsuite/20_util/reference_wrapper/typedefs-3.cc: Adjust to changes + in _GLIBCXX_HAS_NESTED_TYPE. + 2014-11-11 Jonathan Wakely * include/std/functional (_Mem_fn_traits): Add partial specializations diff --git a/libstdc++-v3/include/bits/stl_iterator_base_types.h b/libstdc++-v3/include/bits/stl_iterator_base_types.h index bd559874381..ba3f9232278 100644 --- a/libstdc++-v3/include/bits/stl_iterator_base_types.h +++ b/libstdc++-v3/include/bits/stl_iterator_base_types.h @@ -64,7 +64,7 @@ #include #if __cplusplus >= 201103L -# include // For _GLIBCXX_HAS_NESTED_TYPE, is_convertible +# include // For __void_t, is_convertible #endif namespace std _GLIBCXX_VISIBILITY(default) @@ -138,15 +138,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * provide tighter, more correct semantics. */ #if __cplusplus >= 201103L - -_GLIBCXX_HAS_NESTED_TYPE(iterator_category) - - template::value> + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 2408. SFINAE-friendly common_type/iterator_traits is missing in C++14 + template> struct __iterator_traits { }; template - struct __iterator_traits<_Iterator, true> + struct __iterator_traits<_Iterator, + __void_t> { typedef typename _Iterator::iterator_category iterator_category; typedef typename _Iterator::value_type value_type; diff --git a/libstdc++-v3/include/bits/uses_allocator.h b/libstdc++-v3/include/bits/uses_allocator.h index 7281508fc06..a50ce10a5ca 100644 --- a/libstdc++-v3/include/bits/uses_allocator.h +++ b/libstdc++-v3/include/bits/uses_allocator.h @@ -40,15 +40,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr allocator_arg_t allocator_arg = allocator_arg_t(); -_GLIBCXX_HAS_NESTED_TYPE(allocator_type) - - template::value> + template> struct __uses_allocator_helper : false_type { }; template - struct __uses_allocator_helper<_Tp, _Alloc, true> + struct __uses_allocator_helper<_Tp, _Alloc, + __void_t> : is_convertible<_Alloc, typename _Tp::allocator_type>::type { }; diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional index 92489b7d4b9..e711350a5df 100644 --- a/libstdc++-v3/include/std/functional +++ b/libstdc++-v3/include/std/functional @@ -67,24 +67,23 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Mem_fn<_Tp _Class::*> mem_fn(_Tp _Class::*) noexcept; -_GLIBCXX_HAS_NESTED_TYPE(result_type) - /// If we have found a result_type, extract it. - template + template> struct _Maybe_get_result_type { }; template - struct _Maybe_get_result_type + struct _Maybe_get_result_type<_Functor, + __void_t> { typedef typename _Functor::result_type result_type; }; /** * Base class for any function object that has a weak result type, as - * defined in 3.3/3 of TR1. + * defined in 20.8.2 [func.require] of C++11. */ template struct _Weak_result_type_impl - : _Maybe_get_result_type<__has_result_type<_Functor>::value, _Functor> + : _Maybe_get_result_type<_Functor> { }; /// Retrieve the result type for a function type. diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index cecc7dc2697..6b72a3a2a18 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -2404,34 +2404,22 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION using result_of_t = typename result_of<_Tp>::type; #endif + template using __void_t = void; + /// @} group metaprogramming - + /** * Use SFINAE to determine if the type _Tp has a publicly-accessible * member type _NTYPE. */ #define _GLIBCXX_HAS_NESTED_TYPE(_NTYPE) \ - template \ - class __has_##_NTYPE##_helper \ - { \ - template \ - struct _Wrap_type \ - { }; \ - \ - template \ - static true_type __test(_Wrap_type*); \ - \ - template \ - static false_type __test(...); \ - \ - public: \ - typedef decltype(__test<_Tp>(0)) type; \ - }; \ - \ - template \ + template> \ struct __has_##_NTYPE \ - : public __has_##_NTYPE##_helper \ - ::type>::type \ + : false_type \ + { }; \ + template \ + struct __has_##_NTYPE<_Tp, __void_t> \ + : true_type \ { }; _GLIBCXX_END_NAMESPACE_VERSION diff --git a/libstdc++-v3/testsuite/20_util/bind/ref_neg.cc b/libstdc++-v3/testsuite/20_util/bind/ref_neg.cc index 7810968663d..fde434f2db2 100644 --- a/libstdc++-v3/testsuite/20_util/bind/ref_neg.cc +++ b/libstdc++-v3/testsuite/20_util/bind/ref_neg.cc @@ -30,10 +30,10 @@ void test01() { const int dummy = 0; std::bind(&inc, _1)(0); // { dg-error "no match" } - // { dg-error "rvalue|const" "" { target *-*-* } 1126 } - // { dg-error "rvalue|const" "" { target *-*-* } 1140 } - // { dg-error "rvalue|const" "" { target *-*-* } 1154 } - // { dg-error "rvalue|const" "" { target *-*-* } 1168 } + // { dg-error "rvalue|const" "" { target *-*-* } 1125 } + // { dg-error "rvalue|const" "" { target *-*-* } 1139 } + // { dg-error "rvalue|const" "" { target *-*-* } 1153 } + // { dg-error "rvalue|const" "" { target *-*-* } 1167 } std::bind(&inc, std::ref(dummy))(); // { dg-error "no match" } } diff --git a/libstdc++-v3/testsuite/20_util/reference_wrapper/typedefs-3.cc b/libstdc++-v3/testsuite/20_util/reference_wrapper/typedefs-3.cc index 7d6a7994127..909b305d9a0 100644 --- a/libstdc++-v3/testsuite/20_util/reference_wrapper/typedefs-3.cc +++ b/libstdc++-v3/testsuite/20_util/reference_wrapper/typedefs-3.cc @@ -46,8 +46,7 @@ struct S012 : S0, S1, S2 { }; using std::true_type; using std::false_type; -using std::integral_constant; -using std::remove_cv; +using std::__void_t; _GLIBCXX_HAS_NESTED_TYPE(argument_type) _GLIBCXX_HAS_NESTED_TYPE(first_argument_type) -- 2.30.2