Compiling C++ 20 Example from 24.6.4.1 [range.istream.overview] produces errors with libstdc++ 10

I am using clang++ 10 with GCC libstdc++ 10 prerelease. I tried compiling the example from section 24.6.4.1 [range.istream.overview]. It works with g++ 10 but with clang++ 10 -std=c++20, I get constraint-failure errors.

program:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <ranges>
#include <sstream>

int main()
{
   using namespace std;
   using namespace ranges;
   auto ints = istringstream{"0 1 2 3 4"};
   ranges::copy(istream_view<int>(ints), ostream_iterator<int>{cout, "-"});
   // prints0-1-2-3-4-
}

$ clang++ -std=c++20 -o range_istream_overview \
range_istream_overview.cpp

Gist of the errors is that the istream_view fails the constraints for a range because ranges::begin() fails its constraint for the basic_istream_view::begin() member function:

{ __detail::__decay_copy(__t.begin()) } -> input_or_output_iterator;

Any ideas what's wrong or how to proceed?

Please could you provide the complete set of diagnostics from the compilation?

    I am using clang++ 10 with GCC libstdc++ 10 prerelease. I tried
    compiling the example from section 24.6.4.1
    [range.istream.overview]. It
    works with g++ 10 but with clang++ 10 -std=c++20, I get
    constraint-failure errors.

    program:
    #include <algorithm>
    #include <iostream>
    #include <iterator>
    #include <ranges>
    #include <sstream>

    int main()
    {
      using namespace std;
      using namespace ranges;
      auto ints = istringstream{"0 1 2 3 4"};
      ranges::copy(istream_view<int>(ints),
    ostream_iterator<int>{cout, "-"});
      // prints0-1-2-3-4-
    }

    $ clang++ -std=c++20 -o range_istream_overview \
    range_istream_overview.cpp

    Gist of the errors is that the istream_view fails the constraints for a
    range because ranges::begin() fails its constraint for the
    basic_istream_view::begin() member function:

    { __detail::__decay_copy(__t.begin()) } -> input_or_output_iterator;

    Any ideas what's wrong or how to proceed?

Please could you provide the complete set of diagnostics from the compilation?

In file included from range_istream_overview.cpp:1:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/algorithm:61:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/stl_algobase.h:65:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/stl_iterator_base_types.h:71:
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:884:13: error: no matching function for call to '__ranges_begin'
         = decltype(__detail::__ranges_begin(std::declval<_Tp&>()));
                    ^~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:874:5: note: in instantiation of template type alias '__range_iter_t' requested here
     using iterator_t = std::__detail::__range_iter_t<_Tp>;
     ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ranges:134:43: note: in instantiation of template type alias 'iterator_t' requested here
       data() requires contiguous_iterator<iterator_t<_Derived>>
                                           ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ranges:956:14: note: in instantiation of template class 'std::ranges::view_interface<std::ranges::basic_istream_view<int, char, std::char_traits<char> > >' requested here
     : public view_interface<basic_istream_view<_Val, _CharT, _Traits>>
              ^
range_istream_overview.cpp:12:16: note: in instantiation of template class 'std::ranges::basic_istream_view<int, char, std::char_traits<char> >' requested here
   ranges::copy(istream_view<int>(ints), ostream_iterator<int>{cout, "-"});
                ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:867:7: note: candidate template ignored: constraints not satisfied [with _Tp = std::ranges::basic_istream_view<int, char, std::char_traits<char> >]
       __ranges_begin(_Tp& __t)
       ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:865:16: note: because 'is_array_v<std::ranges::basic_istream_view<int, char, std::char_traits<char> > >' evaluated to false
       requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
                ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:865:35: note: and 'std::ranges::basic_istream_view<int, char, std::char_traits<char> > &' does not satisfy '__member_begin'
       requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
                                   ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:849:33: note: because '__detail::__decay_copy(__t.begin())' would be invalid: no member named 'begin' in 'std::ranges::basic_istream_view<int, char, std::char_traits<char> >'
           { __detail::__decay_copy(__t.begin()) } -> input_or_output_iterator;
                                        ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:865:59: note: and 'std::ranges::basic_istream_view<int, char, std::char_traits<char> > &' does not satisfy '__adl_begin'
       requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
                                                           ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:859:29: note: because '__detail::__decay_copy(begin(__t))' would be invalid: call to deleted function 'begin'
           { __detail::__decay_copy(begin(__t)) } -> input_or_output_iterator;
                                    ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:884:13: error: no matching function for call to '__ranges_begin'
         = decltype(__detail::__ranges_begin(std::declval<_Tp&>()));
                    ^~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:874:5: note: in instantiation of template type alias '__range_iter_t' requested here
     using iterator_t = std::__detail::__range_iter_t<_Tp>;
     ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ranges:140:25: note: in instantiation of template type alias 'iterator_t' requested here
         && contiguous_iterator<iterator_t<const _Derived>>
                                ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ranges:956:14: note: in instantiation of template class 'std::ranges::view_interface<std::ranges::basic_istream_view<int, char, std::char_traits<char> > >' requested here
     : public view_interface<basic_istream_view<_Val, _CharT, _Traits>>
              ^
