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));
      |                                ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~

Reply via email to