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> { return base_; }
13 // constexpr V base() && { return std::move(base_); }
14
15 #include <ranges>
16
17 #include <cassert>
18 #include <concepts>
19
20 #include "types.h"
21
test()22 constexpr bool test() {
23 int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8};
24
25 // Test common ranges.
26 {
27 // Test non-const.
28 {
29 auto rev = std::ranges::reverse_view(BidirRange{buffer, buffer + 8});
30
31 std::same_as<BidirRange> auto base = rev.base();
32 assert(base.begin_ == buffer);
33 assert(base.end_ == buffer + 8);
34
35 std::same_as<BidirRange> auto moved = std::move(rev).base();
36 assert(moved.begin_ == buffer);
37 assert(moved.end_ == buffer + 8);
38 }
39 // Test const.
40 {
41 const auto rev = std::ranges::reverse_view(BidirRange{buffer, buffer + 8});
42
43 std::same_as<BidirRange> auto base = rev.base();
44 assert(base.begin_ == buffer);
45 assert(base.end_ == buffer + 8);
46
47 std::same_as<BidirRange> auto moved = std::move(rev).base();
48 assert(moved.begin_ == buffer);
49 assert(moved.end_ == buffer + 8);
50 }
51 }
52 // Test non-common ranges.
53 {
54 // Test non-const (also move only).
55 {
56 auto rev = std::ranges::reverse_view(BidirSentRange<MoveOnly>{buffer, buffer + 8});
57 std::same_as<BidirSentRange<MoveOnly>> auto base = std::move(rev).base();
58 assert(base.begin_ == buffer);
59 assert(base.end_ == buffer + 8);
60 }
61 // Test const.
62 {
63 const auto rev = std::ranges::reverse_view(BidirSentRange<Copyable>{buffer, buffer + 8});
64
65 std::same_as<BidirSentRange<Copyable>> auto base = rev.base();
66 assert(base.begin_ == buffer);
67 assert(base.end_ == buffer + 8);
68
69 std::same_as<BidirSentRange<Copyable>> auto moved = std::move(rev).base();
70 assert(moved.begin_ == buffer);
71 assert(moved.end_ == buffer + 8);
72 }
73 }
74
75 return true;
76 }
77
main(int,char **)78 int main(int, char**) {
79 test();
80 static_assert(test());
81
82 return 0;
83 }
84