From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2181) id AB443388CC1A; Wed, 25 Nov 2020 18:10:58 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org AB443388CC1A MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jonathan Wakely To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r10-9080] libstdc++: Remove workarounds for constrained nested class templates X-Act-Checkin: gcc X-Git-Author: Jonathan Wakely X-Git-Refname: refs/heads/releases/gcc-10 X-Git-Oldrev: 8804b6ae3da91f3baa82da2fe28090025d5717d3 X-Git-Newrev: 2fe01dcd25d29798510101303b5bbfc254003b18 Message-Id: <20201125181058.AB443388CC1A@sourceware.org> Date: Wed, 25 Nov 2020 18:10:58 +0000 (GMT) X-BeenThere: libstdc++-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Nov 2020 18:10:58 -0000 https://gcc.gnu.org/g:2fe01dcd25d29798510101303b5bbfc254003b18 commit r10-9080-g2fe01dcd25d29798510101303b5bbfc254003b18 Author: Jonathan Wakely Date: Thu Jun 4 23:20:49 2020 +0100 libstdc++: Remove workarounds for constrained nested class templates With PR c++/92078 and PR c++/92103 both fixed, nested class templates can now be constrained. That means a number of namespace-scope helpers can be moved to the class scope, so they're only visible where they're needed. * include/bits/iterator_concepts.h (__detail::__ptr, __detail::__ref) (__detail::__cat, __detail::__diff): Move to class scope in the relevant __iterator_traits specializations. (__iterator_traits<>): Use nested class templates instead of ones from namespace __detail. * include/bits/stl_iterator.h (__detail::__common_iter_ptr): Move to class scope in iterator_traits>. (iterator_traits>): Use nested class template instead of __detail::__common_iter_ptr. (cherry picked from commit f2242ec0d3f1bb13c78ef3c21e0354d84fe57222) Diff: --- libstdc++-v3/include/bits/iterator_concepts.h | 153 ++++++++++++++------------ libstdc++-v3/include/bits/stl_iterator.h | 38 +++---- 2 files changed, 97 insertions(+), 94 deletions(-) diff --git a/libstdc++-v3/include/bits/iterator_concepts.h b/libstdc++-v3/include/bits/iterator_concepts.h index 45426fc3848..6c63e65c888 100644 --- a/libstdc++-v3/include/bits/iterator_concepts.h +++ b/libstdc++-v3/include/bits/iterator_concepts.h @@ -331,84 +331,26 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template concept __iter_without_nested_types = !__iter_with_nested_types<_Iter>; - - // FIXME: These have to be at namespace-scope because of PR 92103. - template - struct __ptr - { using type = void; }; - - template requires requires { typename _Iter::pointer; } - struct __ptr<_Iter, true> - { using type = typename _Iter::pointer; }; - - template requires requires { typename _Iter::pointer; } - struct __ptr<_Iter, false> - { using type = typename _Iter::pointer; }; - - template - requires (!requires { typename _Iter::pointer; } - && requires(_Iter& __it) { __it.operator->(); }) - struct __ptr<_Iter, true> - { using type = decltype(std::declval<_Iter&>().operator->()); }; - - template - struct __ref - { using type = iter_reference_t<_Iter>; }; - - template requires requires { typename _Iter::reference; } - struct __ref<_Iter> - { using type = typename _Iter::reference; }; - - template - struct __cat - { using type = input_iterator_tag; }; - - template - requires requires { typename _Iter::iterator_category; } - struct __cat<_Iter> - { using type = typename _Iter::iterator_category; }; - - template - requires (!requires { typename _Iter::iterator_category; } - && __detail::__cpp17_randacc_iterator<_Iter>) - struct __cat<_Iter> - { using type = random_access_iterator_tag; }; - - template - requires (!requires { typename _Iter::iterator_category; } - && __detail::__cpp17_bidi_iterator<_Iter>) - struct __cat<_Iter> - { using type = bidirectional_iterator_tag; }; - - template - requires (!requires { typename _Iter::iterator_category; } - && __detail::__cpp17_fwd_iterator<_Iter>) - struct __cat<_Iter> - { using type = forward_iterator_tag; }; - - template - struct __diff - { using type = void; }; - - template - requires requires { - typename incrementable_traits<_Iter>::difference_type; - } - struct __diff<_Iter> - { - using type = typename incrementable_traits<_Iter>::difference_type; - }; - } // namespace __detail template requires __detail::__iter_with_nested_types<_Iterator> struct __iterator_traits<_Iterator, void> { + private: + template + struct __ptr + { using type = void; }; + + template requires requires { typename _Iter::pointer; } + struct __ptr<_Iter> + { using type = typename _Iter::pointer; }; + + public: using iterator_category = typename _Iterator::iterator_category; using value_type = typename _Iterator::value_type; using difference_type = typename _Iterator::difference_type; - using pointer = typename __detail::__ptr<_Iterator>::type; + using pointer = typename __ptr<_Iterator>::type; using reference = typename _Iterator::reference; }; @@ -417,13 +359,64 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION && __detail::__cpp17_input_iterator<_Iterator> struct __iterator_traits<_Iterator, void> { - using iterator_category = typename __detail::__cat<_Iterator>::type; + private: + template + struct __cat + { using type = input_iterator_tag; }; + + template + requires requires { typename _Iter::iterator_category; } + struct __cat<_Iter> + { using type = typename _Iter::iterator_category; }; + + template + requires (!requires { typename _Iter::iterator_category; } + && __detail::__cpp17_randacc_iterator<_Iter>) + struct __cat<_Iter> + { using type = random_access_iterator_tag; }; + + template + requires (!requires { typename _Iter::iterator_category; } + && __detail::__cpp17_bidi_iterator<_Iter>) + struct __cat<_Iter> + { using type = bidirectional_iterator_tag; }; + + template + requires (!requires { typename _Iter::iterator_category; } + && __detail::__cpp17_fwd_iterator<_Iter>) + struct __cat<_Iter> + { using type = forward_iterator_tag; }; + + template + struct __ptr + { using type = void; }; + + template requires requires { typename _Iter::pointer; } + struct __ptr<_Iter> + { using type = typename _Iter::pointer; }; + + template + requires (!requires { typename _Iter::pointer; } + && requires(_Iter& __it) { __it.operator->(); }) + struct __ptr<_Iter> + { using type = decltype(std::declval<_Iter&>().operator->()); }; + + template + struct __ref + { using type = iter_reference_t<_Iter>; }; + + template requires requires { typename _Iter::reference; } + struct __ref<_Iter> + { using type = typename _Iter::reference; }; + + public: + using iterator_category = typename __cat<_Iterator>::type; using value_type = typename indirectly_readable_traits<_Iterator>::value_type; using difference_type = typename incrementable_traits<_Iterator>::difference_type; - using pointer = typename __detail::__ptr<_Iterator, true>::type; - using reference = typename __detail::__ref<_Iterator>::type; + using pointer = typename __ptr<_Iterator>::type; + using reference = typename __ref<_Iterator>::type; }; template @@ -431,9 +424,23 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION && __detail::__cpp17_iterator<_Iterator> struct __iterator_traits<_Iterator, void> { + private: + template + struct __diff + { using type = void; }; + + template + requires requires + { typename incrementable_traits<_Iter>::difference_type; } + struct __diff<_Iter> + { + using type = typename incrementable_traits<_Iter>::difference_type; + }; + + public: using iterator_category = output_iterator_tag; using value_type = void; - using difference_type = typename __detail::__diff<_Iterator>::type; + using difference_type = typename __diff<_Iterator>::type; using pointer = void; using reference = void; }; diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h index 8f3d54852a1..3ff38b9f9a2 100644 --- a/libstdc++-v3/include/bits/stl_iterator.h +++ b/libstdc++-v3/include/bits/stl_iterator.h @@ -1935,29 +1935,25 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION using difference_type = iter_difference_t<_It>; }; - namespace __detail - { - // FIXME: This has to be at namespace-scope because of PR 92103. - template - struct __common_iter_ptr - { - using type = void; - }; - - template - requires __detail::__common_iter_has_arrow<_It> - struct __common_iter_ptr<_It, _Sent> - { - using common_iterator = std::common_iterator<_It, _Sent>; - - using type - = decltype(std::declval().operator->()); - }; - } // namespace __detail - template struct iterator_traits> { + private: + template + struct __ptr + { + using type = void; + }; + + template + requires __detail::__common_iter_has_arrow<_Iter> + struct __ptr<_Iter> + { + using _CIter = common_iterator<_Iter, _Sent>; + using type = decltype(std::declval().operator->()); + }; + + public: using iterator_concept = conditional_t, forward_iterator_tag, input_iterator_tag>; using iterator_category = __detail::__clamp_iter_cat< @@ -1965,7 +1961,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION forward_iterator_tag, input_iterator_tag>; using value_type = iter_value_t<_It>; using difference_type = iter_difference_t<_It>; - using pointer = typename __detail::__common_iter_ptr<_It, _Sent>::type; + using pointer = typename __ptr<_It>::type; using reference = iter_reference_t<_It>; };