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