https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93884

            Bug ID: 93884
           Summary: ranges::copy doesn't like output iterators
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: cjdb.ns at gmail dot com
  Target Milestone: ---

ranges::copy doesn't currently like non-readable iterators as its second/third
argument.

* Branch: GCC trunk

* Version: gcc (GCC) 10.0.1 20200222 (experimental)

* Git Hash: d6f420d98126ac51396b89fbe287a32287cd92ed

* GCC configured with: ../gcc/configure --disable-nls --disable-multilib
--enable-languages=c,c++ --disable-werror

* GCC built with: CFLAGS='-O3 -g0 -w' CXXFLAGS='-O3 -g0 -w'
LDFLAGS='-fuse-ld=gold'

* System: Ubuntu 18.04 (WSL)

* GCC invocation: g++ -std=c++2a

Output:

```
copy.cpp: In function 'int main()':
copy.cpp:14:73: error: no match for call to '(const std::ranges::__copy_fn)
(std::ranges::iota_view<int, int>::_Iterator, std::ranges::iota_view<int,
int>::_Iterator, std::back_insert_iterator<std::vector<int> >)'
   14 |     ranges::copy(ranges::begin(i), ranges::end(i),
std::back_inserter(v));
      |                                                                        
^
In file included from /usr/local/include/c++/10.0.1/bits/ranges_algo.h:35,
                 from /usr/local/include/c++/10.0.1/algorithm:64,
                 from copy.cpp:1:
/usr/local/include/c++/10.0.1/bits/ranges_algobase.h:304:7: note: candidate:
'constexpr std::ranges::copy_result<_Iter, _Out>
std::ranges::__copy_fn::operator()(_Iter, _Sent, _Out) const [with _Iter =
std::ranges::iota_view<int, int>::_Iterator; _Sent =
std::ranges::iota_view<int, int>::_Iterator; _Out =
std::back_insert_iterator<std::vector<int> >; std::ranges::copy_result<_Iter,
_Out> = std::ranges::in_out_result<std::ranges::iota_view<int, int>::_Iterator,
std::back_insert_iterator<std::vector<int> > >]'
  304 |       operator()(_Iter __first, _Sent __last, _Out __result) const
      |       ^~~~~~~~
/usr/local/include/c++/10.0.1/bits/ranges_algobase.h:304:7: note: constraints
not satisfied
In file included from /usr/local/include/c++/10.0.1/compare:39,
                 from /usr/local/include/c++/10.0.1/bits/stl_pair.h:65,
                 from /usr/local/include/c++/10.0.1/utility:70,
                 from /usr/local/include/c++/10.0.1/algorithm:60,
                 from copy.cpp:1:
/usr/local/include/c++/10.0.1/concepts: In instantiation of 'constexpr
std::ranges::copy_result<_Iter, _Out> std::ranges::__copy_fn::operator()(_Iter,
_Sent, _Out) const [with _Iter = std::ranges::iota_view<int, int>::_Iterator;
_Sent = std::ranges::iota_view<int, int>::_Iterator; _Out =
std::back_insert_iterator<std::vector<int> >; std::ranges::copy_result<_Iter,
_Out> = std::ranges::in_out_result<std::ranges::iota_view<int, int>::_Iterator,
std::back_insert_iterator<std::vector<int> > >]':
copy.cpp:14:73:   required from here
/usr/local/include/c++/10.0.1/concepts:138:13:   required for the satisfaction
of 'constructible_from<std::back_insert_iterator<std::vector<int,
std::allocator<int> > > >'
/usr/local/include/c++/10.0.1/concepts:143:13:   required for the satisfaction
of 'default_initializable<std::back_insert_iterator<std::vector<int,
std::allocator<int> > > >'
/usr/local/include/c++/10.0.1/bits/iterator_concepts.h:507:13:   required for
the satisfaction of
'weakly_incrementable<std::back_insert_iterator<std::vector<int,
std::allocator<int> > > >'
/usr/local/include/c++/10.0.1/concepts:139:30: note: the expression
'is_constructible_v<_Tp, _Args ...>' evaluated to 'false'
  139 |       = destructible<_Tp> && is_constructible_v<_Tp, _Args...>;
      |                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/local/include/c++/10.0.1/bits/ranges_algo.h:35,
                 from /usr/local/include/c++/10.0.1/algorithm:64,
                 from copy.cpp:1:
/usr/local/include/c++/10.0.1/bits/ranges_algobase.h:314:7: note: candidate:
'template<class _Range, class _Out>  requires (input_range<_Range>) &&
(weakly_incrementable<_Out>) &&
(indirectly_copyable<decltype(std::ranges::__cust::begin((declval<_Range&>)())),
_Out>) constexpr
std::ranges::copy_result<std::ranges::borrowed_iterator_t<_Range>, _Out>
std::ranges::__copy_fn::operator()(_Range&&, _Out) const'
  314 |       operator()(_Range&& __r, _Out __result) const
      |       ^~~~~~~~
/usr/local/include/c++/10.0.1/bits/ranges_algobase.h:314:7: note:   template
argument deduction/substitution failed:
copy.cpp:14:73: note:   candidate expects 2 arguments, 3 provided
   14 |     ranges::copy(ranges::begin(i), ranges::end(i),
std::back_inserter(v));
      |                                                                        
^
copy.cpp:15:84: error: no match for call to '(const std::ranges::__copy_fn)
(std::ranges::iota_view<int, int>::_Iterator, std::ranges::iota_view<int,
int>::_Iterator, std::insert_iterator<std::vector<int> >)'
   15 |     ranges::copy(ranges::begin(i), ranges::end(i), std::inserter(v,
ranges::end(v)));
      |                                                                        
           ^
In file included from /usr/local/include/c++/10.0.1/bits/ranges_algo.h:35,
                 from /usr/local/include/c++/10.0.1/algorithm:64,
                 from copy.cpp:1:
/usr/local/include/c++/10.0.1/bits/ranges_algobase.h:304:7: note: candidate:
'constexpr std::ranges::copy_result<_Iter, _Out>
std::ranges::__copy_fn::operator()(_Iter, _Sent, _Out) const [with _Iter =
std::ranges::iota_view<int, int>::_Iterator; _Sent =
std::ranges::iota_view<int, int>::_Iterator; _Out =
std::insert_iterator<std::vector<int> >; std::ranges::copy_result<_Iter, _Out>
= std::ranges::in_out_result<std::ranges::iota_view<int, int>::_Iterator,
std::insert_iterator<std::vector<int> > >]'
  304 |       operator()(_Iter __first, _Sent __last, _Out __result) const
      |       ^~~~~~~~
/usr/local/include/c++/10.0.1/bits/ranges_algobase.h:304:7: note: constraints
not satisfied
In file included from /usr/local/include/c++/10.0.1/compare:39,
                 from /usr/local/include/c++/10.0.1/bits/stl_pair.h:65,
                 from /usr/local/include/c++/10.0.1/utility:70,
                 from /usr/local/include/c++/10.0.1/algorithm:60,
                 from copy.cpp:1:
/usr/local/include/c++/10.0.1/concepts: In instantiation of 'constexpr
std::ranges::copy_result<_Iter, _Out> std::ranges::__copy_fn::operator()(_Iter,
_Sent, _Out) const [with _Iter = std::ranges::iota_view<int, int>::_Iterator;
_Sent = std::ranges::iota_view<int, int>::_Iterator; _Out =
std::insert_iterator<std::vector<int> >; std::ranges::copy_result<_Iter, _Out>
= std::ranges::in_out_result<std::ranges::iota_view<int, int>::_Iterator,
std::insert_iterator<std::vector<int> > >]':
copy.cpp:15:84:   required from here
/usr/local/include/c++/10.0.1/concepts:138:13:   required for the satisfaction
of 'constructible_from<std::insert_iterator<std::vector<int,
std::allocator<int> > > >'
/usr/local/include/c++/10.0.1/concepts:143:13:   required for the satisfaction
of 'default_initializable<std::insert_iterator<std::vector<int,
std::allocator<int> > > >'
/usr/local/include/c++/10.0.1/bits/iterator_concepts.h:507:13:   required for
the satisfaction of 'weakly_incrementable<std::insert_iterator<std::vector<int,
std::allocator<int> > > >'
/usr/local/include/c++/10.0.1/concepts:139:30: note: the expression
'is_constructible_v<_Tp, _Args ...>' evaluated to 'false'
  139 |       = destructible<_Tp> && is_constructible_v<_Tp, _Args...>;
      |                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/local/include/c++/10.0.1/bits/ranges_algo.h:35,
                 from /usr/local/include/c++/10.0.1/algorithm:64,
                 from copy.cpp:1:
/usr/local/include/c++/10.0.1/bits/ranges_algobase.h:314:7: note: candidate:
'template<class _Range, class _Out>  requires (input_range<_Range>) &&
(weakly_incrementable<_Out>) &&
(indirectly_copyable<decltype(std::ranges::__cust::begin((declval<_Range&>)())),
_Out>) constexpr
std::ranges::copy_result<std::ranges::borrowed_iterator_t<_Range>, _Out>
std::ranges::__copy_fn::operator()(_Range&&, _Out) const'
  314 |       operator()(_Range&& __r, _Out __result) const
      |       ^~~~~~~~
/usr/local/include/c++/10.0.1/bits/ranges_algobase.h:314:7: note:   template
argument deduction/substitution failed:
copy.cpp:15:84: note:   candidate expects 2 arguments, 3 provided
   15 |     ranges::copy(ranges::begin(i), ranges::end(i), std::inserter(v,
ranges::end(v)));
      |                                                                        
           ^
copy.cpp:18:74: error: no match for call to '(const std::ranges::__copy_fn)
(std::ranges::iota_view<int, int>::_Iterator, std::ranges::iota_view<int,
int>::_Iterator, std::front_insert_iterator<std::deque<int> >)'
   18 |     ranges::copy(ranges::begin(i), ranges::end(i),
std::front_inserter(d));
      |                                                                        
 ^
In file included from /usr/local/include/c++/10.0.1/bits/ranges_algo.h:35,
                 from /usr/local/include/c++/10.0.1/algorithm:64,
                 from copy.cpp:1:
/usr/local/include/c++/10.0.1/bits/ranges_algobase.h:304:7: note: candidate:
'constexpr std::ranges::copy_result<_Iter, _Out>
std::ranges::__copy_fn::operator()(_Iter, _Sent, _Out) const [with _Iter =
std::ranges::iota_view<int, int>::_Iterator; _Sent =
std::ranges::iota_view<int, int>::_Iterator; _Out =
std::front_insert_iterator<std::deque<int> >; std::ranges::copy_result<_Iter,
_Out> = std::ranges::in_out_result<std::ranges::iota_view<int, int>::_Iterator,
std::front_insert_iterator<std::deque<int> > >]'
  304 |       operator()(_Iter __first, _Sent __last, _Out __result) const
      |       ^~~~~~~~
/usr/local/include/c++/10.0.1/bits/ranges_algobase.h:304:7: note: constraints
not satisfied
In file included from /usr/local/include/c++/10.0.1/compare:39,
                 from /usr/local/include/c++/10.0.1/bits/stl_pair.h:65,
                 from /usr/local/include/c++/10.0.1/utility:70,
                 from /usr/local/include/c++/10.0.1/algorithm:60,
                 from copy.cpp:1:
/usr/local/include/c++/10.0.1/concepts: In instantiation of 'constexpr
std::ranges::copy_result<_Iter, _Out> std::ranges::__copy_fn::operator()(_Iter,
_Sent, _Out) const [with _Iter = std::ranges::iota_view<int, int>::_Iterator;
_Sent = std::ranges::iota_view<int, int>::_Iterator; _Out =
std::front_insert_iterator<std::deque<int> >; std::ranges::copy_result<_Iter,
_Out> = std::ranges::in_out_result<std::ranges::iota_view<int, int>::_Iterator,
std::front_insert_iterator<std::deque<int> > >]':
copy.cpp:18:74:   required from here
/usr/local/include/c++/10.0.1/concepts:138:13:   required for the satisfaction
of 'constructible_from<std::front_insert_iterator<std::deque<int,
std::allocator<int> > > >'
/usr/local/include/c++/10.0.1/concepts:143:13:   required for the satisfaction
of 'default_initializable<std::front_insert_iterator<std::deque<int,
std::allocator<int> > > >'
/usr/local/include/c++/10.0.1/bits/iterator_concepts.h:507:13:   required for
the satisfaction of
'weakly_incrementable<std::front_insert_iterator<std::deque<int,
std::allocator<int> > > >'
/usr/local/include/c++/10.0.1/concepts:139:30: note: the expression
'is_constructible_v<_Tp, _Args ...>' evaluated to 'false'
  139 |       = destructible<_Tp> && is_constructible_v<_Tp, _Args...>;
      |                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/local/include/c++/10.0.1/bits/ranges_algo.h:35,
                 from /usr/local/include/c++/10.0.1/algorithm:64,
                 from copy.cpp:1:
/usr/local/include/c++/10.0.1/bits/ranges_algobase.h:314:7: note: candidate:
'template<class _Range, class _Out>  requires (input_range<_Range>) &&
(weakly_incrementable<_Out>) &&
(indirectly_copyable<decltype(std::ranges::__cust::begin((declval<_Range&>)())),
_Out>) constexpr
std::ranges::copy_result<std::ranges::borrowed_iterator_t<_Range>, _Out>
std::ranges::__copy_fn::operator()(_Range&&, _Out) const'
  314 |       operator()(_Range&& __r, _Out __result) const
      |       ^~~~~~~~
/usr/local/include/c++/10.0.1/bits/ranges_algobase.h:314:7: note:   template
argument deduction/substitution failed:
copy.cpp:18:74: note:   candidate expects 2 arguments, 3 provided
   18 |     ranges::copy(ranges::begin(i), ranges::end(i),
std::front_inserter(d));
      |                                                                        
 ^
```

Reply via email to