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