From ba032a614a009c28eb1232efff7841c96eb828e0 Mon Sep 17 00:00:00 2001 From: zoecarver Date: Thu, 24 Jun 2021 11:05:14 -0700 Subject: [PATCH] [libcxx][ranges] Enable borrowed range for drop view when T has borrowing enabled. --- libcxx/include/__ranges/drop_view.h | 3 +++ .../test/std/ranges/range.adaptors/range.drop/general.pass.cpp | 5 ++++- libcxx/test/std/ranges/range.adaptors/range.drop/types.h | 10 ++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/libcxx/include/__ranges/drop_view.h b/libcxx/include/__ranges/drop_view.h index 6103057..d88d697 100644 --- a/libcxx/include/__ranges/drop_view.h +++ b/libcxx/include/__ranges/drop_view.h @@ -143,6 +143,9 @@ public: // TODO: this is just recreating all_t. -> drop_view()))>; + template + inline constexpr bool enable_borrowed_range> = enable_borrowed_range<_Tp>; + } // namespace ranges #endif // !defined(_LIBCPP_HAS_NO_RANGES) diff --git a/libcxx/test/std/ranges/range.adaptors/range.drop/general.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.drop/general.pass.cpp index 2d1245a..087e11e 100644 --- a/libcxx/test/std/ranges/range.adaptors/range.drop/general.pass.cpp +++ b/libcxx/test/std/ranges/range.adaptors/range.drop/general.pass.cpp @@ -28,9 +28,12 @@ template concept ValidDropView = requires { typename std::ranges::drop_view; }; -static_assert(ValidDropView); +static_assert( ValidDropView); static_assert(!ValidDropView); +static_assert(!std::ranges::enable_borrowed_range>); +static_assert( std::ranges::enable_borrowed_range>); + template bool orderedFibonacci(View v, int n = 1) { if (v.size() < 3) diff --git a/libcxx/test/std/ranges/range.adaptors/range.drop/types.h b/libcxx/test/std/ranges/range.adaptors/range.drop/types.h index 35d91ed..692fdfe 100644 --- a/libcxx/test/std/ranges/range.adaptors/range.drop/types.h +++ b/libcxx/test/std/ranges/range.adaptors/range.drop/types.h @@ -80,6 +80,16 @@ struct BorrowableRange { template<> inline constexpr bool std::ranges::enable_borrowed_range = true; +struct BorrowableView : std::ranges::view_base { + friend int* begin(BorrowableView const& range); + friend int* end(BorrowableView const&); + friend int* begin(BorrowableView& range); + friend int* end(BorrowableView&); +}; + +template<> +inline constexpr bool std::ranges::enable_borrowed_range = true; + struct InputView : std::ranges::view_base { constexpr cpp20_input_iterator begin() const { return cpp20_input_iterator(globalBuff); } constexpr int* end() const { return globalBuff + 8; } -- 2.7.4