File: enable_view.compile.pass.cpp

package info (click to toggle)
llvm-toolchain-21 1%3A21.1.7-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,245,064 kB
  • sloc: cpp: 7,619,731; ansic: 1,434,018; asm: 1,058,748; python: 252,740; f90: 94,671; objc: 70,685; lisp: 42,813; pascal: 18,401; sh: 8,601; ml: 5,111; perl: 4,720; makefile: 3,676; awk: 3,523; javascript: 2,409; xml: 892; fortran: 770
file content (167 lines) | stat: -rw-r--r-- 8,784 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// UNSUPPORTED: c++03, c++11, c++14, c++17

// <ranges>

// template<class T>
// inline constexpr bool enable_view = ...;

#include <ranges>

#include "test_macros.h"

// Doesn't derive from view_base
struct Empty { };
static_assert(!std::ranges::enable_view<Empty>);
static_assert(!std::ranges::enable_view<Empty&>);
static_assert(!std::ranges::enable_view<Empty&&>);
static_assert(!std::ranges::enable_view<const Empty>);
static_assert(!std::ranges::enable_view<const Empty&>);
static_assert(!std::ranges::enable_view<const Empty&&>);
static_assert(!std::ranges::enable_view<volatile Empty>);
static_assert(!std::ranges::enable_view<volatile Empty&>);
static_assert(!std::ranges::enable_view<volatile Empty&&>);
static_assert(!std::ranges::enable_view<const volatile Empty>);
static_assert(!std::ranges::enable_view<const volatile Empty&>);
static_assert(!std::ranges::enable_view<const volatile Empty&&>);

// Derives from view_base, but privately
struct PrivateViewBase : private std::ranges::view_base { };
static_assert(!std::ranges::enable_view<PrivateViewBase>);
static_assert(!std::ranges::enable_view<PrivateViewBase&>);
static_assert(!std::ranges::enable_view<PrivateViewBase&&>);
static_assert(!std::ranges::enable_view<const PrivateViewBase>);
static_assert(!std::ranges::enable_view<const PrivateViewBase&>);
static_assert(!std::ranges::enable_view<const PrivateViewBase&&>);
static_assert(!std::ranges::enable_view<volatile PrivateViewBase>);
static_assert(!std::ranges::enable_view<volatile PrivateViewBase&>);
static_assert(!std::ranges::enable_view<volatile PrivateViewBase&&>);
static_assert(!std::ranges::enable_view<const volatile PrivateViewBase>);
static_assert(!std::ranges::enable_view<const volatile PrivateViewBase&>);
static_assert(!std::ranges::enable_view<const volatile PrivateViewBase&&>);

// Derives from view_base, but specializes enable_view to false
struct EnableViewFalse : std::ranges::view_base { };
template <> constexpr bool std::ranges::enable_view<EnableViewFalse> = false;
static_assert(!std::ranges::enable_view<EnableViewFalse>);
static_assert(!std::ranges::enable_view<EnableViewFalse&>);
static_assert(!std::ranges::enable_view<EnableViewFalse&&>);
static_assert(std::ranges::enable_view<const EnableViewFalse>);
static_assert(!std::ranges::enable_view<const EnableViewFalse&>);
static_assert(!std::ranges::enable_view<const EnableViewFalse&&>);
static_assert(std::ranges::enable_view<volatile EnableViewFalse>);
static_assert(!std::ranges::enable_view<volatile EnableViewFalse&>);
static_assert(!std::ranges::enable_view<volatile EnableViewFalse&&>);
static_assert(std::ranges::enable_view<const volatile EnableViewFalse>);
static_assert(!std::ranges::enable_view<const volatile EnableViewFalse&>);
static_assert(!std::ranges::enable_view<const volatile EnableViewFalse&&>);

// Derives from view_base
struct PublicViewBase : std::ranges::view_base { };
static_assert(std::ranges::enable_view<PublicViewBase>);
static_assert(!std::ranges::enable_view<PublicViewBase&>);
static_assert(!std::ranges::enable_view<PublicViewBase&&>);
static_assert(std::ranges::enable_view<const PublicViewBase>);
static_assert(!std::ranges::enable_view<const PublicViewBase&>);
static_assert(!std::ranges::enable_view<const PublicViewBase&&>);
static_assert(std::ranges::enable_view<volatile PublicViewBase>);
static_assert(!std::ranges::enable_view<volatile PublicViewBase&>);
static_assert(!std::ranges::enable_view<volatile PublicViewBase&&>);
static_assert(std::ranges::enable_view<const volatile PublicViewBase>);
static_assert(!std::ranges::enable_view<const volatile PublicViewBase&>);
static_assert(!std::ranges::enable_view<const volatile PublicViewBase&&>);