range_istream_overview.cpp:12:16: note: in instantiation of template class 'std::ranges::basic_istream_view<int, char, std::char_traits<char> >' requested here
   ranges::copy(istream_view<int>(ints), ostream_iterator<int>{cout, "-"});
                ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:867:7: note: candidate template ignored: constraints not satisfied [with _Tp = const std::ranges::basic_istream_view<int, char, std::char_traits<char> >]
       __ranges_begin(_Tp& __t)
       ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:865:16: note: because 'is_array_v<const std::ranges::basic_istream_view<int, char, std::char_traits<char> > >' evaluated to false
       requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
                ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:865:35: note: and 'const std::ranges::basic_istream_view<int, char, std::char_traits<char> > &' does not satisfy '__member_begin'
       requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
                                   ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:849:33: note: because '__detail::__decay_copy(__t.begin())' would be invalid: no member named 'begin' in 'std::ranges::basic_istream_view<int, char, std::char_traits<char> >'
           { __detail::__decay_copy(__t.begin()) } -> input_or_output_iterator;
                                        ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:865:59: note: and 'const std::ranges::basic_istream_view<int, char, std::char_traits<char> > &' does not satisfy '__adl_begin'
       requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
                                                           ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:859:29: note: because '__detail::__decay_copy(begin(__t))' would be invalid: call to deleted function 'begin'
           { __detail::__decay_copy(begin(__t)) } -> input_or_output_iterator;
                                    ^
In file included from range_istream_overview.cpp:1:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/algorithm:64:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/ranges_algo.h:35:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/ranges_algobase.h:38:
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ranges:146:24: error: constraints not satisfied for alias template 'sentinel_t' [with _Range = std::ranges::basic_istream_view<int, char, std::char_traits<char> >]
         && sized_sentinel_for<sentinel_t<_Derived>, iterator_t<_Derived>>
                               ^~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ranges:956:14: note: in instantiation of template class 'std::ranges::view_interface<std::ranges::basic_istream_view<int, char, std::char_traits<char> > >' requested here
     : public view_interface<basic_istream_view<_Val, _CharT, _Traits>>
              ^
range_istream_overview.cpp:12:16: note: in instantiation of template class 'std::ranges::basic_istream_view<int, char, std::char_traits<char> >' requested here
   ranges::copy(istream_view<int>(ints), ostream_iterator<int>{cout, "-"});
                ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:876:12: note: because 'std::ranges::basic_istream_view<int, char, std::char_traits<char> >' does not satisfy 'range'
   template<range _Range>
            ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:864:2: note: because 'ranges::begin(__t)' would be invalid: no matching function for call to object of type 'const __cust_access::_Begin'
         ranges::begin(__t);
         ^
