https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100070
--- Comment #6 from Jonathan Wakely <redi at gcc dot gnu.org> --- I'm not sure we should make std::__iterator_category just return std::__detail::__iter_concept, because that has a fallback of random_access_iterator_tag and I keep forgetting why that is. And I don't think it's what we want here. So just: --- a/libstdc++-v3/include/bits/stl_iterator_base_types.h +++ b/libstdc++-v3/include/bits/stl_iterator_base_types.h @@ -236,7 +236,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline _GLIBCXX_CONSTEXPR typename iterator_traits<_Iter>::iterator_category __iterator_category(const _Iter&) - { return typename iterator_traits<_Iter>::iterator_category(); } + { +#if __cpp_lib_concepts + if constexpr (random_access_iterator<_Iter>) + return random_access_iterator_tag{}; + else if constexpr (bidirectional_iterator<_Iter>) + return bidirectional_iterator_tag{}; + else if constexpr (forward_iterator<_Iter>) + return forward_iterator_tag{}; + else +#endif + return typename iterator_traits<_Iter>::iterator_category(); + } ///@}