diff --git a/libcxx/test/std/ranges/range.adaptors/range.drop/begin.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.drop/begin.pass.cpp --- a/libcxx/test/std/ranges/range.adaptors/range.drop/begin.pass.cpp +++ b/libcxx/test/std/ranges/range.adaptors/range.drop/begin.pass.cpp @@ -19,11 +19,31 @@ #include #include "test_macros.h" +#include "test_iterators.h" #include "types.h" template concept BeginInvocable = requires(std::ranges::drop_view t) { t.begin(); }; +struct SimpleView : std::ranges::view_base { + bool non_const_begin_called{false}; + constexpr int* begin() { + non_const_begin_called = true; + return nullptr; + } + constexpr int* begin() const { return nullptr; } + constexpr int* end() const { return nullptr; } + constexpr std::size_t size() const { return 0u; } +}; + +struct NonSimpleView : std::ranges::view_base { + int* begin(); + const int* begin() const; + int* end(); + const int* end() const; + std::size_t size() const; +}; + constexpr bool test() { // random_access_range && sized_range std::ranges::drop_view dropView1(MoveOnlyView(), 4); @@ -62,6 +82,20 @@ static_assert(!BeginInvocable); + // simple_view && random_access_range && sized_range + { + std::ranges::drop_view dropView(SimpleView{}, 4); + dropView.begin(); + assert(!dropView.base().non_const_begin_called); + } + + // !simple_view && random_access_range && sized_range + { + using DropView = std::ranges::drop_view; + static_assert(std::same_as().begin()), int*>); + static_assert(std::same_as().begin()), const int*>); + } + return true; } diff --git a/libcxx/test/std/ranges/range.adaptors/range.join.view/begin.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.join.view/begin.pass.cpp --- a/libcxx/test/std/ranges/range.adaptors/range.join.view/begin.pass.cpp +++ b/libcxx/test/std/ranges/range.adaptors/range.join.view/begin.pass.cpp @@ -19,6 +19,11 @@ #include "test_macros.h" #include "types.h" +struct SimpleParentView : std::ranges::view_base { + const ChildView* begin() const; + const ChildView* end() const; +}; + constexpr bool test() { int buffer[4][4] = {{1111, 2222, 3333, 4444}, {555, 666, 777, 888}, {99, 1010, 1111, 1212}, {13, 14, 15, 16}}; @@ -86,6 +91,20 @@ assert(*jv.begin() == 1111); } + // !simple-view + { + using WithNonSimpleBase = std::ranges::join_view>; + static_assert(!std::same_as().begin()), + decltype(std::declval().begin())>); + } + + // simple-view && is_reference_v>; + { + using WithSimpleBase = std::ranges::join_view; + static_assert(std::same_as().begin()), + decltype(std::declval().begin())>); + } + return true; }