1d8fad661SChristopher Di Bella //===----------------------------------------------------------------------===//
2d8fad661SChristopher Di Bella //
3d8fad661SChristopher Di Bella // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d8fad661SChristopher Di Bella // See https://llvm.org/LICENSE.txt for license information.
5d8fad661SChristopher Di Bella // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d8fad661SChristopher Di Bella //
7d8fad661SChristopher Di Bella //===----------------------------------------------------------------------===//
8d8fad661SChristopher Di Bella 
9d8fad661SChristopher Di Bella // UNSUPPORTED: c++03, c++11, c++14, c++17
1071909de3SMark de Wever // UNSUPPORTED: libcpp-has-no-incomplete-ranges
11d8fad661SChristopher Di Bella 
12d8fad661SChristopher Di Bella // <ranges>
13d8fad661SChristopher Di Bella 
14d8fad661SChristopher Di Bella // template<class T>
15d8fad661SChristopher Di Bella // inline constexpr bool enable_view = ...;
16d8fad661SChristopher Di Bella 
17d8fad661SChristopher Di Bella #include <ranges>
18d8fad661SChristopher Di Bella 
19d8fad661SChristopher Di Bella #include "test_macros.h"
20d8fad661SChristopher Di Bella 
21d8fad661SChristopher Di Bella // Doesn't derive from view_base
22d8fad661SChristopher Di Bella struct Empty { };
23d8fad661SChristopher Di Bella static_assert(!std::ranges::enable_view<Empty>);
24*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<Empty&>);
25*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<Empty&&>);
26*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const Empty>);
27*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const Empty&>);
28*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const Empty&&>);
29d8fad661SChristopher Di Bella 
30d8fad661SChristopher Di Bella // Derives from view_base, but privately
31d8fad661SChristopher Di Bella struct PrivateViewBase : private std::ranges::view_base { };
32d8fad661SChristopher Di Bella static_assert(!std::ranges::enable_view<PrivateViewBase>);
33*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<PrivateViewBase&>);
34*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<PrivateViewBase&&>);
35*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const PrivateViewBase>);
36*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const PrivateViewBase&>);
37*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const PrivateViewBase&&>);
38d8fad661SChristopher Di Bella 
39d8fad661SChristopher Di Bella // Derives from view_base, but specializes enable_view to false
40d8fad661SChristopher Di Bella struct EnableViewFalse : std::ranges::view_base { };
41*4f547ee8SJoe Loser template <> constexpr bool std::ranges::enable_view<EnableViewFalse> = false;
42d8fad661SChristopher Di Bella static_assert(!std::ranges::enable_view<EnableViewFalse>);
43*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<EnableViewFalse&>);
44*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<EnableViewFalse&&>);
45*4f547ee8SJoe Loser static_assert(std::ranges::enable_view<const EnableViewFalse>);
46*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const EnableViewFalse&>);
47*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const EnableViewFalse&&>);
48d8fad661SChristopher Di Bella 
49d8fad661SChristopher Di Bella // Derives from view_base
50d8fad661SChristopher Di Bella struct PublicViewBase : std::ranges::view_base { };
51d8fad661SChristopher Di Bella static_assert(std::ranges::enable_view<PublicViewBase>);
52*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<PublicViewBase&>);
53*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<PublicViewBase&&>);
54*4f547ee8SJoe Loser static_assert(std::ranges::enable_view<const PublicViewBase>);
55*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const PublicViewBase&>);
56*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const PublicViewBase&&>);
57d8fad661SChristopher Di Bella 
58d8fad661SChristopher Di Bella // Does not derive from view_base, but specializes enable_view to true
59d8fad661SChristopher Di Bella struct EnableViewTrue { };
60*4f547ee8SJoe Loser template <> constexpr bool std::ranges::enable_view<EnableViewTrue> = true;
61d8fad661SChristopher Di Bella static_assert(std::ranges::enable_view<EnableViewTrue>);
62*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<EnableViewTrue&>);
63*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<EnableViewTrue&&>);
64*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const EnableViewTrue>);
65*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const EnableViewTrue&>);
66*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const EnableViewTrue&&>);
67d8fad661SChristopher Di Bella 
68d8fad661SChristopher Di Bella // Make sure that enable_view is a bool, not some other contextually-convertible-to-bool type.
69d8fad661SChristopher Di Bella ASSERT_SAME_TYPE(decltype(std::ranges::enable_view<Empty>), const bool);
70d8fad661SChristopher Di Bella ASSERT_SAME_TYPE(decltype(std::ranges::enable_view<PublicViewBase>), const bool);
71*4f547ee8SJoe Loser 
72*4f547ee8SJoe Loser struct V1 : std::ranges::view_interface<V1> {};
73*4f547ee8SJoe Loser static_assert(std::ranges::enable_view<V1>);
74*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<V1&>);
75*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<V1&&>);
76*4f547ee8SJoe Loser static_assert(std::ranges::enable_view<const V1>);
77*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const V1&>);
78*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const V1&&>);
79*4f547ee8SJoe Loser 
80*4f547ee8SJoe Loser struct V2 : std::ranges::view_interface<V1>, std::ranges::view_interface<V2> {};
81*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<V2>);
82*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<V2&>);
83*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<V2&&>);
84*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const V2>);
85*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const V2&>);
86*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const V2&&>);
87*4f547ee8SJoe Loser 
88*4f547ee8SJoe Loser struct V3 : std::ranges::view_interface<V1> {};
89*4f547ee8SJoe Loser static_assert(std::ranges::enable_view<V3>);
90*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<V3&>);
91*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<V3&&>);
92*4f547ee8SJoe Loser static_assert(std::ranges::enable_view<const V3>);
93*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const V3&>);
94*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const V3&&>);
95*4f547ee8SJoe Loser 
96*4f547ee8SJoe Loser struct PrivateInherit : private std::ranges::view_interface<PrivateInherit> {};
97*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<PrivateInherit>);
98*4f547ee8SJoe Loser 
99*4f547ee8SJoe Loser // ADL-proof
100*4f547ee8SJoe Loser struct Incomplete;
101*4f547ee8SJoe Loser template<class T> struct Holder { T t; };
102*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<Holder<Incomplete>*>);
103*4f547ee8SJoe Loser 
104*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<void>);
105