On Thu, 10 Aug 2023 at 23:34, Jonathan Wakely via Libstdc++ < libstdc++@gcc.gnu.org> wrote: > Tested x86_64-linux. Pushed to trunk. Backport to gcc-13 to follow. > > -- >8 -- > > This renames __iterator_category_t to __iter_category_t, for consistency > with std::iter_value_t, std::iter_difference_t and std::iter_reference_t > in C++20. Then use __iter_category_t in , which > fixes the problem of the missing 'typename' that Clang 15 incorrectly > still requires. > > libstdc++-v3/ChangeLog: > > PR libstdc++/110970 > * include/bits/stl_iterator.h (__detail::__move_iter_cat): Use > __iter_category_t. > (iterator_traits>::_S_iter_cat): Likewise. > (__detail::__basic_const_iterator_iter_cat): Likewise. > * include/bits/stl_iterator_base_types.h (__iterator_category_t): > Rename to __iter_category_t. > --- > libstdc++-v3/include/bits/stl_iterator.h | 17 +++++++++-------- > .../include/bits/stl_iterator_base_types.h | 6 +++--- > 2 files changed, 12 insertions(+), 11 deletions(-) > > diff --git a/libstdc++-v3/include/bits/stl_iterator.h > b/libstdc++-v3/include/bits/stl_iterator.h > index b22d9a4fdb3..d5ba05f3e22 100644 > --- a/libstdc++-v3/include/bits/stl_iterator.h > +++ b/libstdc++-v3/include/bits/stl_iterator.h > @@ -103,6 +103,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > using __clamp_iter_cat > = __conditional_t, _Limit, _Otherwise>; > > + template > + using __clamped_iter_cat_t > + = __clamp_iter_cat<__iter_category_t<_Iter>, _Limit>; > + > template > concept __different_from > = !same_as, remove_cvref_t<_Up>>; > @@ -168,8 +172,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > random_access_iterator_tag, > bidirectional_iterator_tag>; > using iterator_category > - = __detail::__clamp_iter_cat __traits_type::iterator_category, > - random_access_iterator_tag>; > + = __detail::__clamped_iter_cat_t<_Iterator, > random_access_iterator_tag>; > using value_type = iter_value_t<_Iterator>; > using difference_type = iter_difference_t<_Iterator>; > using reference = iter_reference_t<_Iterator>; > @@ -1426,12 +1429,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > { }; > > template > - requires requires { typename > iterator_traits<_Iterator>::iterator_category; } > + requires requires { typename __iter_category_t<_Iterator>; } > struct __move_iter_cat<_Iterator> > { > using iterator_category > - = __clamp_iter_cat iterator_traits<_Iterator>::iterator_category, > - random_access_iterator_tag>; > + = __clamped_iter_cat_t<_Iterator, random_access_iterator_tag>; > Oops, I only meant to commit the change to use __iter_category_t, not the addition of __clamped_iter_cat. I'll revert that part. It was an experiment that I decided against, and I thought I'd already reverted before committing. > }; > #endif > } > @@ -2288,8 +2290,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > static auto > _S_iter_cat() > { > - using _Traits = iterator_traits<_It>; > - if constexpr (requires { requires derived_from _Traits::iterator_category, > + if constexpr (requires { requires > derived_from<__iter_category_t<_It>, > > forward_iterator_tag>; }) > return forward_iterator_tag{}; > else > @@ -2615,7 +2616,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > > template > struct __basic_const_iterator_iter_cat<_It> > - { using iterator_category = > iterator_traits<_It>::iterator_category; }; > + { using iterator_category = __iter_category_t<_It>; }; > } // namespace detail > > template > diff --git a/libstdc++-v3/include/bits/stl_iterator_base_types.h > b/libstdc++-v3/include/bits/stl_iterator_base_types.h > index 5d2c8b325d9..841b5eca3ad 100644 > --- a/libstdc++-v3/include/bits/stl_iterator_base_types.h > +++ b/libstdc++-v3/include/bits/stl_iterator_base_types.h > @@ -243,16 +243,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > > #if __cplusplus >= 201103L > template > - using __iterator_category_t > + using __iter_category_t > = typename iterator_traits<_Iter>::iterator_category; > > template > using _RequireInputIter = > - __enable_if_t, > + __enable_if_t, > input_iterator_tag>::value>; > > template - typename _Cat = __iterator_category_t<_It>> > + typename _Cat = __iter_category_t<_It>> > struct __is_random_access_iter > : is_base_of > { > -- > 2.41.0 > >