In file included from range_istream_overview.cpp:1:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/algorithm:64:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/ranges_algo.h:35:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/ranges_algobase.h:38:
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ranges:152:24: error: constraints not satisfied for alias template 'sentinel_t' [with _Range = const std::ranges::basic_istream_view<int, char, std::char_traits<char> >]
         && sized_sentinel_for<sentinel_t<const _Derived>,
                               ^~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:876:12: note: because 'const std::ranges::basic_istream_view<int, char, std::char_traits<char> >' does not satisfy 'range'
   template<range _Range>
            ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:864:2: note: because 'ranges::begin(__t)' would be invalid: no matching function for call to object of type 'const __cust_access::_Begin'
         ranges::begin(__t);
         ^
range_istream_overview.cpp:12:3: error: no matching function for call to object of type 'const std::ranges::__copy_fn'
   ranges::copy(istream_view<int>(ints), ostream_iterator<int>{cout, "-"});
   ^~~~~~~~~~~~
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/ranges_algobase.h:309:7: note: candidate template ignored: substitution failure [with _Range = std::ranges::basic_istream_view<int, char, std::char_traits<char> >, _Out = std::ostream_iterator<int, char, std::char_traits<char> >]: constraints not satisfied for alias template 'borrowed_iterator_t' [with _Range = std::ranges::basic_istream_view<int, char, std::char_traits<char> >]
       operator()(_Range&& __r, _Out __result) const
       ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/ranges_algobase.h:299:7: note: candidate function template not viable: requires 3 arguments, but 2 were provided
       operator()(_Iter __first, _Sent __last, _Out __result) const
       ^
5 errors generated.

I am using clang++ 10 with GCC libstdc++ 10 prerelease. I tried
compiling the example from section 24.6.4.1
[range.istream.overview]. It
works with g++ 10 but with clang++ 10 -std=c++20, I get
constraint-failure errors.

program:
#include
#include
#include
#include
#include

int main()
{
using namespace std;
using namespace ranges;
auto ints = istringstream{“0 1 2 3 4”};
ranges::copy(istream_view(ints),
ostream_iterator{cout, “-”});
// prints0-1-2-3-4-
}

$ clang++ -std=c++20 -o range_istream_overview
range_istream_overview.cpp

Gist of the errors is that the istream_view fails the constraints for a
range because ranges::begin() fails its constraint for the
basic_istream_view::begin() member function:

{ __detail::__decay_copy(__t.begin()) } → input_or_output_iterator;

Any ideas what’s wrong or how to proceed?

Please could you provide the complete set of diagnostics from the
compilation?

In file included from range_istream_overview.cpp:1:
In file included from
/usr/bin/…/lib64/gcc/x86_64-suse-linux/10/…/…/…/…/include/c++/10/algorithm:61:
In file included from
/usr/bin/…/lib64/gcc/x86_64-suse-linux/10/…/…/…/…/include/c++/10/bits/stl_algobase.h:65:
In file included from
/usr/bin/…/lib64/gcc/x86_64-suse-linux/10/…/…/…/…/include/c++/10/bits/stl_iterator_base_types.h:71:
/usr/bin/…/lib64/gcc/x86_64-suse-linux/10/…/…/…/…/include/c++/10/bits/iterator_concepts.h:884:13:
error: no matching function for call to ‘__ranges_begin’
= decltype(__detail::__ranges_begin(std::declval<_Tp&>()));
^~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/…/lib64/gcc/x86_64-suse-linux/10/…/…/…/…/include/c++/10/bits/range_access.h:874:5:
note: in instantiation of template type alias ‘__range_iter_t’ requested
here
using iterator_t = std::__detail::__range_iter_t<_Tp>;
^
/usr/bin/…/lib64/gcc/x86_64-suse-linux/10/…/…/…/…/include/c++/10/ranges:134:43:
note: in instantiation of template type alias ‘iterator_t’ requested here
data() requires contiguous_iterator<iterator_t<_Derived>>
^
/usr/bin/…/lib64/gcc/x86_64-suse-linux/10/…/…/…/…/include/c++/10/ranges:956:14:
note: in instantiation of template class
‘std::ranges::view_interface<std::ranges::basic_istream_view<int, char,
std::char_traits > >’ requested here
: public view_interface<basic_istream_view<_Val, _CharT, _Traits>>
^
range_istream_overview.cpp:12:16: note: in instantiation of template
class 'std::ranges::basic_istream_view<int, char, std::char_traits

