1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 // UNSUPPORTED: c++03, c++11, c++14, c++17
10 // UNSUPPORTED: libcpp-has-no-incomplete-ranges
11
12 // constexpr V base() const& requires copy_constructible<V>
13 // constexpr V base() &&
14
15 #include <ranges>
16
17 #include "test_macros.h"
18 #include "types.h"
19
test()20 constexpr bool test() {
21 {
22 std::ranges::transform_view<MoveOnlyView, PlusOne> transformView;
23 MoveOnlyView base = std::move(transformView).base();
24 ASSERT_SAME_TYPE(MoveOnlyView, decltype(std::move(transformView).base()));
25 assert(std::ranges::begin(base) == globalBuff);
26 }
27
28 {
29 std::ranges::transform_view<CopyableView, PlusOne> transformView;
30 CopyableView base1 = transformView.base();
31 ASSERT_SAME_TYPE(CopyableView, decltype(transformView.base()));
32 assert(std::ranges::begin(base1) == globalBuff);
33
34 CopyableView base2 = std::move(transformView).base();
35 ASSERT_SAME_TYPE(CopyableView, decltype(std::move(transformView).base()));
36 assert(std::ranges::begin(base2) == globalBuff);
37 }
38
39 {
40 const std::ranges::transform_view<CopyableView, PlusOne> transformView;
41 const CopyableView base1 = transformView.base();
42 ASSERT_SAME_TYPE(CopyableView, decltype(transformView.base()));
43 assert(std::ranges::begin(base1) == globalBuff);
44
45 const CopyableView base2 = std::move(transformView).base();
46 ASSERT_SAME_TYPE(CopyableView, decltype(std::move(transformView).base()));
47 assert(std::ranges::begin(base2) == globalBuff);
48 }
49
50 return true;
51 }
52
main(int,char **)53 int main(int, char**) {
54 test();
55 static_assert(test());
56
57 return 0;
58 }
59