//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 // UNSUPPORTED: libcpp-no-concepts // UNSUPPORTED: libcpp-has-no-incomplete-ranges // template // reverse_view(R&&) -> reverse_view>; #include #include #include #include "test_iterators.h" struct View : std::ranges::view_base { friend int* begin(View&) { return nullptr; } friend int* begin(View const&) { return nullptr; } friend sentinel_wrapper end(View&) { return sentinel_wrapper(nullptr); } friend sentinel_wrapper end(View const&) { return sentinel_wrapper(nullptr); } }; struct Range { friend int* begin(Range&) { return nullptr; } friend int* begin(Range const&) { return nullptr; } friend sentinel_wrapper end(Range&) { return sentinel_wrapper(nullptr); } friend sentinel_wrapper end(Range const&) { return sentinel_wrapper(nullptr); } }; struct BorrowedRange { friend int* begin(BorrowedRange&) { return nullptr; } friend int* begin(BorrowedRange const&) { return nullptr; } friend sentinel_wrapper end(BorrowedRange&) { return sentinel_wrapper(nullptr); } friend sentinel_wrapper end(BorrowedRange const&) { return sentinel_wrapper(nullptr); } }; template<> inline constexpr bool std::ranges::enable_borrowed_range = true; int main(int, char**) { View v; Range r; BorrowedRange br; { std::same_as> auto x = std::ranges::reverse_view(v); (void)x; } { std::same_as>> auto x = std::ranges::reverse_view(r); (void)x; // std::ranges::reverse_view(std::move(r)) is invalid. RValue range must be borrowed. } { std::same_as>> auto x = std::ranges::reverse_view(br); (void)x; } { using Subrange = std::ranges::subrange, std::ranges::subrange_kind::unsized>; std::same_as> auto x = std::ranges::reverse_view(std::move(br)); (void)x; } return 0; }