’ requested here
ranges::copy(istream_view(ints), ostream_iterator{cout, “-”});
^

OK, so the relevant part is this:

/usr/bin/…/lib64/gcc/x86_64-suse-linux/10/…/…/…/…/include/c++/10/bits/iterator_concepts.h:867:7:
note: candidate template ignored: constraints not satisfied [with _Tp =
std::ranges::basic_istream_view<int, char, std::char_traits >]
__ranges_begin(_Tp& __t)
^
/usr/bin/…/lib64/gcc/x86_64-suse-linux/10/…/…/…/…/include/c++/10/bits/iterator_concepts.h:865:16:
note: because ‘is_array_v<std::ranges::basic_istream_view<int, char,
std::char_traits > >’ evaluated to false
requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
^
/usr/bin/…/lib64/gcc/x86_64-suse-linux/10/…/…/…/…/include/c++/10/bits/iterator_concepts.h:865:35:
note: and ‘std::ranges::basic_istream_view<int, char,
std::char_traits > &’ does not satisfy ‘__member_begin’
requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
^
/usr/bin/…/lib64/gcc/x86_64-suse-linux/10/…/…/…/…/include/c++/10/bits/iterator_concepts.h:849:33:
note: because ‘__detail::__decay_copy(__t.begin())’ would be invalid: no
member named ‘begin’ in ‘std::ranges::basic_istream_view<int, char,
std::char_traits >’
{ __detail::__decay_copy(__t.begin()) } →
input_or_output_iterator;
^
/usr/bin/…/lib64/gcc/x86_64-suse-linux/10/…/…/…/…/include/c++/10/bits/iterator_concepts.h:865:59:
note: and ‘std::ranges::basic_istream_view<int, char,
std::char_traits > &’ does not satisfy ‘__adl_begin’
requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
^
/usr/bin/…/lib64/gcc/x86_64-suse-linux/10/…/…/…/…/include/c++/10/bits/iterator_concepts.h:859:29:
note: because ‘__detail::__decay_copy(begin(__t))’ would be invalid:
call to deleted function ‘begin’
{ __detail::__decay_copy(begin(__t)) } →
input_or_output_iterator;
^

Just as you said, it looks like the problem is that __member_begin<istream_view&> is evaluating to ‘false’, whereas it presumably should evaluate to ‘true’.

Can you try calling begin() on an istream_view& directly, and see if you get the same error?

A heavily-reduced testcase doesn’t demonstrate the problem – https://godbolt.org/z/Np4EMg – so I imagine there’s something else required to trigger this behavior. A more-reduced testcase should make the problem easier to understand.

Can you try calling begin() on an istream_view<int>& directly, and see if you get the same error?

$ cat istream_begin.cpp
#include <cassert>
#include <iostream>
#include <ranges>
#include <sstream>

int main()
{
   auto ints = std::istringstream{"0 1 2 3 4"};
   auto view{ std::ranges::istream_view<int>(ints) };
   auto begin{ std::ranges::begin(view) };
   assert(&*view.begin() == &*begin);
}
$ g++ -std=c++20 istream_begin.cpp
$ ./a.out
$ clang++ -std=c++20 istream_begin.cpp
In file included from istream_begin.cpp:2:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/iostream:39:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ostream:38:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ios:40:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/char_traits.h:39:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/stl_algobase.h:65:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/stl_iterator_base_types.h:71:
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:902:13: error: no matching function for call to '__ranges_begin'
         = decltype(__detail::__ranges_begin(std::declval<_Tp&>()));
                    ^~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:874:5: note: in instantiation of template type alias '__range_iter_t' requested here
     using iterator_t = std::__detail::__range_iter_t<_Tp>;
     ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ranges:134:43: note: in instantiation of template type alias 'iterator_t' requested here
       data() requires contiguous_iterator<iterator_t<_Derived>>
                                           ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ranges:956:14: note: in instantiation of template class 'std::ranges::view_interface<std::ranges::basic_istream_view<int, char, std::char_traits<char> > >' requested here
     : public view_interface<basic_istream_view<_Val, _CharT, _Traits>>
              ^
