85 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++1710 11// constexpr V base() const & requires copy_constructible<V> { return base_; }12// constexpr V base() && { return std::move(base_); }13 14#include <cassert>15#include <ranges>16#include <tuple>17#include <type_traits>18#include <utility>19 20#include "MoveOnly.h"21 22struct View : std::ranges::view_base {23 int i;24 std::tuple<int>* begin() const;25 std::tuple<int>* end() const;26};27 28struct MoveOnlyView : View {29 MoveOnly mo;30};31 32template <class T>33concept HasBase = requires(T&& t) { std::forward<T>(t).base(); };34 35static_assert(HasBase<std::ranges::elements_view<View, 0> const&>);36static_assert(HasBase<std::ranges::elements_view<View, 0>&&>);37 38static_assert(!HasBase<std::ranges::elements_view<MoveOnlyView, 0> const&>);39static_assert(HasBase<std::ranges::elements_view<MoveOnlyView, 0>&&>);40 41constexpr bool test() {42 // const &43 {44 const std::ranges::elements_view<View, 0> ev{View{{}, 5}};45 std::same_as<View> decltype(auto) v = ev.base();46 assert(v.i == 5);47 }48 49 // &50 {51 std::ranges::elements_view<View, 0> ev{View{{}, 5}};52 std::same_as<View> decltype(auto) v = ev.base();53 assert(v.i == 5);54 }55 56 // &&57 {58 std::ranges::elements_view<View, 0> ev{View{{}, 5}};59 std::same_as<View> decltype(auto) v = std::move(ev).base();60 assert(v.i == 5);61 }62 63 // const &&64 {65 const std::ranges::elements_view<View, 0> ev{View{{}, 5}};66 std::same_as<View> decltype(auto) v = std::move(ev).base();67 assert(v.i == 5);68 }69 70 // move only71 {72 std::ranges::elements_view<MoveOnlyView, 0> ev{MoveOnlyView{{}, 5}};73 std::same_as<MoveOnlyView> decltype(auto) v = std::move(ev).base();74 assert(v.mo.get() == 5);75 }76 77 return true;78}79 80int main(int, char**) {81 test();82 static_assert(test());83 return 0;84}85