// TODO: this is just recreating all_t.
-> drop_view<decltype(views::all(std::declval<_Range>()))>;
+ template<class _Tp>
+ inline constexpr bool enable_borrowed_range<drop_view<_Tp>> = enable_borrowed_range<_Tp>;
+
} // namespace ranges
#endif // !defined(_LIBCPP_HAS_NO_RANGES)
template<class T>
concept ValidDropView = requires { typename std::ranges::drop_view<T>; };
-static_assert(ValidDropView<ContiguousView>);
+static_assert( ValidDropView<ContiguousView>);
static_assert(!ValidDropView<Range>);
+static_assert(!std::ranges::enable_borrowed_range<std::ranges::drop_view<ContiguousView>>);
+static_assert( std::ranges::enable_borrowed_range<std::ranges::drop_view<BorrowableView>>);
+
template<std::ranges::view View>
bool orderedFibonacci(View v, int n = 1) {
if (v.size() < 3)
template<>
inline constexpr bool std::ranges::enable_borrowed_range<BorrowableRange> = 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<BorrowableView> = true;
+
struct InputView : std::ranges::view_base {
constexpr cpp20_input_iterator<int*> begin() const { return cpp20_input_iterator<int*>(globalBuff); }
constexpr int* end() const { return globalBuff + 8; }