istream_begin.cpp:9:14: note: in instantiation of template class 'std::ranges::basic_istream_view<int, char, std::char_traits<char> >' requested here
   auto view{ std::ranges::istream_view<int>(ints) };
              ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:885:7: note: candidate template ignored: constraints not satisfied [with _Tp = std::ranges::basic_istream_view<int, char, std::char_traits<char> >]
       __ranges_begin(_Tp& __t)
       ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:883:16: note: because 'is_array_v<std::ranges::basic_istream_view<int, char, std::char_traits<char> > >' evaluated to false
       requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
                ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:883:35: note: and 'std::ranges::basic_istream_view<int, char, std::char_traits<char> > &' does not satisfy '__member_begin'
       requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
                                   ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:867:33: note: because '__detail::__decay_copy(__t.begin())' would be invalid: no member named 'begin' in 'std::ranges::basic_istream_view<int, char, std::char_traits<char> >'
           { __detail::__decay_copy(__t.begin()) } -> input_or_output_iterator;
                                        ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:883:59: note: and 'std::ranges::basic_istream_view<int, char, std::char_traits<char> > &' does not satisfy '__adl_begin'
       requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
                                                           ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:877:29: note: because '__detail::__decay_copy(begin(__t))' would be invalid: call to deleted function 'begin'
           { __detail::__decay_copy(begin(__t)) } -> input_or_output_iterator;
                                    ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:902:13: error: no matching function for call to '__ranges_begin'
         = decltype(__detail::__ranges_begin(std::declval<_Tp&>()));
                    ^~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:874:5: note: in instantiation of template type alias '__range_iter_t' requested here
     using iterator_t = std::__detail::__range_iter_t<_Tp>;
     ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ranges:140:25: note: in instantiation of template type alias 'iterator_t' requested here
         && contiguous_iterator<iterator_t<const _Derived>>
                                ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ranges:956:14: note: in instantiation of template class 'std::ranges::view_interface<std::ranges::basic_istream_view<int, char, std::char_traits<char> > >' requested here
     : public view_interface<basic_istream_view<_Val, _CharT, _Traits>>
              ^
istream_begin.cpp:9:14: note: in instantiation of template class 'std::ranges::basic_istream_view<int, char, std::char_traits<char> >' requested here
   auto view{ std::ranges::istream_view<int>(ints) };
              ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:885:7: note: candidate template ignored: constraints not satisfied [with _Tp = const std::ranges::basic_istream_view<int, char, std::char_traits<char> >]
       __ranges_begin(_Tp& __t)
       ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:883:16: note: because 'is_array_v<const std::ranges::basic_istream_view<int, char, std::char_traits<char> > >' evaluated to false
       requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
                ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:883:35: note: and 'const std::ranges::basic_istream_view<int, char, std::char_traits<char> > &' does not satisfy '__member_begin'
       requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
                                   ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:867:33: note: because '__detail::__decay_copy(__t.begin())' would be invalid: no member named 'begin' in 'std::ranges::basic_istream_view<int, char, std::char_traits<char> >'
           { __detail::__decay_copy(__t.begin()) } -> input_or_output_iterator;
                                        ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:883:59: note: and 'const std::ranges::basic_istream_view<int, char, std::char_traits<char> > &' does not satisfy '__adl_begin'
       requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
                                                           ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:877:29: note: because '__detail::__decay_copy(begin(__t))' would be invalid: call to deleted function 'begin'
           { __detail::__decay_copy(begin(__t)) } -> input_or_output_iterator;
                                    ^
In file included from istream_begin.cpp:3:
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ranges:146:24: error: constraints not satisfied for alias template 'sentinel_t' [with _Range = std::ranges::basic_istream_view<int, char, std::char_traits<char> >]
         && sized_sentinel_for<sentinel_t<_Derived>, iterator_t<_Derived>>
                               ^~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ranges:956:14: note: in instantiation of template class 'std::ranges::view_interface<std::ranges::basic_istream_view<int, char, std::char_traits<char> > >' requested here
     : public view_interface<basic_istream_view<_Val, _CharT, _Traits>>
              ^
