diff --git a/libcxx/test/std/containers/sequences/vector/vector.modifiers/insert_iter_iter_iter.addressof.compile.pass.cpp b/libcxx/test/std/containers/sequences/vector/vector.modifiers/insert_iter_iter_iter.addressof.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/vector/vector.modifiers/insert_iter_iter_iter.addressof.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/vector/vector.modifiers/insert_iter_iter_iter.addressof.compile.pass.cpp @@ -19,10 +19,9 @@ #include "operator_hijacker.h" #include "test_iterators.h" -void test() { +void test(cpp17_input_iterator i) { { std::vector v; - cpp17_input_iterator::iterator> i; v.insert(v.end(), i, i); } { diff --git a/libcxx/test/std/containers/sequences/vector/vector.modifiers/insert_iter_iter_iter.pass.cpp b/libcxx/test/std/containers/sequences/vector/vector.modifiers/insert_iter_iter_iter.pass.cpp --- a/libcxx/test/std/containers/sequences/vector/vector.modifiers/insert_iter_iter_iter.pass.cpp +++ b/libcxx/test/std/containers/sequences/vector/vector.modifiers/insert_iter_iter_iter.pass.cpp @@ -179,7 +179,7 @@ { std::vector s; - s.insert(s.end(), cpp17_input_iterator(), cpp17_input_iterator()); + s.insert(s.end(), cpp17_input_iterator(nullptr), cpp17_input_iterator(nullptr)); } return 0; diff --git a/libcxx/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.advance/iterator_sentinel.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.advance/iterator_sentinel.pass.cpp --- a/libcxx/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.advance/iterator_sentinel.pass.cpp +++ b/libcxx/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.advance/iterator_sentinel.pass.cpp @@ -15,6 +15,7 @@ #include #include +#include #include "test_iterators.h" @@ -44,61 +45,103 @@ std::ptrdiff_t count_ = 0; }; -template Sent = It> -constexpr void check_assignable_case(std::ptrdiff_t const n) { +template +constexpr void check_assignable_case() { auto range = range_t{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - auto first = stride_counting_iterator(It(range.begin())); - std::ranges::advance(first, stride_counting_iterator(Sent(It(range.begin() + n)))); - assert(first.base().base() == range.begin() + n); - assert(first.stride_count() == 0); // because we got here by assigning from last, not by incrementing + + for (std::ptrdiff_t n = 0; n != 9; ++n) { + { + It first(range.begin()); + Sent last(It(range.begin() + n)); + std::ranges::advance(first, last); + assert(base(first) == range.begin() + n); + } + + // Count operations + if constexpr (std::is_same_v) { + stride_counting_iterator first(It(range.begin())); + stride_counting_iterator last(It(range.begin() + n)); + std::ranges::advance(first, last); + assert(first.base().base() == range.begin() + n); + assert(first.stride_count() == 0); // because we got here by assigning from last, not by incrementing + } + } } -template -constexpr void check_sized_sentinel_case(std::ptrdiff_t const n) { +template +constexpr void check_sized_sentinel_case() { auto range = range_t{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - auto first = stride_counting_iterator(It(range.begin())); - std::ranges::advance(first, distance_apriori_sentinel(n)); - - assert(first.base().base() == range.begin() + n); - if constexpr (std::random_access_iterator) { - assert(first.stride_count() == 1); - assert(first.stride_displacement() == 1); - } else { - assert(first.stride_count() == n); - assert(first.stride_displacement() == n); + + for (std::ptrdiff_t n = 0; n != 9; ++n) { + { + It first(range.begin()); + distance_apriori_sentinel last(n); + std::ranges::advance(first, last); + assert(base(first) == range.begin() + n); + } + + // Count operations + { + stride_counting_iterator first(It(range.begin())); + distance_apriori_sentinel last(n); + std::ranges::advance(first, last); + + assert(first.base().base() == range.begin() + n); + if constexpr (std::random_access_iterator) { + assert(first.stride_count() == 1); + assert(first.stride_displacement() == 1); + } else { + assert(first.stride_count() == n); + assert(first.stride_displacement() == n); + } + } } } -template -constexpr void check_sentinel_case(std::ptrdiff_t const n) { +template +constexpr void check_sentinel_case() { auto range = range_t{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - auto first = stride_counting_iterator(It(range.begin())); - auto const last = It(range.begin() + n); - std::ranges::advance(first, sentinel_wrapper(last)); - assert(first.base() == last); - assert(first.stride_count() == n); + + for (std::ptrdiff_t n = 0; n != 9; ++n) { + { + It first(range.begin()); + sentinel_wrapper last(It(range.begin() + n)); + std::ranges::advance(first, last); + assert(base(first) == range.begin() + n); + } + + // Count operations + { + stride_counting_iterator first(It(range.begin())); + sentinel_wrapper last(It(range.begin() + n)); + std::ranges::advance(first, last); + assert(first.base() == last); + assert(first.stride_count() == n); + } + } } constexpr bool test() { - check_assignable_case >(1); - check_assignable_case >(3); - check_assignable_case >(4); - check_assignable_case >(5); - check_assignable_case >(6); - - check_sized_sentinel_case >(7); - check_sized_sentinel_case >(6); - check_sized_sentinel_case >(5); - check_sized_sentinel_case >(4); - check_sized_sentinel_case >(3); - check_sized_sentinel_case >(2); - - check_sentinel_case >(1); + using It = range_t::const_iterator; + check_assignable_case, sentinel_wrapper>>(); + check_assignable_case>(); + check_assignable_case>(); + check_assignable_case>(); + check_assignable_case>(); + + check_sized_sentinel_case>(); + check_sized_sentinel_case>(); + check_sized_sentinel_case>(); + check_sized_sentinel_case>(); + check_sized_sentinel_case>(); + check_sized_sentinel_case>(); + + check_sentinel_case>(); // cpp20_input_iterator not copyable, so is omitted - check_sentinel_case >(3); - check_sentinel_case >(4); - check_sentinel_case >(5); - check_sentinel_case >(6); + check_sentinel_case>(); + check_sentinel_case>(); + check_sentinel_case>(); + check_sentinel_case>(); return true; } diff --git a/libcxx/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.next/iterator_count_sentinel.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.next/iterator_count_sentinel.pass.cpp --- a/libcxx/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.next/iterator_count_sentinel.pass.cpp +++ b/libcxx/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.next/iterator_count_sentinel.pass.cpp @@ -13,18 +13,19 @@ #include #include +#include #include "test_iterators.h" -template -constexpr void check(It it, std::ptrdiff_t n, It last) { +template +constexpr void check(It it, std::ptrdiff_t n, Sent last) { { It result = std::ranges::next(it, n, last); assert(result == last); } // Count the number of operations - { + if constexpr (std::is_same_v) { stride_counting_iterator strided_it(it); stride_counting_iterator strided_last(last); stride_counting_iterator result = std::ranges::next(strided_it, n, strided_last); @@ -46,13 +47,13 @@ constexpr bool test() { int range[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - check(cpp17_input_iterator(&range[0]), 1, cpp17_input_iterator(&range[1])); + check(cpp17_input_iterator(&range[0]), 1, sentinel_wrapper(cpp17_input_iterator(&range[1]))); check(forward_iterator(&range[0]), 2, forward_iterator(&range[2])); check(bidirectional_iterator(&range[2]), 6, bidirectional_iterator(&range[8])); check(random_access_iterator(&range[3]), 2, random_access_iterator(&range[5])); check(contiguous_iterator(&range[0]), 5, contiguous_iterator(&range[5])); - check(cpp17_input_iterator(&range[0]), 0, cpp17_input_iterator(&range[0])); + check(cpp17_input_iterator(&range[0]), 0, sentinel_wrapper(cpp17_input_iterator(&range[0]))); check(forward_iterator(&range[0]), 0, forward_iterator(&range[0])); check(bidirectional_iterator(&range[2]), 0, bidirectional_iterator(&range[2])); check(random_access_iterator(&range[3]), 0, random_access_iterator(&range[3])); diff --git a/libcxx/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.next/iterator_sentinel.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.next/iterator_sentinel.pass.cpp --- a/libcxx/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.next/iterator_sentinel.pass.cpp +++ b/libcxx/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.next/iterator_sentinel.pass.cpp @@ -21,6 +21,20 @@ using range_t = std::array; +// Sentinel type that can be assigned to an iterator. This is to test the case where +// std::ranges::next uses assignment instead of successive increments below. +template +class assignable_sentinel { +public: + explicit assignable_sentinel() = default; + constexpr explicit assignable_sentinel(const It& it) : base_(base(it)) {} + constexpr operator It() const { return It(base_); } + constexpr bool operator==(const It& other) const { return base_ == base(other); } + friend constexpr It base(const assignable_sentinel& s) { return It(s.base_); } +private: + decltype(base(std::declval())) base_; +}; + class distance_apriori_sentinel { public: distance_apriori_sentinel() = default; @@ -45,39 +59,39 @@ std::ptrdiff_t count_ = 0; }; -template -constexpr void check_assignable(It it, It last, int const* expected) { +template +constexpr void check_assignable(int* it, int* last, int const* expected) { { - It result = std::ranges::next(std::move(it), std::move(last)); - assert(&*result == expected); + It result = std::ranges::next(It(it), assignable_sentinel(It(last))); + assert(base(result) == expected); } // Count operations - { - auto strided_it = stride_counting_iterator(std::move(it)); - auto strided_last = stride_counting_iterator(std::move(last)); - auto result = std::ranges::next(std::move(strided_it), std::move(strided_last)); - assert(&*result == expected); + if constexpr (Count) { + auto strided_it = stride_counting_iterator(It(it)); + auto strided_last = assignable_sentinel(stride_counting_iterator(It(last))); + stride_counting_iterator result = std::ranges::next(std::move(strided_it), std::move(strided_last)); + assert(base(result.base()) == expected); assert(result.stride_count() == 0); // because we got here by assigning from last, not by incrementing } } -template -constexpr void check_sized_sentinel(It it, It last, int const* expected) { - auto n = (last.base() - it.base()); +template +constexpr void check_sized_sentinel(int* it, int* last, int const* expected) { + auto n = (last - it); { auto sent = distance_apriori_sentinel(n); - auto result = std::ranges::next(std::move(it), sent); - assert(&*result == expected); + auto result = std::ranges::next(It(it), sent); + assert(base(result) == expected); } // Count operations { - auto strided_it = stride_counting_iterator(std::move(it)); + auto strided_it = stride_counting_iterator(It(it)); auto sent = distance_apriori_sentinel(n); auto result = std::ranges::next(std::move(strided_it), sent); - assert(&*result == expected); + assert(base(result.base()) == expected); if constexpr (std::random_access_iterator) { assert(result.stride_count() == 1); // should have used exactly one += @@ -89,22 +103,22 @@ } } -template -constexpr void check_sentinel(It it, It last, int const* expected) { - auto n = (last.base() - it.base()); +template +constexpr void check_sentinel(int* it, int* last, int const* expected) { + auto n = (last - it); { - auto sent = sentinel_wrapper(last); - It result = std::ranges::next(std::move(it), sent); - assert(&*result == expected); + auto sent = sentinel_wrapper(It(last)); + It result = std::ranges::next(It(it), sent); + assert(base(result) == expected); } // Count operations - { - auto strided_it = stride_counting_iterator(it); - auto sent = sentinel_wrapper(stride_counting_iterator(last)); + if constexpr (Count) { + auto strided_it = stride_counting_iterator(It(it)); + auto sent = sentinel_wrapper(stride_counting_iterator(It(last))); stride_counting_iterator result = std::ranges::next(std::move(strided_it), sent); - assert(&*result == expected); + assert(base(result.base()) == expected); assert(result.stride_count() == n); // must have used ++ until it hit the sentinel } } @@ -112,25 +126,25 @@ constexpr bool test() { int range[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - check_assignable(cpp17_input_iterator(&range[0]), cpp17_input_iterator(&range[2]), &range[2]); - check_assignable(forward_iterator(&range[0]), forward_iterator(&range[3]), &range[3]); - check_assignable(bidirectional_iterator(&range[0]), bidirectional_iterator(&range[4]), &range[4]); - check_assignable(random_access_iterator(&range[0]), random_access_iterator(&range[5]), &range[5]); - check_assignable(contiguous_iterator(&range[0]), contiguous_iterator(&range[6]), &range[6]); + check_assignable>( &range[0], &range[2], &range[2]); + check_assignable>( &range[0], &range[3], &range[3]); + check_assignable>(&range[0], &range[4], &range[4]); + check_assignable>(&range[0], &range[5], &range[5]); + check_assignable>( &range[0], &range[6], &range[6]); - check_sized_sentinel(cpp17_input_iterator(&range[0]), cpp17_input_iterator(&range[7]), &range[7]); - check_sized_sentinel(cpp20_input_iterator(&range[0]), cpp20_input_iterator(&range[6]), &range[6]); - check_sized_sentinel(forward_iterator(&range[0]), forward_iterator(&range[5]), &range[5]); - check_sized_sentinel(bidirectional_iterator(&range[0]), bidirectional_iterator(&range[4]), &range[4]); - check_sized_sentinel(random_access_iterator(&range[0]), random_access_iterator(&range[3]), &range[3]); - check_sized_sentinel(contiguous_iterator(&range[0]), contiguous_iterator(&range[2]), &range[2]); + check_sized_sentinel>( &range[0], &range[7], &range[7]); + check_sized_sentinel>( &range[0], &range[6], &range[6]); + check_sized_sentinel>( &range[0], &range[5], &range[5]); + check_sized_sentinel>(&range[0], &range[4], &range[4]); + check_sized_sentinel>(&range[0], &range[3], &range[3]); + check_sized_sentinel>( &range[0], &range[2], &range[2]); - check_sentinel(cpp17_input_iterator(&range[0]), cpp17_input_iterator(&range[1]), &range[1]); + check_sentinel>( &range[0], &range[1], &range[1]); // cpp20_input_iterator not copyable, so is omitted - check_sentinel(forward_iterator(&range[0]), forward_iterator(&range[3]), &range[3]); - check_sentinel(bidirectional_iterator(&range[0]), bidirectional_iterator(&range[4]), &range[4]); - check_sentinel(random_access_iterator(&range[0]), random_access_iterator(&range[5]), &range[5]); - check_sentinel(contiguous_iterator(&range[0]), contiguous_iterator(&range[6]), &range[6]); + check_sentinel>( &range[0], &range[3], &range[3]); + check_sentinel>(&range[0], &range[4], &range[4]); + check_sentinel>(&range[0], &range[5], &range[5]); + check_sentinel>( &range[0], &range[6], &range[6]); return true; } diff --git a/libcxx/test/std/iterators/predef.iterators/counted.iterator/ctor.default.pass.cpp b/libcxx/test/std/iterators/predef.iterators/counted.iterator/ctor.default.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/counted.iterator/ctor.default.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/counted.iterator/ctor.default.pass.cpp @@ -17,11 +17,11 @@ #include "test_iterators.h" constexpr bool test() { - static_assert( std::default_initializable>>); - static_assert(!std::default_initializable>>); + static_assert(!std::default_initializable>>); + static_assert( std::default_initializable>>); - std::counted_iterator> iter; - assert(iter.base() == cpp17_input_iterator()); + std::counted_iterator> iter; + assert(iter.base() == forward_iterator()); assert(iter.count() == 0); return true; diff --git a/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/default.pass.cpp b/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/default.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/default.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/default.pass.cpp @@ -29,7 +29,7 @@ int main(int, char**) { - test >(); + // we don't have a test iterator that is both input and default-constructible, so not testing that case test >(); test >(); test >(); diff --git a/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op=/move_iterator.pass.cpp b/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op=/move_iterator.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op=/move_iterator.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op=/move_iterator.pass.cpp @@ -28,7 +28,7 @@ test(U u) { const std::move_iterator r2(u); - std::move_iterator r1; + std::move_iterator r1(It(nullptr)); std::move_iterator& rr = (r1 = r2); assert(r1.base() == u); assert(&rr == &r1); 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,14 @@ 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); } + forward_iterator begin() const; + sentinel_wrapper> end() 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); } + cpp17_input_iterator begin() const; + sentinel_wrapper> end() 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 @@ -16,41 +16,51 @@ #include #include "test_iterators.h" -#include "test_range.h" +template struct Common { It begin() const; It end() const; }; +template struct NonCommon { It begin() const; sentinel_wrapper end() const; }; +template struct Range { It begin() const; Sent end() const; }; +static_assert(!std::ranges::common_range>>); // not a sentinel for itself +static_assert(!std::ranges::common_range>>); // not a sentinel for itself +static_assert( std::ranges::common_range>>); +static_assert( std::ranges::common_range>>); +static_assert( std::ranges::common_range>>); +static_assert( std::ranges::common_range>>); +static_assert( std::ranges::common_range>); -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>>); +static_assert(!std::ranges::common_range>>); +static_assert(!std::ranges::common_range>>); +static_assert(!std::ranges::common_range>>); +static_assert(!std::ranges::common_range>>); +static_assert(!std::ranges::common_range>); -static_assert(!std::ranges::common_range >); -static_assert(!std::ranges::common_range const>); +// Test when begin() and end() only differ by their constness. +static_assert(!std::ranges::common_range>); -static_assert(std::ranges::common_range >); -static_assert(std::ranges::common_range const>); +// Simple test with a sized_sentinel. +static_assert(!std::ranges::common_range>>); -static_assert(std::ranges::common_range >); -static_assert(!std::ranges::common_range const>); +// Make sure cv-qualification doesn't impact the concept when begin() and end() have matching qualifiers. +static_assert( std::ranges::common_range> const>); +static_assert(!std::ranges::common_range> const>); -struct subtly_not_common { - int* begin() const; +// Test with a range that's a common_range only when const-qualified. +struct Range1 { + int* begin(); + int const* begin() const; int const* end() const; }; -static_assert(std::ranges::range && !std::ranges::common_range); -static_assert(std::ranges::range && !std::ranges::common_range); +static_assert(!std::ranges::common_range); +static_assert( std::ranges::common_range); -struct common_range_non_const_only { +// Test with a range that's a common_range only when not const-qualified. +struct Range2 { int* begin() const; int* end(); int const* end() const; }; -static_assert(std::ranges::range&& std::ranges::common_range); -static_assert(std::ranges::range && !std::ranges::common_range); - -struct common_range_const_only { - int* begin(); - int const* begin() const; - int const* end() const; -}; -static_assert(std::ranges::range && !std::ranges::common_range); -static_assert(std::ranges::range&& std::ranges::common_range); +static_assert( std::ranges::common_range); +static_assert(!std::ranges::common_range); 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/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp b/libcxx/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp @@ -178,9 +178,9 @@ typedef ThrowingIterator TIter; typedef cpp17_input_iterator IIter; const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - test_exceptions(S(), IIter(TIter(s, s+10, 4, TIter::TAIncrement)), IIter()); - test_exceptions(S(), IIter(TIter(s, s+10, 5, TIter::TADereference)), IIter()); - test_exceptions(S(), IIter(TIter(s, s+10, 6, TIter::TAComparison)), IIter()); + test_exceptions(S(), IIter(TIter(s, s+10, 4, TIter::TAIncrement)), IIter(TIter())); + test_exceptions(S(), IIter(TIter(s, s+10, 5, TIter::TADereference)), IIter(TIter())); + test_exceptions(S(), IIter(TIter(s, s+10, 6, TIter::TAComparison)), IIter(TIter())); test_exceptions(S(), TIter(s, s+10, 4, TIter::TAIncrement), TIter()); test_exceptions(S(), TIter(s, s+10, 5, TIter::TADereference), TIter()); diff --git a/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/iterator.pass.cpp b/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/iterator.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/iterator.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/iterator.pass.cpp @@ -178,9 +178,9 @@ typedef ThrowingIterator TIter; typedef cpp17_input_iterator IIter; const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - test_exceptions(S(), IIter(TIter(s, s+10, 4, TIter::TAIncrement)), IIter()); - test_exceptions(S(), IIter(TIter(s, s+10, 5, TIter::TADereference)), IIter()); - test_exceptions(S(), IIter(TIter(s, s+10, 6, TIter::TAComparison)), IIter()); + test_exceptions(S(), IIter(TIter(s, s+10, 4, TIter::TAIncrement)), IIter(TIter())); + test_exceptions(S(), IIter(TIter(s, s+10, 5, TIter::TADereference)), IIter(TIter())); + test_exceptions(S(), IIter(TIter(s, s+10, 6, TIter::TAComparison)), IIter(TIter())); test_exceptions(S(), TIter(s, s+10, 4, TIter::TAIncrement), TIter()); test_exceptions(S(), TIter(s, s+10, 5, TIter::TADereference), TIter()); diff --git a/libcxx/test/std/strings/basic.string/string.modifiers/string_insert/iter_iter_iter.pass.cpp b/libcxx/test/std/strings/basic.string/string.modifiers/string_insert/iter_iter_iter.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.modifiers/string_insert/iter_iter_iter.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.modifiers/string_insert/iter_iter_iter.pass.cpp @@ -156,9 +156,9 @@ typedef ThrowingIterator TIter; typedef cpp17_input_iterator IIter; const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - test_exceptions(S(), 0, IIter(TIter(s, s+10, 4, TIter::TAIncrement)), IIter()); - test_exceptions(S(), 0, IIter(TIter(s, s+10, 5, TIter::TADereference)), IIter()); - test_exceptions(S(), 0, IIter(TIter(s, s+10, 6, TIter::TAComparison)), IIter()); + test_exceptions(S(), 0, IIter(TIter(s, s+10, 4, TIter::TAIncrement)), IIter(TIter())); + test_exceptions(S(), 0, IIter(TIter(s, s+10, 5, TIter::TADereference)), IIter(TIter())); + test_exceptions(S(), 0, IIter(TIter(s, s+10, 6, TIter::TAComparison)), IIter(TIter())); test_exceptions(S(), 0, TIter(s, s+10, 4, TIter::TAIncrement), TIter()); test_exceptions(S(), 0, TIter(s, s+10, 5, TIter::TADereference), TIter()); diff --git a/libcxx/test/std/strings/basic.string/string.modifiers/string_replace/iter_iter_iter_iter.pass.cpp b/libcxx/test/std/strings/basic.string/string.modifiers/string_replace/iter_iter_iter_iter.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.modifiers/string_replace/iter_iter_iter_iter.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.modifiers/string_replace/iter_iter_iter_iter.pass.cpp @@ -1008,9 +1008,9 @@ typedef ThrowingIterator TIter; typedef cpp17_input_iterator IIter; const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - test_exceptions(S("abcdefghijklmnopqrst"), 10, 5, IIter(TIter(s, s+10, 4, TIter::TAIncrement)), IIter()); - test_exceptions(S("abcdefghijklmnopqrst"), 10, 5, IIter(TIter(s, s+10, 5, TIter::TADereference)), IIter()); - test_exceptions(S("abcdefghijklmnopqrst"), 10, 5, IIter(TIter(s, s+10, 6, TIter::TAComparison)), IIter()); + test_exceptions(S("abcdefghijklmnopqrst"), 10, 5, IIter(TIter(s, s+10, 4, TIter::TAIncrement)), IIter(TIter())); + test_exceptions(S("abcdefghijklmnopqrst"), 10, 5, IIter(TIter(s, s+10, 5, TIter::TADereference)), IIter(TIter())); + test_exceptions(S("abcdefghijklmnopqrst"), 10, 5, IIter(TIter(s, s+10, 6, TIter::TAComparison)), IIter(TIter())); test_exceptions(S("abcdefghijklmnopqrst"), 10, 5, TIter(s, s+10, 4, TIter::TAIncrement), TIter()); test_exceptions(S("abcdefghijklmnopqrst"), 10, 5, TIter(s, s+10, 5, TIter::TADereference), TIter()); 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_) {}