1e5d8b93eSzoecarver //===----------------------------------------------------------------------===//
2e5d8b93eSzoecarver //
3e5d8b93eSzoecarver // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e5d8b93eSzoecarver // See https://llvm.org/LICENSE.txt for license information.
5e5d8b93eSzoecarver // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5d8b93eSzoecarver //
7e5d8b93eSzoecarver //===----------------------------------------------------------------------===//
8e5d8b93eSzoecarver
9e5d8b93eSzoecarver // UNSUPPORTED: c++03, c++11, c++14, c++17
1071909de3SMark de Wever // UNSUPPORTED: libcpp-has-no-incomplete-ranges
11e5d8b93eSzoecarver
12e5d8b93eSzoecarver // template<class R>
13e5d8b93eSzoecarver // common_view(R&&) -> common_view<views::all_t<R>>;
14e5d8b93eSzoecarver
15e5d8b93eSzoecarver #include <ranges>
16e5d8b93eSzoecarver #include <cassert>
17e5d8b93eSzoecarver
18e5d8b93eSzoecarver #include "test_iterators.h"
19e5d8b93eSzoecarver
20e5d8b93eSzoecarver struct View : std::ranges::view_base {
213666dd79SArthur O'Dwyer int *begin() const;
223666dd79SArthur O'Dwyer sentinel_wrapper<int*> end() const;
23e5d8b93eSzoecarver };
24e5d8b93eSzoecarver
25e5d8b93eSzoecarver struct Range {
263666dd79SArthur O'Dwyer int *begin() const;
273666dd79SArthur O'Dwyer sentinel_wrapper<int*> end() const;
28e5d8b93eSzoecarver };
29e5d8b93eSzoecarver
30e5d8b93eSzoecarver struct BorrowedRange {
313666dd79SArthur O'Dwyer int *begin() const;
323666dd79SArthur O'Dwyer sentinel_wrapper<int*> end() const;
33e5d8b93eSzoecarver };
34e5d8b93eSzoecarver template<>
35e5d8b93eSzoecarver inline constexpr bool std::ranges::enable_borrowed_range<BorrowedRange> = true;
36e5d8b93eSzoecarver
testCTAD()37e5d8b93eSzoecarver void testCTAD() {
38e5d8b93eSzoecarver View v;
39e5d8b93eSzoecarver Range r;
40e5d8b93eSzoecarver BorrowedRange br;
41*67151d02SArthur O'Dwyer
42e5d8b93eSzoecarver static_assert(std::same_as<
43e5d8b93eSzoecarver decltype(std::ranges::common_view(v)),
44e5d8b93eSzoecarver std::ranges::common_view<View>
45e5d8b93eSzoecarver >);
46e5d8b93eSzoecarver static_assert(std::same_as<
47*67151d02SArthur O'Dwyer decltype(std::ranges::common_view(std::move(v))),
48*67151d02SArthur O'Dwyer std::ranges::common_view<View>
49*67151d02SArthur O'Dwyer >);
50*67151d02SArthur O'Dwyer static_assert(std::same_as<
51e5d8b93eSzoecarver decltype(std::ranges::common_view(r)),
52e5d8b93eSzoecarver std::ranges::common_view<std::ranges::ref_view<Range>>
53e5d8b93eSzoecarver >);
54*67151d02SArthur O'Dwyer static_assert(std::same_as<
55*67151d02SArthur O'Dwyer decltype(std::ranges::common_view(std::move(r))),
56*67151d02SArthur O'Dwyer std::ranges::common_view<std::ranges::owning_view<Range>>
57*67151d02SArthur O'Dwyer >);
58e5d8b93eSzoecarver static_assert(std::same_as<
59e5d8b93eSzoecarver decltype(std::ranges::common_view(br)),
60e5d8b93eSzoecarver std::ranges::common_view<std::ranges::ref_view<BorrowedRange>>
61e5d8b93eSzoecarver >);
62e5d8b93eSzoecarver static_assert(std::same_as<
63e5d8b93eSzoecarver decltype(std::ranges::common_view(std::move(br))),
64*67151d02SArthur O'Dwyer std::ranges::common_view<std::ranges::owning_view<BorrowedRange>>
65e5d8b93eSzoecarver >);
66e5d8b93eSzoecarver }
67