istream_begin.cpp:9:14: note: in instantiation of template class 'std::ranges::basic_istream_view<int, char, std::char_traits<char> >' requested here
   auto view{ std::ranges::istream_view<int>(ints) };
              ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:876:12: note: because 'std::ranges::basic_istream_view<int, char, std::char_traits<char> >' does not satisfy 'range'
   template<range _Range>
            ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:864:2: note: because 'ranges::begin(__t)' would be invalid: no matching function for call to object of type 'const __cust_access::_Begin'
         ranges::begin(__t);
         ^
In file included from istream_begin.cpp:3:
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ranges:152:24: error: constraints not satisfied for alias template 'sentinel_t' [with _Range = const std::ranges::basic_istream_view<int, char, std::char_traits<char> >]
         && sized_sentinel_for<sentinel_t<const _Derived>,
                               ^~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:876:12: note: because 'const std::ranges::basic_istream_view<int, char, std::char_traits<char> >' does not satisfy 'range'
   template<range _Range>
            ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:864:2: note: because 'ranges::begin(__t)' would be invalid: no matching function for call to object of type 'const __cust_access::_Begin'
         ranges::begin(__t);
         ^
istream_begin.cpp:10:15: error: no matching function for call to object of type 'const __cust_access::_Begin'
   auto begin{ std::ranges::begin(view) };
               ^~~~~~~~~~~~~~~~~~
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:400:2: note: candidate template ignored: constraints not satisfied [with _Tp = std::ranges::basic_istream_view<int, char, std::char_traits<char> > &]
         operator()(_Tp&& __t) const noexcept(_S_noexcept<_Tp>())
         ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:397:11: note: because 'is_array_v<remove_reference_t<std::ranges::basic_istream_view<int, char, std::char_traits<char> > &> >' evaluated to false
         requires is_array_v<remove_reference_t<_Tp>> || __member_begin<_Tp>
                  ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:397:50: note: and 'std::ranges::basic_istream_view<int, char, std::char_traits<char> > &' does not satisfy '__member_begin'
         requires is_array_v<remove_reference_t<_Tp>> || __member_begin<_Tp>
                                                         ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:867:33: note: because '__detail::__decay_copy(__t.begin())' would be invalid: no member named 'begin' in 'std::ranges::basic_istream_view<int, char, std::char_traits<char> >'
           { __detail::__decay_copy(__t.begin()) } -> input_or_output_iterator;
                                        ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:398:7: note: and 'std::ranges::basic_istream_view<int, char, std::char_traits<char> > &' does not satisfy '__adl_begin'
           >> __adl_begin<_Tp>
              ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:877:29: note: because '__detail::__decay_copy(begin(__t))' would be invalid: call to deleted function 'begin'
           { __detail::__decay_copy(begin(__t)) } -> input_or_output_iterator;
                                    ^
5 errors generated.

Can you try calling begin() on an istream_view& directly, and see
if you get the same error?

$ cat istream_begin.cpp
#include
#include
#include
#include

