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 // <ranges>
13 
14 // template<class T>
15 // inline constexpr bool enable_view = ...;
16 
17 #include <ranges>
18 
19 #include "test_macros.h"
20 
21 // Doesn't derive from view_base
22 struct Empty { };
23 static_assert(!std::ranges::enable_view<Empty>);
24 static_assert(!std::ranges::enable_view<Empty&>);
25 static_assert(!std::ranges::enable_view<Empty&&>);
26 static_assert(!std::ranges::enable_view<const Empty>);
27 static_assert(!std::ranges::enable_view<const Empty&>);
28 static_assert(!std::ranges::enable_view<const Empty&&>);
29 
30 // Derives from view_base, but privately
31 struct PrivateViewBase : private std::ranges::view_base { };
32 static_assert(!std::ranges::enable_view<PrivateViewBase>);
33 static_assert(!std::ranges::enable_view<PrivateViewBase&>);
34 static_assert(!std::ranges::enable_view<PrivateViewBase&&>);
35 static_assert(!std::ranges::enable_view<const PrivateViewBase>);
36 static_assert(!std::ranges::enable_view<const PrivateViewBase&>);
37 static_assert(!std::ranges::enable_view<const PrivateViewBase&&>);
38 
39 // Derives from view_base, but specializes enable_view to false
40 struct EnableViewFalse : std::ranges::view_base { };
41 template <> constexpr bool std::ranges::enable_view<EnableViewFalse> = false;
42 static_assert(!std::ranges::enable_view<EnableViewFalse>);
43 static_assert(!std::ranges::enable_view<EnableViewFalse&>);
44 static_assert(!std::ranges::enable_view<EnableViewFalse&&>);
45 static_assert(std::ranges::enable_view<const EnableViewFalse>);
46 static_assert(!std::ranges::enable_view<const EnableViewFalse&>);
47 static_assert(!std::ranges::enable_view<const EnableViewFalse&&>);
48 
49 // Derives from view_base
50 struct PublicViewBase : std::ranges::view_base { };
51 static_assert(std::ranges::enable_view<PublicViewBase>);
52 static_assert(!std::ranges::enable_view<PublicViewBase&>);
53 static_assert(!std::ranges::enable_view<PublicViewBase&&>);
54 static_assert(std::ranges::enable_view<const PublicViewBase>);
55 static_assert(!std::ranges::enable_view<const PublicViewBase&>);
56 static_assert(!std::ranges::enable_view<const PublicViewBase&&>);
57 
58 // Does not derive from view_base, but specializes enable_view to true
59 struct EnableViewTrue { };
60 template <> constexpr bool std::ranges::enable_view<EnableViewTrue> = true;
61 static_assert(std::ranges::enable_view<EnableViewTrue>);
62 static_assert(!std::ranges::enable_view<EnableViewTrue&>);
63 static_assert(!std::ranges::enable_view<EnableViewTrue&&>);
64 static_assert(!std::ranges::enable_view<const EnableViewTrue>);
65 static_assert(!std::ranges::enable_view<const EnableViewTrue&>);
66 static_assert(!std::ranges::enable_view<const EnableViewTrue&&>);
67 
68 // Make sure that enable_view is a bool, not some other contextually-convertible-to-bool type.
69 ASSERT_SAME_TYPE(decltype(std::ranges::enable_view<Empty>), const bool);
70 ASSERT_SAME_TYPE(decltype(std::ranges::enable_view<PublicViewBase>), const bool);
71 
72 struct V1 : std::ranges::view_interface<V1> {};
73 static_assert(std::ranges::enable_view<V1>);
74 static_assert(!std::ranges::enable_view<V1&>);
75 static_assert(!std::ranges::enable_view<V1&&>);
76 static_assert(std::ranges::enable_view<const V1>);
77 static_assert(!std::ranges::enable_view<const V1&>);
78 static_assert(!std::ranges::enable_view<const V1&&>);
79 
80 struct V2 : std::ranges::view_interface<V1>, std::ranges::view_interface<V2> {};
81 static_assert(!std::ranges::enable_view<V2>);
82 static_assert(!std::ranges::enable_view<V2&>);
83 static_assert(!std::ranges::enable_view<V2&&>);
84 static_assert(!std::ranges::enable_view<const V2>);
85 static_assert(!std::ranges::enable_view<const V2&>);
86 static_assert(!std::ranges::enable_view<const V2&&>);
87 
88 struct V3 : std::ranges::view_interface<V1> {};
89 static_assert(std::ranges::enable_view<V3>);
90 static_assert(!std::ranges::enable_view<V3&>);
91 static_assert(!std::ranges::enable_view<V3&&>);
92 static_assert(std::ranges::enable_view<const V3>);
93 static_assert(!std::ranges::enable_view<const V3&>);
94 static_assert(!std::ranges::enable_view<const V3&&>);
95 
96 struct PrivateInherit : private std::ranges::view_interface<PrivateInherit> {};
97 static_assert(!std::ranges::enable_view<PrivateInherit>);
98 
99 // ADL-proof
100 struct Incomplete;
101 template<class T> struct Holder { T t; };
102 static_assert(!std::ranges::enable_view<Holder<Incomplete>*>);
103 
104 static_assert(!std::ranges::enable_view<void>);
105