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

            Bug ID: 100044
           Summary: ranges::subrange CTAD for __iterator_sentinel_pair not
                    work
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hewillk at gmail dot com
  Target Milestone: ---

libstdc++ defines the CATD of __iterator_sentinel_pair for the subranges in
ranges_util.h#L355:

355  template<__detail::__iterator_sentinel_pair _Pr>
356    subrange(_Pr)
357      -> subrange<tuple_element_t<0, _Pr>, tuple_element_t<1, _Pr>>;
358
359  template<__detail::__iterator_sentinel_pair _Pr>
360    subrange(_Pr, __detail::__make_unsigned_like_t<iter_difference_t<
361                                                  tuple_element_t<0, _Pr>>>)
362      -> subrange<tuple_element_t<0, _Pr>, tuple_element_t<1, _Pr>,
363               subrange_kind::sized>;

It should be for the convenience to create a subrange directly from the
iterator and sentinel pair:

#include <ranges>
#include <vector>

int main() {
  std::vector v1{1, 2, 3};
  std::pair p{v1.begin(), v1.end()};
  std::ranges::subrange sb{p};
}

But this seems to not work, since subrange(_Rng&& __r) will constraint the _Rng
 at the beginning, which will cause us to be blocked early:

<source>: In function 'int main()':
<source>:7:29: error: no matching function for call to
'std::ranges::subrange<__gnu_cxx::__normal_iterator<int*, std::vector<int,
std::allocator<int> > >, __gnu_cxx::__normal_iterator<int*, std::vector<int,
std::allocator<int> > >,
std::ranges::subrange_kind::sized>::subrange(<brace-enclosed initializer
list>)'
    7 |   std::ranges::subrange sb{p};

Should we consider it a library bug?

Reply via email to