// Does not derive from view_base, but specializes enable_view to true
struct EnableViewTrue { };
template <> constexpr bool std::ranges::enable_view<EnableViewTrue> = true;
static_assert(std::ranges::enable_view<EnableViewTrue>);
static_assert(!std::ranges::enable_view<EnableViewTrue&>);
static_assert(!std::ranges::enable_view<EnableViewTrue&&>);
static_assert(!std::ranges::enable_view<const EnableViewTrue>);
static_assert(!std::ranges::enable_view<const EnableViewTrue&>);
static_assert(!std::ranges::enable_view<const EnableViewTrue&&>);
static_assert(!std::ranges::enable_view<volatile EnableViewTrue>);
static_assert(!std::ranges::enable_view<volatile EnableViewTrue&>);
static_assert(!std::ranges::enable_view<volatile EnableViewTrue&&>);
static_assert(!std::ranges::enable_view<const volatile EnableViewTrue>);
static_assert(!std::ranges::enable_view<const volatile EnableViewTrue&>);
static_assert(!std::ranges::enable_view<const volatile EnableViewTrue&&>);

// Make sure that enable_view is a bool, not some other contextually-convertible-to-bool type.
ASSERT_SAME_TYPE(decltype(std::ranges::enable_view<Empty>), const bool);
ASSERT_SAME_TYPE(decltype(std::ranges::enable_view<PublicViewBase>), const bool);

struct V1 : std::ranges::view_interface<V1> {};
static_assert(std::ranges::enable_view<V1>);
static_assert(!std::ranges::enable_view<V1&>);
static_assert(!std::ranges::enable_view<V1&&>);
static_assert(std::ranges::enable_view<const V1>);
static_assert(!std::ranges::enable_view<const V1&>);
static_assert(!std::ranges::enable_view<const V1&&>);
static_assert(std::ranges::enable_view<volatile V1>);
static_assert(!std::ranges::enable_view<volatile V1&>);
static_assert(!std::ranges::enable_view<volatile V1&&>);
static_assert(std::ranges::enable_view<const volatile V1>);
static_assert(!std::ranges::enable_view<const volatile V1&>);
static_assert(!std::ranges::enable_view<const volatile V1&&>);

struct V2 : std::ranges::view_interface<V1>, std::ranges::view_interface<V2> {};
static_assert(!std::ranges::enable_view<V2>);
static_assert(!std::ranges::enable_view<V2&>);
static_assert(!std::ranges::enable_view<V2&&>);
static_assert(!std::ranges::enable_view<const V2>);
static_assert(!std::ranges::enable_view<const V2&>);
static_assert(!std::ranges::enable_view<const V2&&>);
static_assert(!std::ranges::enable_view<volatile V2>);
static_assert(!std::ranges::enable_view<volatile V2&>);
static_assert(!std::ranges::enable_view<volatile V2&&>);
static_assert(!std::ranges::enable_view<const volatile V2>);
static_assert(!std::ranges::enable_view<const volatile V2&>);
static_assert(!std::ranges::enable_view<const volatile V2&&>);

struct V3 : std::ranges::view_interface<V1> {};
static_assert(std::ranges::enable_view<V3>);
static_assert(!std::ranges::enable_view<V3&>);
static_assert(!std::ranges::enable_view<V3&&>);
static_assert(std::ranges::enable_view<const V3>);
static_assert(!std::ranges::enable_view<const V3&>);
static_assert(!std::ranges::enable_view<const V3&&>);
static_assert(std::ranges::enable_view<volatile V3>);
static_assert(!std::ranges::enable_view<volatile V3&>);
static_assert(!std::ranges::enable_view<volatile V3&&>);
static_assert(std::ranges::enable_view<const volatile V3>);
static_assert(!std::ranges::enable_view<const volatile V3&>);
static_assert(!std::ranges::enable_view<const volatile V3&&>);

struct PrivateInherit : private std::ranges::view_interface<PrivateInherit> {};
static_assert(!std::ranges::enable_view<PrivateInherit>);
static_assert(!std::ranges::enable_view<const PrivateInherit>);
static_assert(!std::ranges::enable_view<volatile PrivateInherit>);
static_assert(!std::ranges::enable_view<const volatile PrivateInherit>);

// https://github.com/llvm/llvm-project/issues/132577
// enable_view<view_interface<T>> should be false.
static_assert(!std::ranges::enable_view<std::ranges::view_interface<V1>>);
static_assert(!std::ranges::enable_view<const std::ranges::view_interface<V1>>);
static_assert(!std::ranges::enable_view<volatile std::ranges::view_interface<V1>>);
static_assert(!std::ranges::enable_view<const volatile std::ranges::view_interface<V1>>);

// ADL-proof
struct Incomplete;
template<class T> struct Holder { T t; };
static_assert(!std::ranges::enable_view<Holder<Incomplete>*>);
static_assert(!std::ranges::enable_view<const Holder<Incomplete>*>);
static_assert(!std::ranges::enable_view<volatile Holder<Incomplete>*>);
static_assert(!std::ranges::enable_view<const volatile Holder<Incomplete>*>);

static_assert(!std::ranges::enable_view<void>);
static_assert(!std::ranges::enable_view<const void>);
static_assert(!std::ranges::enable_view<volatile void>);
static_assert(!std::ranges::enable_view<const volatile void>);