https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93267
Bug ID: 93267 Summary: std::ranges::begin|end do not work for iota_view when the element and bound type are the same Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: pilarlatiesa at gmail dot com Target Milestone: --- The following testcase emits errors at the specified locations: #include <cstddef> #include <ranges> int main() { std::size_t const Zero = 0u; std::size_t const Size = 10u; auto const Test1 = std::ranges::views::iota(0, Size); auto beginTest1 = std::ranges::begin(Test1); // OK auto const Test2 = std::ranges::views::iota(Zero, Size); auto beginTest2 = std::ranges::begin(Test2); // Error std::ranges::iota_view const Test3(Zero, Size); auto beginTest3 = std::ranges::begin(Test3); // Error std::ranges::iota_view<std::size_t, std::size_t> const Test4(0, Size); auto beginTest4 = std::ranges::begin(Test4); // Error std::ranges::iota_view<int, std::size_t> const Test5(0, Size); auto beginTest4 = std::ranges::begin(Test5); // OK } The error reads: error: no match for call to '(const std::ranges::__cust_access::_Begin) (const std::ranges::iota_view<long unsigned int, long unsigned int>&)' /home/pililatiesa/gcc-trunk-20200114/include/c++/10.0.0/bits/range_access.h:420:2: note: candidate: 'constexpr auto std::ranges::__cust_access::_Begin::operator()(_Tp&&) const [with _Tp = const std::ranges::iota_view<long unsigned int, long unsigned int>&]' 420 | operator()(_Tp&& __t) const noexcept(_S_noexcept<_Tp>()) | ^~~~~~~~ /home/pililatiesa/gcc-trunk-20200114/include/c++/10.0.0/bits/range_access.h:420:2: note: constraints not satisfied <source>: In instantiation of 'constexpr auto std::ranges::__cust_access::_Begin::operator()(_Tp&&) const [with _Tp = const std::ranges::iota_view<long unsigned int, long unsigned int>&]': <source>:10:34: required from here /home/pililatiesa/gcc-trunk-20200114/include/c++/10.0.0/bits/range_access.h:420:2: required by the constraints of 'template<class _Tp> requires (__maybe_safe_range<_Tp>) && ((is_array_v<typename std::remove_reference<_Tp>::remove_reference_t>) || (__member_begin<_Tp>) || (__adl_begin<_Tp>)) constexpr auto std::ranges::__cust_access::_Begin::operator()(_Tp&&) const' /home/pililatiesa/gcc-trunk-20200114/include/c++/10.0.0/bits/range_access.h:418:4: note: neither operand of the disjunction is satisfied 418 | || __adl_begin<_Tp>