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 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 78 int main(int, char**) { 79 test(); 80 static_assert(test()); 81 82 return 0; 83 } 84