int main()
{
auto ints = std::istringstream{“0 1 2 3 4”};
auto view{ std::ranges::istream_view(ints) };
auto begin{ std::ranges::begin(view) };

Here, Clang claims istream_view has no member named ‘begin’, during satisfaction checking.

assert(&*view.begin() == &*begin);

… but Clang accepts this. There’s definitely something wrong here.

Can you humor me for a second and try calling ‘view.begin()’ directly before using std::ranges::begin? (I’m suspicious that we’re somehow not triggering instantiation of istream_view until too late; calling ‘view.begin()’ earlier would resolve the problem if that’s the case.)

Can you humor me for a second and try calling 'view.begin()' directly before using std::ranges::begin? (I'm suspicious that we're somehow not triggering instantiation of istream_view<int> until too late; calling 'view.begin()' earlier would resolve the problem if that's the case.)

$ cat istream_begin.cpp
#include <cassert>
#include <iostream>
#include <ranges>
#include <sstream>

int main()
{
   auto ints = std::istringstream{"0 1 2 3 4"};
   auto view{ std::ranges::istream_view<int>(ints) };
   auto view_begin{ view.begin() };
   auto begin{ std::ranges::begin(view) };
   assert(&*view_begin == &*begin);
}
$ clang++ -std=c++20 istream_begin.cpp
In file included from istream_begin.cpp:2:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/iostream:39:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ostream:38:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ios:40:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/char_traits.h:39:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/stl_algobase.h:65:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/stl_iterator_base_types.h:71:
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:902:13: error: no matching function for call to '__ranges_begin'
         = decltype(__detail::__ranges_begin(std::declval<_Tp&>()));
                    ^~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:874:5: note: in instantiation of template type alias '__range_iter_t' requested here
     using iterator_t = std::__detail::__range_iter_t<_Tp>;
     ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ranges:134:43: note: in instantiation of template type alias 'iterator_t' requested here
       data() requires contiguous_iterator<iterator_t<_Derived>>
                                           ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ranges:956:14: note: in instantiation of template class 'std::ranges::view_interface<std::ranges::basic_istream_view<int, char, std::char_traits<char> > >' requested here
     : public view_interface<basic_istream_view<_Val, _CharT, _Traits>>
              ^
istream_begin.cpp:9:14: note: in instantiation of template class 'std::ranges::basic_istream_view<int, char, std::char_traits<char> >' requested here
   auto view{ std::ranges::istream_view<int>(ints) };
              ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:885:7: note: candidate template ignored: constraints not satisfied [with _Tp = std::ranges::basic_istream_view<int, char, std::char_traits<char> >]
       __ranges_begin(_Tp& __t)
       ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:883:16: note: because 'is_array_v<std::ranges::basic_istream_view<int, char, std::char_traits<char> > >' evaluated to false
       requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
                ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:883:35: note: and 'std::ranges::basic_istream_view<int, char, std::char_traits<char> > &' does not satisfy '__member_begin'
       requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
                                   ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:867:33: note: because '__detail::__decay_copy(__t.begin())' would be invalid: no member named 'begin' in 'std::ranges::basic_istream_view<int, char, std::char_traits<char> >'
           { __detail::__decay_copy(__t.begin()) } -> input_or_output_iterator;
                                        ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:883:59: note: and 'std::ranges::basic_istream_view<int, char, std::char_traits<char> > &' does not satisfy '__adl_begin'
       requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
                                                           ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:877:29: note: because '__detail::__decay_copy(begin(__t))' would be invalid: call to deleted function 'begin'
           { __detail::__decay_copy(begin(__t)) } -> input_or_output_iterator;
                                    ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:902:13: error: no matching function for call to '__ranges_begin'
         = decltype(__detail::__ranges_begin(std::declval<_Tp&>()));
                    ^~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:874:5: note: in instantiation of template type alias '__range_iter_t' requested here
     using iterator_t = std::__detail::__range_iter_t<_Tp>;
     ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ranges:140:25: note: in instantiation of template type alias 'iterator_t' requested here
         && contiguous_iterator<iterator_t<const _Derived>>
                                ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ranges:956:14: note: in instantiation of template class 'std::ranges::view_interface<std::ranges::basic_istream_view<int, char, std::char_traits<char> > >' requested here
     : public view_interface<basic_istream_view<_Val, _CharT, _Traits>>
              ^
istream_begin.cpp:9:14: note: in instantiation of template class 'std::ranges::basic_istream_view<int, char, std::char_traits<char> >' requested here
   auto view{ std::ranges::istream_view<int>(ints) };
              ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:885:7: note: candidate template ignored: constraints not satisfied [with _Tp = const std::ranges::basic_istream_view<int, char, std::char_traits<char> >]
       __ranges_begin(_Tp& __t)
       ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:883:16: note: because 'is_array_v<const std::ranges::basic_istream_view<int, char, std::char_traits<char> > >' evaluated to false
       requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
                ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:883:35: note: and 'const std::ranges::basic_istream_view<int, char, std::char_traits<char> > &' does not satisfy '__member_begin'
       requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
                                   ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:867:33: note: because '__detail::__decay_copy(__t.begin())' would be invalid: no member named 'begin' in 'std::ranges::basic_istream_view<int, char, std::char_traits<char> >'
           { __detail::__decay_copy(__t.begin()) } -> input_or_output_iterator;
                                        ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:883:59: note: and 'const std::ranges::basic_istream_view<int, char, std::char_traits<char> > &' does not satisfy '__adl_begin'
       requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
                                                           ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:877:29: note: because '__detail::__decay_copy(begin(__t))' would be invalid: call to deleted function 'begin'
           { __detail::__decay_copy(begin(__t)) } -> input_or_output_iterator;
                                    ^
In file included from istream_begin.cpp:3:
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ranges:146:24: error: constraints not satisfied for alias template 'sentinel_t' [with _Range = std::ranges::basic_istream_view<int, char, std::char_traits<char> >]
         && sized_sentinel_for<sentinel_t<_Derived>, iterator_t<_Derived>>
                               ^~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ranges:956:14: note: in instantiation of template class 'std::ranges::view_interface<std::ranges::basic_istream_view<int, char, std::char_traits<char> > >' requested here
     : public view_interface<basic_istream_view<_Val, _CharT, _Traits>>
              ^
istream_begin.cpp:9:14: note: in instantiation of template class 'std::ranges::basic_istream_view<int, char, std::char_traits<char> >' requested here
   auto view{ std::ranges::istream_view<int>(ints) };
              ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:876:12: note: because 'std::ranges::basic_istream_view<int, char, std::char_traits<char> >' does not satisfy 'range'
   template<range _Range>
            ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:864:2: note: because 'ranges::begin(__t)' would be invalid: no matching function for call to object of type 'const __cust_access::_Begin'
         ranges::begin(__t);
         ^
In file included from istream_begin.cpp:3:
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/ranges:152:24: error: constraints not satisfied for alias template 'sentinel_t' [with _Range = const std::ranges::basic_istream_view<int, char, std::char_traits<char> >]
         && sized_sentinel_for<sentinel_t<const _Derived>,
                               ^~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:876:12: note: because 'const std::ranges::basic_istream_view<int, char, std::char_traits<char> >' does not satisfy 'range'
   template<range _Range>
            ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:864:2: note: because 'ranges::begin(__t)' would be invalid: no matching function for call to object of type 'const __cust_access::_Begin'
         ranges::begin(__t);
         ^
istream_begin.cpp:11:15: error: no matching function for call to object of type 'const __cust_access::_Begin'
   auto begin{ std::ranges::begin(view) };
               ^~~~~~~~~~~~~~~~~~
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:400:2: note: candidate template ignored: constraints not satisfied [with _Tp = std::ranges::basic_istream_view<int, char, std::char_traits<char> > &]
         operator()(_Tp&& __t) const noexcept(_S_noexcept<_Tp>())
         ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:397:11: note: because 'is_array_v<remove_reference_t<std::ranges::basic_istream_view<int, char, std::char_traits<char> > &> >' evaluated to false
         requires is_array_v<remove_reference_t<_Tp>> || __member_begin<_Tp>
                  ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:397:50: note: and 'std::ranges::basic_istream_view<int, char, std::char_traits<char> > &' does not satisfy '__member_begin'
         requires is_array_v<remove_reference_t<_Tp>> || __member_begin<_Tp>
                                                         ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:867:33: note: because '__detail::__decay_copy(__t.begin())' would be invalid: no member named 'begin' in 'std::ranges::basic_istream_view<int, char, std::char_traits<char> >'
           { __detail::__decay_copy(__t.begin()) } -> input_or_output_iterator;
                                        ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/range_access.h:398:7: note: and 'std::ranges::basic_istream_view<int, char, std::char_traits<char> > &' does not satisfy '__adl_begin'
           >> __adl_begin<_Tp>
              ^
/usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/bits/iterator_concepts.h:877:29: note: because '__detail::__decay_copy(begin(__t))' would be invalid: call to deleted function 'begin'
           { __detail::__decay_copy(begin(__t)) } -> input_or_output_iterator;
                                    ^
5 errors generated.

Dear clang developers,

Anno March 2022 there are still similar issues when trying to use ranges with a recent clang and libstdc++…

see e.g.

Could a fix for this issue please be re-prioritized ?

kind regards,
Niek