https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119415
--- Comment #11 from 康桓瑋 <hewillk at gmail dot com> --- > Use __cpp17_input_iterator can still produce hard errors in some edge cases. With "hard errors", I mean the following: struct I { using difference_type = int; using value_type = int; int operator*() const; I& operator++(); I operator++(int); bool operator==(const I&) const; }; template<> struct std::iterator_traits<I> { using difference_type = I::difference_type; using value_type = I::value_type; using iterator_concept = std::input_iterator_tag; // no iterator_category }; std::ranges::subrange s{I{}, I{}}; Even though such a range seems completely contrived.