10f4b41e0Szoecarver //===----------------------------------------------------------------------===//
20f4b41e0Szoecarver //
30f4b41e0Szoecarver // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40f4b41e0Szoecarver // See https://llvm.org/LICENSE.txt for license information.
50f4b41e0Szoecarver // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60f4b41e0Szoecarver //
70f4b41e0Szoecarver //===----------------------------------------------------------------------===//
80f4b41e0Szoecarver
90f4b41e0Szoecarver // UNSUPPORTED: c++03, c++11, c++14, c++17
100f4b41e0Szoecarver // UNSUPPORTED: libcpp-has-no-incomplete-ranges
110f4b41e0Szoecarver
120f4b41e0Szoecarver // template<class R>
130f4b41e0Szoecarver // take_view(R&&, range_difference_t<R>) -> take_view<views::all_t<R>>;
140f4b41e0Szoecarver
150f4b41e0Szoecarver #include <cassert>
160f4b41e0Szoecarver #include <concepts>
17*52915d78SNikolas Klauser #include <ranges>
18*52915d78SNikolas Klauser #include <utility>
190f4b41e0Szoecarver
200f4b41e0Szoecarver struct View : std::ranges::view_base {
2167151d02SArthur O'Dwyer int *begin() const;
2267151d02SArthur O'Dwyer int *end() const;
230f4b41e0Szoecarver };
240f4b41e0Szoecarver
250f4b41e0Szoecarver struct Range {
2667151d02SArthur O'Dwyer int *begin() const;
2767151d02SArthur O'Dwyer int *end() const;
280f4b41e0Szoecarver };
290f4b41e0Szoecarver
300f4b41e0Szoecarver struct BorrowedRange {
3167151d02SArthur O'Dwyer int *begin() const;
3267151d02SArthur O'Dwyer int *end() const;
330f4b41e0Szoecarver };
340f4b41e0Szoecarver template<>
350f4b41e0Szoecarver inline constexpr bool std::ranges::enable_borrowed_range<BorrowedRange> = true;
360f4b41e0Szoecarver
testCTAD()370f4b41e0Szoecarver void testCTAD() {
380f4b41e0Szoecarver View v;
390f4b41e0Szoecarver Range r;
400f4b41e0Szoecarver BorrowedRange br;
4167151d02SArthur O'Dwyer
420f4b41e0Szoecarver static_assert(std::same_as<
430f4b41e0Szoecarver decltype(std::ranges::take_view(v, 0)),
440f4b41e0Szoecarver std::ranges::take_view<View>
450f4b41e0Szoecarver >);
460f4b41e0Szoecarver static_assert(std::same_as<
4767151d02SArthur O'Dwyer decltype(std::ranges::take_view(std::move(v), 0)),
4867151d02SArthur O'Dwyer std::ranges::take_view<View>
4967151d02SArthur O'Dwyer >);
5067151d02SArthur O'Dwyer static_assert(std::same_as<
510f4b41e0Szoecarver decltype(std::ranges::take_view(r, 0)),
520f4b41e0Szoecarver std::ranges::take_view<std::ranges::ref_view<Range>>
530f4b41e0Szoecarver >);
5467151d02SArthur O'Dwyer static_assert(std::same_as<
5567151d02SArthur O'Dwyer decltype(std::ranges::take_view(std::move(r), 0)),
5667151d02SArthur O'Dwyer std::ranges::take_view<std::ranges::owning_view<Range>>
5767151d02SArthur O'Dwyer >);
580f4b41e0Szoecarver static_assert(std::same_as<
590f4b41e0Szoecarver decltype(std::ranges::take_view(br, 0)),
600f4b41e0Szoecarver std::ranges::take_view<std::ranges::ref_view<BorrowedRange>>
610f4b41e0Szoecarver >);
620f4b41e0Szoecarver static_assert(std::same_as<
630f4b41e0Szoecarver decltype(std::ranges::take_view(std::move(br), 0)),
6467151d02SArthur O'Dwyer std::ranges::take_view<std::ranges::owning_view<BorrowedRange>>
650f4b41e0Szoecarver >);
660f4b41e0Szoecarver }
67