diff --git a/libcxx/test/std/ranges/range.adaptors/range.join.view/iterator/ctor.default.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.join.view/iterator/ctor.default.pass.cpp --- a/libcxx/test/std/ranges/range.adaptors/range.join.view/iterator/ctor.default.pass.cpp +++ b/libcxx/test/std/ranges/range.adaptors/range.join.view/iterator/ctor.default.pass.cpp @@ -23,16 +23,16 @@ T *ptr_; constexpr DefaultCtorParent(T *ptr) : ptr_(ptr) {} - constexpr cpp17_input_iterator begin() { return cpp17_input_iterator(ptr_); } - constexpr cpp17_input_iterator begin() const { return cpp17_input_iterator(ptr_); } + constexpr forward_iterator begin() { return forward_iterator(ptr_); } + constexpr forward_iterator begin() const { return forward_iterator(ptr_); } constexpr T *end() { return ptr_ + 4; } constexpr const T *end() const { return ptr_ + 4; } }; template -constexpr bool operator==(const cpp17_input_iterator &lhs, const T *rhs) { return lhs.base() == rhs; } +constexpr bool operator==(const forward_iterator &lhs, const T *rhs) { return lhs.base() == rhs; } template -constexpr bool operator==(const T *lhs, const cpp17_input_iterator &rhs) { return rhs.base() == lhs; } +constexpr bool operator==(const T *lhs, const forward_iterator &rhs) { return rhs.base() == lhs; } constexpr bool test() { using Base = DefaultCtorParent; diff --git a/libcxx/test/std/ranges/range.adaptors/range.join.view/iterator/member_types.compile.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.join.view/iterator/member_types.compile.pass.cpp --- a/libcxx/test/std/ranges/range.adaptors/range.join.view/iterator/member_types.compile.pass.cpp +++ b/libcxx/test/std/ranges/range.adaptors/range.join.view/iterator/member_types.compile.pass.cpp @@ -20,18 +20,18 @@ template struct ForwardView : std::ranges::view_base { - friend forward_iterator begin(ForwardView&) { return forward_iterator(nullptr); } - friend forward_iterator begin(ForwardView const&) { return forward_iterator(nullptr); } - friend forward_iterator end(ForwardView&) { return forward_iterator(nullptr); } - friend forward_iterator end(ForwardView const&) { return forward_iterator(nullptr); } + friend forward_iterator begin(ForwardView&); + friend forward_iterator begin(ForwardView const&); + friend sentinel_wrapper> end(ForwardView&); + friend sentinel_wrapper> end(ForwardView const&); }; template struct InputView : std::ranges::view_base { - friend cpp17_input_iterator begin(InputView&) { return cpp17_input_iterator(nullptr); } - friend cpp17_input_iterator begin(InputView const&) { return cpp17_input_iterator(nullptr); } - friend cpp17_input_iterator end(InputView&) { return cpp17_input_iterator(nullptr); } - friend cpp17_input_iterator end(InputView const&) { return cpp17_input_iterator(nullptr); } + friend cpp17_input_iterator begin(InputView&); + friend cpp17_input_iterator begin(InputView const&); + friend sentinel_wrapper> end(InputView&); + friend sentinel_wrapper> end(InputView const&); }; template diff --git a/libcxx/test/std/ranges/range.req/range.range/sentinel_t.compile.pass.cpp b/libcxx/test/std/ranges/range.req/range.range/sentinel_t.compile.pass.cpp --- a/libcxx/test/std/ranges/range.req/range.range/sentinel_t.compile.pass.cpp +++ b/libcxx/test/std/ranges/range.req/range.range/sentinel_t.compile.pass.cpp @@ -25,6 +25,6 @@ static_assert(std::same_as >, sentinel>); static_assert(std::same_as const>, sentinel>); static_assert(std::same_as >, sentinel>); -static_assert(std::same_as >, cpp17_input_iterator >); -static_assert(std::same_as const>, cpp17_input_iterator >); -static_assert(std::same_as >, cpp17_input_iterator >); +static_assert(std::same_as >, forward_iterator >); +static_assert(std::same_as const>, forward_iterator >); +static_assert(std::same_as >, forward_iterator >); diff --git a/libcxx/test/std/ranges/range.req/range.refinements/common_range.compile.pass.cpp b/libcxx/test/std/ranges/range.req/range.refinements/common_range.compile.pass.cpp --- a/libcxx/test/std/ranges/range.req/range.refinements/common_range.compile.pass.cpp +++ b/libcxx/test/std/ranges/range.req/range.refinements/common_range.compile.pass.cpp @@ -26,11 +26,11 @@ static_assert(!std::ranges::common_range >); static_assert(!std::ranges::common_range const>); -static_assert(std::ranges::common_range >); -static_assert(std::ranges::common_range const>); +static_assert(std::ranges::common_range >); +static_assert(std::ranges::common_range const>); -static_assert(std::ranges::common_range >); -static_assert(!std::ranges::common_range const>); +static_assert(std::ranges::common_range >); +static_assert(!std::ranges::common_range const>); struct subtly_not_common { int* begin() const; diff --git a/libcxx/test/std/ranges/range.req/range.refinements/input_range.compile.pass.cpp b/libcxx/test/std/ranges/range.req/range.refinements/input_range.compile.pass.cpp --- a/libcxx/test/std/ranges/range.req/range.refinements/input_range.compile.pass.cpp +++ b/libcxx/test/std/ranges/range.req/range.refinements/input_range.compile.pass.cpp @@ -32,14 +32,14 @@ static_assert(!std::ranges::input_range const>); static_assert(!std::ranges::input_range const>); -static_assert(std::ranges::input_range >); +static_assert(std::ranges::input_range >); static_assert(!std::ranges::input_range >); -static_assert(std::ranges::input_range const>); +static_assert(std::ranges::input_range const>); static_assert(!std::ranges::input_range const>); -static_assert(std::ranges::input_range >); +static_assert(std::ranges::input_range >); static_assert(!std::ranges::input_range >); -static_assert(!std::ranges::input_range const>); +static_assert(!std::ranges::input_range const>); static_assert(!std::ranges::input_range const>); diff --git a/libcxx/test/std/ranges/range.utility/range.subrange/advance.pass.cpp b/libcxx/test/std/ranges/range.utility/range.subrange/advance.pass.cpp --- a/libcxx/test/std/ranges/range.utility/range.subrange/advance.pass.cpp +++ b/libcxx/test/std/ranges/range.utility/range.subrange/advance.pass.cpp @@ -31,7 +31,7 @@ assert(a4.begin() == globalBuff + 4); assert(a4.size() == 4); - std::ranges::subrange b(InputIter(globalBuff), InputIter(globalBuff + 8)); + std::ranges::subrange> b(InputIter(globalBuff), sentinel_wrapper(InputIter(globalBuff + 8))); auto b1 = std::move(b).next(); assert(b1.begin().base() == globalBuff + 1); diff --git a/libcxx/test/support/test_iterators.h b/libcxx/test/support/test_iterators.h --- a/libcxx/test/support/test_iterators.h +++ b/libcxx/test/support/test_iterators.h @@ -66,7 +66,6 @@ TEST_CONSTEXPR_CXX14 It base() const {return it_;} - TEST_CONSTEXPR_CXX14 cpp17_input_iterator() : it_() {} explicit TEST_CONSTEXPR_CXX14 cpp17_input_iterator(It it) : it_(it) {} template TEST_CONSTEXPR_CXX14 cpp17_input_iterator(const cpp17_input_iterator& u) :it_(u.it_) {} @@ -848,9 +847,22 @@ template class sentinel_wrapper { public: - sentinel_wrapper() = default; + constexpr sentinel_wrapper() requires std::default_initializable : base_() { } + + // If the iterator itself is not default initializable (e.g. input iterators), we + // try to construct it from the base's iterator, which is sometimes default initializable. + constexpr sentinel_wrapper() requires (!std::default_initializable) + : base_(decltype(std::declval().base())()) + { } + constexpr explicit sentinel_wrapper(I base) : base_(std::move(base)) {} + sentinel_wrapper(sentinel_wrapper const&) = default; + sentinel_wrapper& operator=(sentinel_wrapper const&) = default; + + sentinel_wrapper(sentinel_wrapper&&) = default; + sentinel_wrapper& operator=(sentinel_wrapper&&) = default; + constexpr bool operator==(const I& other) const requires std::equality_comparable { return base_ == other; } @@ -865,7 +877,7 @@ } private: - I base_ = I(); + I base_; }; template