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