1560170faSzoecarver //===----------------------------------------------------------------------===//
2560170faSzoecarver //
3560170faSzoecarver // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4560170faSzoecarver // See https://llvm.org/LICENSE.txt for license information.
5560170faSzoecarver // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6560170faSzoecarver //
7560170faSzoecarver //===----------------------------------------------------------------------===//
8560170faSzoecarver 
9560170faSzoecarver // UNSUPPORTED: c++03, c++11, c++14, c++17
1071909de3SMark de Wever // UNSUPPORTED: libcpp-has-no-incomplete-ranges
11560170faSzoecarver 
12560170faSzoecarver // template<class R>
13560170faSzoecarver //   drop_view(R&&, range_difference_t<R>) -> drop_view<views::all_t<R>>;
14560170faSzoecarver 
1567151d02SArthur O'Dwyer #include <cassert>
1667151d02SArthur O'Dwyer #include <concepts>
17*52915d78SNikolas Klauser #include <ranges>
18*52915d78SNikolas Klauser #include <utility>
19560170faSzoecarver 
2067151d02SArthur O'Dwyer struct View : std::ranges::view_base {
2167151d02SArthur O'Dwyer   int *begin() const;
2267151d02SArthur O'Dwyer   int *end() const;
2367151d02SArthur O'Dwyer };
24560170faSzoecarver 
2567151d02SArthur O'Dwyer struct Range {
2667151d02SArthur O'Dwyer   int *begin() const;
2767151d02SArthur O'Dwyer   int *end() const;
2867151d02SArthur O'Dwyer };
29560170faSzoecarver 
3067151d02SArthur O'Dwyer struct BorrowedRange {
3167151d02SArthur O'Dwyer   int *begin() const;
3267151d02SArthur O'Dwyer   int *end() const;
3367151d02SArthur O'Dwyer };
3467151d02SArthur O'Dwyer template<>
3567151d02SArthur O'Dwyer inline constexpr bool std::ranges::enable_borrowed_range<BorrowedRange> = true;
36560170faSzoecarver 
testCTAD()3767151d02SArthur O'Dwyer void testCTAD() {
3867151d02SArthur O'Dwyer     View v;
3967151d02SArthur O'Dwyer     Range r;
4067151d02SArthur O'Dwyer     BorrowedRange br;
41560170faSzoecarver 
4267151d02SArthur O'Dwyer     static_assert(std::same_as<
4367151d02SArthur O'Dwyer         decltype(std::ranges::drop_view(v, 0)),
4467151d02SArthur O'Dwyer         std::ranges::drop_view<View>
4567151d02SArthur O'Dwyer     >);
4667151d02SArthur O'Dwyer     static_assert(std::same_as<
4767151d02SArthur O'Dwyer         decltype(std::ranges::drop_view(std::move(v), 0)),
4867151d02SArthur O'Dwyer         std::ranges::drop_view<View>
4967151d02SArthur O'Dwyer     >);
5067151d02SArthur O'Dwyer     static_assert(std::same_as<
5167151d02SArthur O'Dwyer         decltype(std::ranges::drop_view(r, 0)),
5267151d02SArthur O'Dwyer         std::ranges::drop_view<std::ranges::ref_view<Range>>
5367151d02SArthur O'Dwyer     >);
5467151d02SArthur O'Dwyer     static_assert(std::same_as<
5567151d02SArthur O'Dwyer         decltype(std::ranges::drop_view(std::move(r), 0)),
5667151d02SArthur O'Dwyer         std::ranges::drop_view<std::ranges::owning_view<Range>>
5767151d02SArthur O'Dwyer     >);
5867151d02SArthur O'Dwyer     static_assert(std::same_as<
5967151d02SArthur O'Dwyer         decltype(std::ranges::drop_view(br, 0)),
6067151d02SArthur O'Dwyer         std::ranges::drop_view<std::ranges::ref_view<BorrowedRange>>
6167151d02SArthur O'Dwyer     >);
6267151d02SArthur O'Dwyer     static_assert(std::same_as<
6367151d02SArthur O'Dwyer         decltype(std::ranges::drop_view(std::move(br), 0)),
6467151d02SArthur O'Dwyer         std::ranges::drop_view<std::ranges::owning_view<BorrowedRange>>
6567151d02SArthur O'Dwyer     >);
6667151d02SArthur O'Dwyer }
67