https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102181
Bug ID: 102181 Summary: std::advance and std::views::iota<std::int64_t> don't work Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: raffael at casagrande dot ch Target Milestone: --- The following simple program doesn't compile: #include <ranges> int main() { using type = std::int64_t; // using type = int works! auto v = std::ranges::iota_view(static_cast<type>(0), static_cast<type>(100)); auto b = v.begin(); std::advance(b, static_cast<type>(1)); } gcc version: 12.0.0 20210901 (experimental) Error messages: /opt/compiler-explorer/gcc-trunk-20210902/include/c++/12.0.0/bits/stl_iterator_base_funcs.h: In instantiation of 'constexpr void std::advance(_InputIterator&, _Distance) [with _InputIterator = std::ranges::iota_view<long int, long int>::_Iterator; _Distance = long int]': <source>:7:15: required from here /opt/compiler-explorer/gcc-trunk-20210902/include/c++/12.0.0/bits/stl_iterator_base_funcs.h:207:21: error: no matching function for call to '__advance(std::ranges::iota_view<long int, long int>::_Iterator&, std::__iterator_traits<std::ranges::iota_view<long int, long int>::_Iterator, void>::difference_type&, std::__iterator_traits<std::ranges::iota_view<long int, long int>::_Iterator, void>::iterator_category)' 207 | std::__advance(__i, __d, std::__iterator_category(__i)); | ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /opt/compiler-explorer/gcc-trunk-20210902/include/c++/12.0.0/bits/stl_iterator_base_funcs.h:148:5: note: candidate: 'template<class _InputIterator, class _Distance> constexpr void std::__advance(_InputIterator&, _Distance, std::input_iterator_tag)' 148 | __advance(_InputIterator& __i, _Distance __n, input_iterator_tag) | ^~~~~~~~~ /opt/compiler-explorer/gcc-trunk-20210902/include/c++/12.0.0/bits/stl_iterator_base_funcs.h:148:5: note: template argument deduction/substitution failed: /opt/compiler-explorer/gcc-trunk-20210902/include/c++/12.0.0/bits/stl_iterator_base_funcs.h:207:56: note: cannot convert 'std::__iterator_category<std::ranges::iota_view<long int, long int>::_Iterator>((*(const std::ranges::iota_view<long int, long int>::_Iterator*)(& __i)))' (type 'std::__iterator_traits<std::ranges::iota_view<long int, long int>::_Iterator, void>::iterator_category' {aka 'std::output_iterator_tag'}) to type 'std::input_iterator_tag' 207 | std::__advance(__i, __d, std::__iterator_category(__i)); | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~ /opt/compiler-explorer/gcc-trunk-20210902/include/c++/12.0.0/bits/stl_iterator_base_funcs.h:159:5: note: candidate: 'template<class _BidirectionalIterator, class _Distance> constexpr void std::__advance(_BidirectionalIterator&, _Distance, std::bidirectional_iterator_tag)' 159 | __advance(_BidirectionalIterator& __i, _Distance __n, | ^~~~~~~~~ /opt/compiler-explorer/gcc-trunk-20210902/include/c++/12.0.0/bits/stl_iterator_base_funcs.h:159:5: note: template argument deduction/substitution failed: /opt/compiler-explorer/gcc-trunk-20210902/include/c++/12.0.0/bits/stl_iterator_base_funcs.h:207:56: note: cannot convert 'std::__iterator_category<std::ranges::iota_view<long int, long int>::_Iterator>((*(const std::ranges::iota_view<long int, long int>::_Iterator*)(& __i)))' (type 'std::__iterator_traits<std::ranges::iota_view<long int, long int>::_Iterator, void>::iterator_category' {aka 'std::output_iterator_tag'}) to type 'std::bidirectional_iterator_tag' 207 | std::__advance(__i, __d, std::__iterator_category(__i)); | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~ /opt/compiler-explorer/gcc-trunk-20210902/include/c++/12.0.0/bits/stl_iterator_base_funcs.h:175:5: note: candidate: 'template<class _RandomAccessIterator, class _Distance> constexpr void std::__advance(_RandomAccessIterator&, _Distance, std::random_access_iterator_tag)' 175 | __advance(_RandomAccessIterator& __i, _Distance __n, | ^~~~~~~~~ /opt/compiler-explorer/gcc-trunk-20210902/include/c++/12.0.0/bits/stl_iterator_base_funcs.h:175:5: note: template argument deduction/substitution failed: /opt/compiler-explorer/gcc-trunk-20210902/include/c++/12.0.0/bits/stl_iterator_base_funcs.h:207:56: note: cannot convert 'std::__iterator_category<std::ranges::iota_view<long int, long int>::_Iterator>((*(const std::ranges::iota_view<long int, long int>::_Iterator*)(& __i)))' (type 'std::__iterator_traits<std::ranges::iota_view<long int, long int>::_Iterator, void>::iterator_category' {aka 'std::output_iterator_tag'}) to type 'std::random_access_iterator_tag' 207 | std::__advance(__i, __d, std::__iterator_category(__i)); | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~