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
11// template<class T, class U>
12// concept equality_comparable_with = // see below
13
14#include <concepts>
15
16#include <array>
17#include <cstddef>
18#include <deque>
19#include <forward_list>
20#include <list>
21#include <map>
22#include <optional>
23#include <vector>
24
25#include "test_macros.h"
26
27#ifndef TEST_HAS_NO_THREADS
28# include <mutex>
29#endif
30
31#include "compare_types.h"
32
33template <class T, class U>
34constexpr bool check_equality_comparable_with() {
35 constexpr bool result = std::equality_comparable_with<T, U>;
36 static_assert(std::equality_comparable_with<U, T> == result);
37 static_assert(std::equality_comparable_with<T, U const> == result);
38 static_assert(std::equality_comparable_with<T const, U const> == result);
39 static_assert(std::equality_comparable_with<T, U const&> == result);
40 static_assert(std::equality_comparable_with<T const, U const&> == result);
41 static_assert(std::equality_comparable_with<T&, U const> == result);
42 static_assert(std::equality_comparable_with<T const&, U const> == result);
43 static_assert(std::equality_comparable_with<T&, U const&> == result);
44 static_assert(std::equality_comparable_with<T const&, U const&> == result);
45 static_assert(std::equality_comparable_with<T, U const&&> == result);
46 static_assert(std::equality_comparable_with<T const, U const&&> == result);
47 static_assert(std::equality_comparable_with<T&, U const&&> == result);
48 static_assert(std::equality_comparable_with<T const&, U const&&> == result);
49 static_assert(std::equality_comparable_with<T&&, U const> == result);
50 static_assert(std::equality_comparable_with<T const&&, U const> == result);
51 static_assert(std::equality_comparable_with<T&&, U const&> == result);
52 static_assert(std::equality_comparable_with<T const&&, U const&> == result);
53 static_assert(std::equality_comparable_with<T&&, U const&&> == result);
54 static_assert(std::equality_comparable_with<T const&&, U const&&> == result);
55 return result;
56}
57
58namespace fundamentals {
59static_assert(check_equality_comparable_with<int, int>());
60static_assert(check_equality_comparable_with<int, bool>());
61static_assert(check_equality_comparable_with<int, char>());
62static_assert(check_equality_comparable_with<int, wchar_t>());
63static_assert(check_equality_comparable_with<int, double>());
64static_assert(!check_equality_comparable_with<int, int*>());
65static_assert(!check_equality_comparable_with<int, int[5]>());
66static_assert(!check_equality_comparable_with<int, int (*)()>());
67static_assert(!check_equality_comparable_with<int, int (&)()>());
68
69struct S {};
70static_assert(!check_equality_comparable_with<int, int S::*>());
71static_assert(!check_equality_comparable_with<int, int (S::*)()>());
72static_assert(!check_equality_comparable_with<int, int (S::*)() noexcept>());
73static_assert(!check_equality_comparable_with<int, int (S::*)() const>());
74static_assert(
75 !check_equality_comparable_with<int, int (S::*)() const noexcept>());
76static_assert(!check_equality_comparable_with<int, int (S::*)() volatile>());
77static_assert(
78 !check_equality_comparable_with<int, int (S::*)() volatile noexcept>());
79static_assert(
80 !check_equality_comparable_with<int, int (S::*)() const volatile>());
81static_assert(!check_equality_comparable_with<
82 int, int (S::*)() const volatile noexcept>());
83static_assert(!check_equality_comparable_with<int, int (S::*)() &>());
84static_assert(!check_equality_comparable_with<int, int (S::*)() & noexcept>());
85static_assert(!check_equality_comparable_with<int, int (S::*)() const&>());
86static_assert(
87 !check_equality_comparable_with<int, int (S::*)() const & noexcept>());
88static_assert(!check_equality_comparable_with<int, int (S::*)() volatile&>());
89static_assert(
90 !check_equality_comparable_with<int, int (S::*)() volatile & noexcept>());
91static_assert(
92 !check_equality_comparable_with<int, int (S::*)() const volatile&>());
93static_assert(!check_equality_comparable_with<int, int (S::*)() const volatile &
94 noexcept>());
95static_assert(!check_equality_comparable_with<int, int (S::*)() &&>());
96static_assert(!check_equality_comparable_with < int,
97 int (S::*)() && noexcept > ());
98static_assert(!check_equality_comparable_with<int, int (S::*)() const&&>());
99static_assert(!check_equality_comparable_with < int,
100 int (S::*)() const&& noexcept > ());
101static_assert(!check_equality_comparable_with<int, int (S::*)() volatile&&>());
102static_assert(!check_equality_comparable_with < int,
103 int (S::*)() volatile&& noexcept > ());
104static_assert(
105 !check_equality_comparable_with<int, int (S::*)() const volatile&&>());
106static_assert(!check_equality_comparable_with < int,
107 int (S::*)() const volatile&& noexcept > ());
108
109static_assert(check_equality_comparable_with<int*, int*>());
110// Array comparisons are ill-formed in C++26, but Clang doesn't implement this yet.
111#if TEST_STD_VER <= 23 || defined(TEST_COMPILER_CLANG)
112static_assert(check_equality_comparable_with<int*, int[5]>());
113#else
114static_assert(!check_equality_comparable_with<int*, int[5]>());
115#endif
116static_assert(!check_equality_comparable_with<int*, int (*)()>());
117static_assert(!check_equality_comparable_with<int*, int (&)()>());
118static_assert(!check_equality_comparable_with<int*, int (S::*)()>());
119static_assert(!check_equality_comparable_with<int*, int (S::*)() noexcept>());
120static_assert(!check_equality_comparable_with<int*, int (S::*)() const>());
121static_assert(
122 !check_equality_comparable_with<int*, int (S::*)() const noexcept>());
123static_assert(!check_equality_comparable_with<int*, int (S::*)() volatile>());
124static_assert(
125 !check_equality_comparable_with<int*, int (S::*)() volatile noexcept>());
126static_assert(
127 !check_equality_comparable_with<int*, int (S::*)() const volatile>());
128static_assert(!check_equality_comparable_with<
129 int*, int (S::*)() const volatile noexcept>());
130static_assert(!check_equality_comparable_with<int*, int (S::*)() &>());
131static_assert(!check_equality_comparable_with<int*, int (S::*)() & noexcept>());
132static_assert(!check_equality_comparable_with<int*, int (S::*)() const&>());
133static_assert(
134 !check_equality_comparable_with<int*, int (S::*)() const & noexcept>());
135static_assert(!check_equality_comparable_with<int*, int (S::*)() volatile&>());
136static_assert(
137 !check_equality_comparable_with<int*, int (S::*)() volatile & noexcept>());
138static_assert(
139 !check_equality_comparable_with<int*, int (S::*)() const volatile&>());
140static_assert(!check_equality_comparable_with<
141 int*, int (S::*)() const volatile & noexcept>());
142static_assert(!check_equality_comparable_with<int*, int (S::*)() &&>());
143static_assert(!check_equality_comparable_with < int*,
144 int (S::*)() && noexcept > ());
145static_assert(!check_equality_comparable_with<int*, int (S::*)() const&&>());
146static_assert(!check_equality_comparable_with < int*,
147 int (S::*)() const&& noexcept > ());
148static_assert(!check_equality_comparable_with<int*, int (S::*)() volatile&&>());
149static_assert(!check_equality_comparable_with < int*,
150 int (S::*)() volatile&& noexcept > ());
151static_assert(
152 !check_equality_comparable_with<int*, int (S::*)() const volatile&&>());
153static_assert(!check_equality_comparable_with < int*,
154 int (S::*)() const volatile&& noexcept > ());
155
156// Array comparisons are ill-formed in C++26, but Clang doesn't implement this yet.
157#if TEST_STD_VER <= 23 || defined(TEST_COMPILER_CLANG)
158static_assert(check_equality_comparable_with<int[5], int[5]>());
159#else
160static_assert(!check_equality_comparable_with<int[5], int[5]>());
161#endif
162static_assert(!check_equality_comparable_with<int[5], int (*)()>());
163static_assert(!check_equality_comparable_with<int[5], int (&)()>());
164static_assert(!check_equality_comparable_with<int[5], int (S::*)()>());
165static_assert(!check_equality_comparable_with<int[5], int (S::*)() noexcept>());
166static_assert(!check_equality_comparable_with<int[5], int (S::*)() const>());
167static_assert(
168 !check_equality_comparable_with<int[5], int (S::*)() const noexcept>());
169static_assert(!check_equality_comparable_with<int[5], int (S::*)() volatile>());
170static_assert(
171 !check_equality_comparable_with<int[5], int (S::*)() volatile noexcept>());
172static_assert(
173 !check_equality_comparable_with<int[5], int (S::*)() const volatile>());
174static_assert(!check_equality_comparable_with<
175 int[5], int (S::*)() const volatile noexcept>());
176static_assert(!check_equality_comparable_with<int[5], int (S::*)() &>());
177static_assert(
178 !check_equality_comparable_with<int[5], int (S::*)() & noexcept>());
179static_assert(!check_equality_comparable_with<int[5], int (S::*)() const&>());
180static_assert(
181 !check_equality_comparable_with<int[5], int (S::*)() const & noexcept>());
182static_assert(
183 !check_equality_comparable_with<int[5], int (S::*)() volatile&>());
184static_assert(!check_equality_comparable_with<int[5], int (S::*)() volatile &
185 noexcept>());
186static_assert(
187 !check_equality_comparable_with<int[5], int (S::*)() const volatile&>());
188static_assert(!check_equality_comparable_with<
189 int[5], int (S::*)() const volatile & noexcept>());
190static_assert(!check_equality_comparable_with<int[5], int (S::*)() &&>());
191static_assert(!check_equality_comparable_with < int[5],
192 int (S::*)() && noexcept > ());
193static_assert(!check_equality_comparable_with<int[5], int (S::*)() const&&>());
194static_assert(!check_equality_comparable_with < int[5],
195 int (S::*)() const&& noexcept > ());
196static_assert(
197 !check_equality_comparable_with<int[5], int (S::*)() volatile&&>());
198static_assert(!check_equality_comparable_with < int[5],
199 int (S::*)() volatile&& noexcept > ());
200static_assert(
201 !check_equality_comparable_with<int[5], int (S::*)() const volatile&&>());
202static_assert(!check_equality_comparable_with < int[5],
203 int (S::*)() const volatile&& noexcept > ());
204
205static_assert(check_equality_comparable_with<int (*)(), int (*)()>());
206static_assert(check_equality_comparable_with<int (*)(), int (&)()>());
207static_assert(!check_equality_comparable_with<int (*)(), int (S::*)()>());
208static_assert(
209 !check_equality_comparable_with<int (*)(), int (S::*)() noexcept>());
210static_assert(!check_equality_comparable_with<int (*)(), int (S::*)() const>());
211static_assert(
212 !check_equality_comparable_with<int (*)(), int (S::*)() const noexcept>());
213static_assert(
214 !check_equality_comparable_with<int (*)(), int (S::*)() volatile>());
215static_assert(!check_equality_comparable_with<
216 int (*)(), int (S::*)() volatile noexcept>());
217static_assert(
218 !check_equality_comparable_with<int (*)(), int (S::*)() const volatile>());
219static_assert(!check_equality_comparable_with<
220 int (*)(), int (S::*)() const volatile noexcept>());
221static_assert(!check_equality_comparable_with<int (*)(), int (S::*)() &>());
222static_assert(
223 !check_equality_comparable_with<int (*)(), int (S::*)() & noexcept>());
224static_assert(
225 !check_equality_comparable_with<int (*)(), int (S::*)() const&>());
226static_assert(!check_equality_comparable_with<int (*)(),
227 int (S::*)() const & noexcept>());
228static_assert(
229 !check_equality_comparable_with<int (*)(), int (S::*)() volatile&>());
230static_assert(!check_equality_comparable_with<int (*)(), int (S::*)() volatile &
231 noexcept>());
232static_assert(
233 !check_equality_comparable_with<int (*)(), int (S::*)() const volatile&>());
234static_assert(!check_equality_comparable_with<
235 int (*)(), int (S::*)() const volatile & noexcept>());
236static_assert(!check_equality_comparable_with<int (*)(), int (S::*)() &&>());
237static_assert(!check_equality_comparable_with < int (*)(),
238 int (S::*)() && noexcept > ());
239static_assert(
240 !check_equality_comparable_with<int (*)(), int (S::*)() const&&>());
241static_assert(!check_equality_comparable_with < int (*)(),
242 int (S::*)() const&& noexcept > ());
243static_assert(
244 !check_equality_comparable_with<int (*)(), int (S::*)() volatile&&>());
245static_assert(!check_equality_comparable_with < int (*)(),
246 int (S::*)() volatile&& noexcept > ());
247static_assert(!check_equality_comparable_with<int (*)(),
248 int (S::*)() const volatile&&>());
249static_assert(!check_equality_comparable_with < int (*)(),
250 int (S::*)() const volatile&& noexcept > ());
251
252static_assert(check_equality_comparable_with<int (&)(), int (&)()>());
253static_assert(!check_equality_comparable_with<int (&)(), int (S::*)()>());
254static_assert(
255 !check_equality_comparable_with<int (&)(), int (S::*)() noexcept>());
256static_assert(!check_equality_comparable_with<int (&)(), int (S::*)() const>());
257static_assert(
258 !check_equality_comparable_with<int (&)(), int (S::*)() const noexcept>());
259static_assert(
260 !check_equality_comparable_with<int (&)(), int (S::*)() volatile>());
261static_assert(!check_equality_comparable_with<
262 int (&)(), int (S::*)() volatile noexcept>());
263static_assert(
264 !check_equality_comparable_with<int (&)(), int (S::*)() const volatile>());
265static_assert(!check_equality_comparable_with<
266 int (&)(), int (S::*)() const volatile noexcept>());
267static_assert(!check_equality_comparable_with<int (&)(), int (S::*)() &>());
268static_assert(
269 !check_equality_comparable_with<int (&)(), int (S::*)() & noexcept>());
270static_assert(
271 !check_equality_comparable_with<int (&)(), int (S::*)() const&>());
272static_assert(!check_equality_comparable_with<int (&)(),
273 int (S::*)() const & noexcept>());
274static_assert(
275 !check_equality_comparable_with<int (&)(), int (S::*)() volatile&>());
276static_assert(!check_equality_comparable_with<int (&)(), int (S::*)() volatile &
277 noexcept>());
278static_assert(
279 !check_equality_comparable_with<int (&)(), int (S::*)() const volatile&>());
280static_assert(!check_equality_comparable_with<
281 int (&)(), int (S::*)() const volatile & noexcept>());
282static_assert(!check_equality_comparable_with<int (&)(), int (S::*)() &&>());
283static_assert(!check_equality_comparable_with < int (&)(),
284 int (S::*)() && noexcept > ());
285static_assert(
286 !check_equality_comparable_with<int (&)(), int (S::*)() const&&>());
287static_assert(!check_equality_comparable_with < int (&)(),
288 int (S::*)() const&& noexcept > ());
289static_assert(
290 !check_equality_comparable_with<int (&)(), int (S::*)() volatile&&>());
291static_assert(!check_equality_comparable_with < int (&)(),
292 int (S::*)() volatile&& noexcept > ());
293static_assert(!check_equality_comparable_with<int (&)(),
294 int (S::*)() const volatile&&>());
295static_assert(!check_equality_comparable_with < int (&)(),
296 int (S::*)() const volatile&& noexcept > ());
297
298static_assert(check_equality_comparable_with<int (S::*)(), int (S::*)()>());
299static_assert(
300 check_equality_comparable_with<int (S::*)(), int (S::*)() noexcept>());
301static_assert(
302 !check_equality_comparable_with<int (S::*)(), int (S::*)() const>());
303static_assert(!check_equality_comparable_with<int (S::*)(),
304 int (S::*)() const noexcept>());
305static_assert(
306 !check_equality_comparable_with<int (S::*)(), int (S::*)() volatile>());
307static_assert(!check_equality_comparable_with<
308 int (S::*)(), int (S::*)() volatile noexcept>());
309static_assert(!check_equality_comparable_with<int (S::*)(),
310 int (S::*)() const volatile>());
311static_assert(!check_equality_comparable_with<
312 int (S::*)(), int (S::*)() const volatile noexcept>());
313static_assert(!check_equality_comparable_with<int (S::*)(), int (S::*)() &>());
314static_assert(
315 !check_equality_comparable_with<int (S::*)(), int (S::*)() & noexcept>());
316static_assert(
317 !check_equality_comparable_with<int (S::*)(), int (S::*)() const&>());
318static_assert(!check_equality_comparable_with<int (S::*)(),
319 int (S::*)() const & noexcept>());
320static_assert(
321 !check_equality_comparable_with<int (S::*)(), int (S::*)() volatile&>());
322static_assert(!check_equality_comparable_with<
323 int (S::*)(), int (S::*)() volatile & noexcept>());
324static_assert(!check_equality_comparable_with<int (S::*)(),
325 int (S::*)() const volatile&>());
326static_assert(!check_equality_comparable_with<
327 int (S::*)(), int (S::*)() const volatile & noexcept>());
328static_assert(!check_equality_comparable_with<int (S::*)(), int (S::*)() &&>());
329static_assert(!check_equality_comparable_with < int (S::*)(),
330 int (S::*)() && noexcept > ());
331static_assert(
332 !check_equality_comparable_with<int (S::*)(), int (S::*)() const&&>());
333static_assert(!check_equality_comparable_with < int (S::*)(),
334 int (S::*)() const&& noexcept > ());
335static_assert(
336 !check_equality_comparable_with<int (S::*)(), int (S::*)() volatile&&>());
337static_assert(!check_equality_comparable_with < int (S::*)(),
338 int (S::*)() volatile&& noexcept > ());
339static_assert(!check_equality_comparable_with<int (S::*)(),
340 int (S::*)() const volatile&&>());
341static_assert(!check_equality_comparable_with < int (S::*)(),
342 int (S::*)() const volatile&& noexcept > ());
343
344static_assert(check_equality_comparable_with<int (S::*)() noexcept,
345 int (S::*)() noexcept>());
346static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
347 int (S::*)() const>());
348static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
349 int (S::*)() const noexcept>());
350static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
351 int (S::*)() volatile>());
352static_assert(!check_equality_comparable_with<
353 int (S::*)() noexcept, int (S::*)() volatile noexcept>());
354static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
355 int (S::*)() const volatile>());
356static_assert(!check_equality_comparable_with<
357 int (S::*)() noexcept, int (S::*)() const volatile noexcept>());
358static_assert(
359 !check_equality_comparable_with<int (S::*)() noexcept, int (S::*)() &>());
360static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
361 int (S::*)() & noexcept>());
362static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
363 int (S::*)() const&>());
364static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
365 int (S::*)() const & noexcept>());
366static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
367 int (S::*)() volatile&>());
368static_assert(!check_equality_comparable_with<
369 int (S::*)() noexcept, int (S::*)() volatile & noexcept>());
370static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
371 int (S::*)() const volatile&>());
372static_assert(!check_equality_comparable_with<
373 int (S::*)() noexcept, int (S::*)() const volatile & noexcept>());
374static_assert(
375 !check_equality_comparable_with<int (S::*)() noexcept, int (S::*)() &&>());
376static_assert(!check_equality_comparable_with < int (S::*)() noexcept,
377 int (S::*)() && noexcept > ());
378static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
379 int (S::*)() const&&>());
380static_assert(!check_equality_comparable_with < int (S::*)() noexcept,
381 int (S::*)() const&& noexcept > ());
382static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
383 int (S::*)() volatile&&>());
384static_assert(!check_equality_comparable_with < int (S::*)() noexcept,
385 int (S::*)() volatile&& noexcept > ());
386static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
387 int (S::*)() const volatile&&>());
388static_assert(!check_equality_comparable_with < int (S::*)() noexcept,
389 int (S::*)() const volatile&& noexcept > ());
390
391static_assert(
392 check_equality_comparable_with<int (S::*)() const, int (S::*)() const>());
393static_assert(check_equality_comparable_with<int (S::*)() const,
394 int (S::*)() const noexcept>());
395static_assert(!check_equality_comparable_with<int (S::*)() const,
396 int (S::*)() volatile>());
397static_assert(!check_equality_comparable_with<
398 int (S::*)() const, int (S::*)() volatile noexcept>());
399static_assert(!check_equality_comparable_with<int (S::*)() const,
400 int (S::*)() const volatile>());
401static_assert(!check_equality_comparable_with<
402 int (S::*)() const, int (S::*)() const volatile noexcept>());
403static_assert(
404 !check_equality_comparable_with<int (S::*)() const, int (S::*)() &>());
405static_assert(!check_equality_comparable_with<int (S::*)() const,
406 int (S::*)() & noexcept>());
407static_assert(
408 !check_equality_comparable_with<int (S::*)() const, int (S::*)() const&>());
409static_assert(!check_equality_comparable_with<int (S::*)() const,
410 int (S::*)() const & noexcept>());
411static_assert(!check_equality_comparable_with<int (S::*)() const,
412 int (S::*)() volatile&>());
413static_assert(!check_equality_comparable_with<
414 int (S::*)() const, int (S::*)() volatile & noexcept>());
415static_assert(!check_equality_comparable_with<int (S::*)() const,
416 int (S::*)() const volatile&>());
417static_assert(!check_equality_comparable_with<
418 int (S::*)() const, int (S::*)() const volatile & noexcept>());
419static_assert(
420 !check_equality_comparable_with<int (S::*)() const, int (S::*)() &&>());
421static_assert(!check_equality_comparable_with < int (S::*)() const,
422 int (S::*)() && noexcept > ());
423static_assert(!check_equality_comparable_with<int (S::*)() const,
424 int (S::*)() const&&>());
425static_assert(!check_equality_comparable_with < int (S::*)() const,
426 int (S::*)() const&& noexcept > ());
427static_assert(!check_equality_comparable_with<int (S::*)() const,
428 int (S::*)() volatile&&>());
429static_assert(!check_equality_comparable_with < int (S::*)() const,
430 int (S::*)() volatile&& noexcept > ());
431static_assert(!check_equality_comparable_with<int (S::*)() const,
432 int (S::*)() const volatile&&>());
433static_assert(!check_equality_comparable_with < int (S::*)() const,
434 int (S::*)() const volatile&& noexcept > ());
435
436static_assert(check_equality_comparable_with<int (S::*)() const noexcept,
437 int (S::*)() const noexcept>());
438static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
439 int (S::*)() volatile>());
440static_assert(!check_equality_comparable_with<
441 int (S::*)() const noexcept, int (S::*)() volatile noexcept>());
442static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
443 int (S::*)() const volatile>());
444static_assert(
445 !check_equality_comparable_with<int (S::*)() const noexcept,
446 int (S::*)() const volatile noexcept>());
447static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
448 int (S::*)() &>());
449static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
450 int (S::*)() & noexcept>());
451static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
452 int (S::*)() const&>());
453static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
454 int (S::*)() const & noexcept>());
455static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
456 int (S::*)() volatile&>());
457static_assert(!check_equality_comparable_with<
458 int (S::*)() const noexcept, int (S::*)() volatile & noexcept>());
459static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
460 int (S::*)() const volatile&>());
461static_assert(
462 !check_equality_comparable_with<int (S::*)() const noexcept,
463 int (S::*)() const volatile & noexcept>());
464static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
465 int (S::*)() &&>());
466static_assert(!check_equality_comparable_with < int (S::*)() const noexcept,
467 int (S::*)() && noexcept > ());
468static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
469 int (S::*)() const&&>());
470static_assert(!check_equality_comparable_with < int (S::*)() const noexcept,
471 int (S::*)() const&& noexcept > ());
472static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
473 int (S::*)() volatile&&>());
474static_assert(!check_equality_comparable_with < int (S::*)() const noexcept,
475 int (S::*)() volatile&& noexcept > ());
476static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
477 int (S::*)() const volatile&&>());
478static_assert(!check_equality_comparable_with < int (S::*)() const noexcept,
479 int (S::*)() const volatile&& noexcept > ());
480
481static_assert(check_equality_comparable_with<int (S::*)() volatile,
482 int (S::*)() volatile>());
483static_assert(check_equality_comparable_with<int (S::*)() volatile,
484 int (S::*)() volatile noexcept>());
485static_assert(!check_equality_comparable_with<int (S::*)() volatile,
486 int (S::*)() const volatile>());
487static_assert(!check_equality_comparable_with<
488 int (S::*)() volatile, int (S::*)() const volatile noexcept>());
489static_assert(
490 !check_equality_comparable_with<int (S::*)() volatile, int (S::*)() &>());
491static_assert(!check_equality_comparable_with<int (S::*)() volatile,
492 int (S::*)() & noexcept>());
493static_assert(!check_equality_comparable_with<int (S::*)() volatile,
494 int (S::*)() const&>());
495static_assert(!check_equality_comparable_with<int (S::*)() volatile,
496 int (S::*)() const & noexcept>());
497static_assert(!check_equality_comparable_with<int (S::*)() volatile,
498 int (S::*)() volatile&>());
499static_assert(!check_equality_comparable_with<
500 int (S::*)() volatile, int (S::*)() volatile & noexcept>());
501static_assert(!check_equality_comparable_with<int (S::*)() volatile,
502 int (S::*)() const volatile&>());
503static_assert(!check_equality_comparable_with<
504 int (S::*)() volatile, int (S::*)() const volatile & noexcept>());
505static_assert(
506 !check_equality_comparable_with<int (S::*)() volatile, int (S::*)() &&>());
507static_assert(!check_equality_comparable_with < int (S::*)() volatile,
508 int (S::*)() && noexcept > ());
509static_assert(!check_equality_comparable_with<int (S::*)() volatile,
510 int (S::*)() const&&>());
511static_assert(!check_equality_comparable_with < int (S::*)() volatile,
512 int (S::*)() const&& noexcept > ());
513static_assert(!check_equality_comparable_with<int (S::*)() volatile,
514 int (S::*)() volatile&&>());
515static_assert(!check_equality_comparable_with < int (S::*)() volatile,
516 int (S::*)() volatile&& noexcept > ());
517static_assert(!check_equality_comparable_with<int (S::*)() volatile,
518 int (S::*)() const volatile&&>());
519static_assert(!check_equality_comparable_with < int (S::*)() volatile,
520 int (S::*)() const volatile&& noexcept > ());
521
522static_assert(check_equality_comparable_with<int (S::*)() volatile noexcept,
523 int (S::*)() volatile noexcept>());
524static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
525 int (S::*)() const volatile>());
526static_assert(
527 !check_equality_comparable_with<int (S::*)() volatile noexcept,
528 int (S::*)() const volatile noexcept>());
529static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
530 int (S::*)() &>());
531static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
532 int (S::*)() & noexcept>());
533static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
534 int (S::*)() const&>());
535static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
536 int (S::*)() const & noexcept>());
537static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
538 int (S::*)() volatile&>());
539static_assert(
540 !check_equality_comparable_with<int (S::*)() volatile noexcept,
541 int (S::*)() volatile & noexcept>());
542static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
543 int (S::*)() const volatile&>());
544static_assert(
545 !check_equality_comparable_with<int (S::*)() volatile noexcept,
546 int (S::*)() const volatile & noexcept>());
547static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
548 int (S::*)() &&>());
549static_assert(!check_equality_comparable_with < int (S::*)() volatile noexcept,
550 int (S::*)() && noexcept > ());
551static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
552 int (S::*)() const&&>());
553static_assert(!check_equality_comparable_with < int (S::*)() volatile noexcept,
554 int (S::*)() const&& noexcept > ());
555static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
556 int (S::*)() volatile&&>());
557static_assert(!check_equality_comparable_with < int (S::*)() volatile noexcept,
558 int (S::*)() volatile&& noexcept > ());
559static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
560 int (S::*)() const volatile&&>());
561static_assert(!check_equality_comparable_with < int (S::*)() volatile noexcept,
562 int (S::*)() const volatile&& noexcept > ());
563
564static_assert(check_equality_comparable_with<int (S::*)() const volatile,
565 int (S::*)() const volatile>());
566static_assert(
567 check_equality_comparable_with<int (S::*)() const volatile,
568 int (S::*)() const volatile noexcept>());
569static_assert(!check_equality_comparable_with<int (S::*)() const volatile,
570 int (S::*)() &>());
571static_assert(!check_equality_comparable_with<int (S::*)() const volatile,
572 int (S::*)() & noexcept>());
573static_assert(!check_equality_comparable_with<int (S::*)() const volatile,
574 int (S::*)() const&>());
575static_assert(!check_equality_comparable_with<int (S::*)() const volatile,
576 int (S::*)() const & noexcept>());
577static_assert(!check_equality_comparable_with<int (S::*)() const volatile,
578 int (S::*)() volatile&>());
579static_assert(!check_equality_comparable_with<
580 int (S::*)() const volatile, int (S::*)() volatile & noexcept>());
581static_assert(!check_equality_comparable_with<int (S::*)() const volatile,
582 int (S::*)() const volatile&>());
583static_assert(
584 !check_equality_comparable_with<int (S::*)() const volatile,
585 int (S::*)() const volatile & noexcept>());
586static_assert(!check_equality_comparable_with<int (S::*)() const volatile,
587 int (S::*)() &&>());
588static_assert(!check_equality_comparable_with < int (S::*)() const volatile,
589 int (S::*)() && noexcept > ());
590static_assert(!check_equality_comparable_with<int (S::*)() const volatile,
591 int (S::*)() const&&>());
592static_assert(!check_equality_comparable_with < int (S::*)() const volatile,
593 int (S::*)() const&& noexcept > ());
594static_assert(!check_equality_comparable_with<int (S::*)() const volatile,
595 int (S::*)() volatile&&>());
596static_assert(!check_equality_comparable_with < int (S::*)() const volatile,
597 int (S::*)() volatile&& noexcept > ());
598static_assert(!check_equality_comparable_with<int (S::*)() const volatile,
599 int (S::*)() const volatile&&>());
600static_assert(!check_equality_comparable_with < int (S::*)() const volatile,
601 int (S::*)() const volatile&& noexcept > ());
602
603static_assert(
604 check_equality_comparable_with<int (S::*)() const volatile noexcept,
605 int (S::*)() const volatile noexcept>());
606static_assert(!check_equality_comparable_with<
607 int (S::*)() const volatile noexcept, int (S::*)() &>());
608static_assert(!check_equality_comparable_with<
609 int (S::*)() const volatile noexcept, int (S::*)() & noexcept>());
610static_assert(!check_equality_comparable_with<
611 int (S::*)() const volatile noexcept, int (S::*)() const&>());
612static_assert(
613 !check_equality_comparable_with<int (S::*)() const volatile noexcept,
614 int (S::*)() const & noexcept>());
615static_assert(!check_equality_comparable_with<
616 int (S::*)() const volatile noexcept, int (S::*)() volatile&>());
617static_assert(
618 !check_equality_comparable_with<int (S::*)() const volatile noexcept,
619 int (S::*)() volatile & noexcept>());
620static_assert(
621 !check_equality_comparable_with<int (S::*)() const volatile noexcept,
622 int (S::*)() const volatile&>());
623static_assert(
624 !check_equality_comparable_with<int (S::*)() const volatile noexcept,
625 int (S::*)() const volatile & noexcept>());
626static_assert(!check_equality_comparable_with<
627 int (S::*)() const volatile noexcept, int (S::*)() &&>());
628static_assert(!check_equality_comparable_with < int (S::*)()
629 const volatile noexcept,
630 int (S::*)() && noexcept > ());
631static_assert(!check_equality_comparable_with<
632 int (S::*)() const volatile noexcept, int (S::*)() const&&>());
633static_assert(!check_equality_comparable_with < int (S::*)()
634 const volatile noexcept,
635 int (S::*)() const&& noexcept > ());
636static_assert(!check_equality_comparable_with<
637 int (S::*)() const volatile noexcept, int (S::*)() volatile&&>());
638static_assert(!check_equality_comparable_with < int (S::*)()
639 const volatile noexcept,
640 int (S::*)() volatile&& noexcept > ());
641static_assert(
642 !check_equality_comparable_with<int (S::*)() const volatile noexcept,
643 int (S::*)() const volatile&&>());
644static_assert(!check_equality_comparable_with < int (S::*)()
645 const volatile noexcept,
646 int (S::*)() const volatile&& noexcept > ());
647
648static_assert(check_equality_comparable_with<int (S::*)() &, int (S::*)() &>());
649static_assert(
650 check_equality_comparable_with<int (S::*)() &, int (S::*)() & noexcept>());
651static_assert(
652 !check_equality_comparable_with<int (S::*)() &, int (S::*)() const&>());
653static_assert(!check_equality_comparable_with<int (S::*)() &,
654 int (S::*)() const & noexcept>());
655static_assert(
656 !check_equality_comparable_with<int (S::*)() &, int (S::*)() volatile&>());
657static_assert(!check_equality_comparable_with<
658 int (S::*)() &, int (S::*)() volatile & noexcept>());
659static_assert(!check_equality_comparable_with<int (S::*)() &,
660 int (S::*)() const volatile&>());
661static_assert(!check_equality_comparable_with<
662 int (S::*)() &, int (S::*)() const volatile & noexcept>());
663static_assert(
664 !check_equality_comparable_with<int (S::*)() &, int (S::*)() &&>());
665static_assert(!check_equality_comparable_with < int (S::*)() &,
666 int (S::*)() && noexcept > ());
667static_assert(
668 !check_equality_comparable_with<int (S::*)() &, int (S::*)() const&&>());
669static_assert(!check_equality_comparable_with < int (S::*)() &,
670 int (S::*)() const&& noexcept > ());
671static_assert(
672 !check_equality_comparable_with<int (S::*)() &, int (S::*)() volatile&&>());
673static_assert(!check_equality_comparable_with < int (S::*)() &,
674 int (S::*)() volatile&& noexcept > ());
675static_assert(!check_equality_comparable_with<int (S::*)() &,
676 int (S::*)() const volatile&&>());
677static_assert(!check_equality_comparable_with < int (S::*)() &,
678 int (S::*)() const volatile&& noexcept > ());
679
680static_assert(check_equality_comparable_with<int (S::*)() & noexcept,
681 int (S::*)() & noexcept>());
682static_assert(!check_equality_comparable_with<int (S::*)() & noexcept,
683 int (S::*)() const&>());
684static_assert(!check_equality_comparable_with<int (S::*)() & noexcept,
685 int (S::*)() const & noexcept>());
686static_assert(!check_equality_comparable_with<int (S::*)() & noexcept,
687 int (S::*)() volatile&>());
688static_assert(!check_equality_comparable_with<
689 int (S::*)() & noexcept, int (S::*)() volatile & noexcept>());
690static_assert(!check_equality_comparable_with<int (S::*)() & noexcept,
691 int (S::*)() const volatile&>());
692static_assert(
693 !check_equality_comparable_with<int (S::*)() & noexcept,
694 int (S::*)() const volatile & noexcept>());
695static_assert(!check_equality_comparable_with<int (S::*)() & noexcept,
696 int (S::*)() &&>());
697static_assert(!check_equality_comparable_with < int (S::*)() & noexcept,
698 int (S::*)() && noexcept > ());
699static_assert(!check_equality_comparable_with<int (S::*)() & noexcept,
700 int (S::*)() const&&>());
701static_assert(!check_equality_comparable_with < int (S::*)() & noexcept,
702 int (S::*)() const&& noexcept > ());
703static_assert(!check_equality_comparable_with<int (S::*)() & noexcept,
704 int (S::*)() volatile&&>());
705static_assert(!check_equality_comparable_with < int (S::*)() & noexcept,
706 int (S::*)() volatile&& noexcept > ());
707static_assert(!check_equality_comparable_with<int (S::*)() & noexcept,
708 int (S::*)() const volatile&&>());
709static_assert(!check_equality_comparable_with < int (S::*)() & noexcept,
710 int (S::*)() const volatile&& noexcept > ());
711
712static_assert(
713 check_equality_comparable_with<int (S::*)() const&, int (S::*)() const&>());
714static_assert(check_equality_comparable_with<int (S::*)() const&,
715 int (S::*)() const & noexcept>());
716static_assert(!check_equality_comparable_with<int (S::*)() const&,
717 int (S::*)() volatile&>());
718static_assert(!check_equality_comparable_with<
719 int (S::*)() const&, int (S::*)() volatile & noexcept>());
720static_assert(!check_equality_comparable_with<int (S::*)() const&,
721 int (S::*)() const volatile&>());
722static_assert(!check_equality_comparable_with<
723 int (S::*)() const&, int (S::*)() const volatile & noexcept>());
724static_assert(
725 !check_equality_comparable_with<int (S::*)() const&, int (S::*)() &&>());
726static_assert(!check_equality_comparable_with < int (S::*)() const&,
727 int (S::*)() && noexcept > ());
728static_assert(!check_equality_comparable_with<int (S::*)() const&,
729 int (S::*)() const&&>());
730static_assert(!check_equality_comparable_with < int (S::*)() const&,
731 int (S::*)() const&& noexcept > ());
732static_assert(!check_equality_comparable_with<int (S::*)() const&,
733 int (S::*)() volatile&&>());
734static_assert(!check_equality_comparable_with < int (S::*)() const&,
735 int (S::*)() volatile&& noexcept > ());
736static_assert(!check_equality_comparable_with<int (S::*)() const&,
737 int (S::*)() const volatile&&>());
738static_assert(!check_equality_comparable_with < int (S::*)() const&,
739 int (S::*)() const volatile&& noexcept > ());
740
741static_assert(check_equality_comparable_with<int (S::*)() const & noexcept,
742 int (S::*)() const & noexcept>());
743static_assert(!check_equality_comparable_with<int (S::*)() const & noexcept,
744 int (S::*)() volatile&>());
745static_assert(
746 !check_equality_comparable_with<int (S::*)() const & noexcept,
747 int (S::*)() volatile & noexcept>());
748static_assert(!check_equality_comparable_with<int (S::*)() const & noexcept,
749 int (S::*)() const volatile&>());
750static_assert(
751 !check_equality_comparable_with<int (S::*)() const & noexcept,
752 int (S::*)() const volatile & noexcept>());
753static_assert(!check_equality_comparable_with<int (S::*)() const & noexcept,
754 int (S::*)() &&>());
755static_assert(!check_equality_comparable_with < int (S::*)() const& noexcept,
756 int (S::*)() && noexcept > ());
757static_assert(!check_equality_comparable_with<int (S::*)() const & noexcept,
758 int (S::*)() const&&>());
759static_assert(!check_equality_comparable_with < int (S::*)() const& noexcept,
760 int (S::*)() const&& noexcept > ());
761static_assert(!check_equality_comparable_with<int (S::*)() const & noexcept,
762 int (S::*)() volatile&&>());
763static_assert(!check_equality_comparable_with < int (S::*)() const& noexcept,
764 int (S::*)() volatile&& noexcept > ());
765static_assert(!check_equality_comparable_with<int (S::*)() const & noexcept,
766 int (S::*)() const volatile&&>());
767static_assert(!check_equality_comparable_with < int (S::*)() const& noexcept,
768 int (S::*)() const volatile&& noexcept > ());
769
770static_assert(check_equality_comparable_with<int (S::*)() volatile&,
771 int (S::*)() volatile&>());
772static_assert(check_equality_comparable_with<
773 int (S::*)() volatile&, int (S::*)() volatile & noexcept>());
774static_assert(!check_equality_comparable_with<int (S::*)() volatile&,
775 int (S::*)() const volatile&>());
776static_assert(
777 !check_equality_comparable_with<int (S::*)() volatile&,
778 int (S::*)() const volatile & noexcept>());
779static_assert(
780 !check_equality_comparable_with<int (S::*)() volatile&, int (S::*)() &&>());
781static_assert(!check_equality_comparable_with < int (S::*)() volatile&,
782 int (S::*)() && noexcept > ());
783static_assert(!check_equality_comparable_with<int (S::*)() volatile&,
784 int (S::*)() const&&>());
785static_assert(!check_equality_comparable_with < int (S::*)() volatile&,
786 int (S::*)() const&& noexcept > ());
787static_assert(!check_equality_comparable_with<int (S::*)() volatile&,
788 int (S::*)() volatile&&>());
789static_assert(!check_equality_comparable_with < int (S::*)() volatile&,
790 int (S::*)() volatile&& noexcept > ());
791static_assert(!check_equality_comparable_with<int (S::*)() volatile&,
792 int (S::*)() const volatile&&>());
793static_assert(!check_equality_comparable_with < int (S::*)() volatile&,
794 int (S::*)() const volatile&& noexcept > ());
795
796static_assert(
797 check_equality_comparable_with<int (S::*)() volatile & noexcept,
798 int (S::*)() volatile & noexcept>());
799static_assert(!check_equality_comparable_with<int (S::*)() volatile & noexcept,
800 int (S::*)() const volatile&>());
801static_assert(
802 !check_equality_comparable_with<int (S::*)() volatile & noexcept,
803 int (S::*)() const volatile & noexcept>());
804static_assert(!check_equality_comparable_with<int (S::*)() volatile & noexcept,
805 int (S::*)() &&>());
806static_assert(!check_equality_comparable_with < int (S::*)() volatile& noexcept,
807 int (S::*)() && noexcept > ());
808static_assert(!check_equality_comparable_with<int (S::*)() volatile & noexcept,
809 int (S::*)() const&&>());
810static_assert(!check_equality_comparable_with < int (S::*)() volatile& noexcept,
811 int (S::*)() const&& noexcept > ());
812static_assert(!check_equality_comparable_with<int (S::*)() volatile & noexcept,
813 int (S::*)() volatile&&>());
814static_assert(!check_equality_comparable_with < int (S::*)() volatile& noexcept,
815 int (S::*)() volatile&& noexcept > ());
816static_assert(!check_equality_comparable_with<int (S::*)() volatile & noexcept,
817 int (S::*)() const volatile&&>());
818static_assert(!check_equality_comparable_with < int (S::*)() volatile& noexcept,
819 int (S::*)() const volatile&& noexcept > ());
820
821static_assert(check_equality_comparable_with<int (S::*)() const volatile&,
822 int (S::*)() const volatile&>());
823static_assert(
824 check_equality_comparable_with<int (S::*)() const volatile&,
825 int (S::*)() const volatile & noexcept>());
826static_assert(!check_equality_comparable_with<int (S::*)() const volatile&,
827 int (S::*)() &&>());
828static_assert(!check_equality_comparable_with < int (S::*)() const volatile&,
829 int (S::*)() && noexcept > ());
830static_assert(!check_equality_comparable_with<int (S::*)() const volatile&,
831 int (S::*)() const&&>());
832static_assert(!check_equality_comparable_with < int (S::*)() const volatile&,
833 int (S::*)() const&& noexcept > ());
834static_assert(!check_equality_comparable_with<int (S::*)() const volatile&,
835 int (S::*)() volatile&&>());
836static_assert(!check_equality_comparable_with < int (S::*)() const volatile&,
837 int (S::*)() volatile&& noexcept > ());
838static_assert(!check_equality_comparable_with<int (S::*)() const volatile&,
839 int (S::*)() const volatile&&>());
840static_assert(!check_equality_comparable_with < int (S::*)() const volatile&,
841 int (S::*)() const volatile&& noexcept > ());
842
843static_assert(
844 check_equality_comparable_with<int (S::*)() const volatile & noexcept,
845 int (S::*)() const volatile & noexcept>());
846static_assert(!check_equality_comparable_with<
847 int (S::*)() const volatile & noexcept, int (S::*)() &&>());
848static_assert(!check_equality_comparable_with < int (S::*)()
849 const volatile& noexcept,
850 int (S::*)() && noexcept > ());
851static_assert(!check_equality_comparable_with<
852 int (S::*)() const volatile & noexcept, int (S::*)() const&&>());
853static_assert(!check_equality_comparable_with < int (S::*)()
854 const volatile& noexcept,
855 int (S::*)() const&& noexcept > ());
856static_assert(
857 !check_equality_comparable_with<int (S::*)() const volatile & noexcept,
858 int (S::*)() volatile&&>());
859static_assert(!check_equality_comparable_with < int (S::*)()
860 const volatile& noexcept,
861 int (S::*)() volatile&& noexcept > ());
862static_assert(
863 !check_equality_comparable_with<int (S::*)() const volatile & noexcept,
864 int (S::*)() const volatile&&>());
865static_assert(!check_equality_comparable_with < int (S::*)()
866 const volatile& noexcept,
867 int (S::*)() const volatile&& noexcept > ());
868
869static_assert(
870 check_equality_comparable_with<int (S::*)() &&, int (S::*)() &&>());
871static_assert(check_equality_comparable_with<int (S::*)() &&,
872 int (S::*)() && noexcept>());
873static_assert(
874 !check_equality_comparable_with<int (S::*)() &&, int (S::*)() const&&>());
875static_assert(!check_equality_comparable_with < int (S::*)() &&,
876 int (S::*)() const&& noexcept > ());
877static_assert(!check_equality_comparable_with<int (S::*)() &&,
878 int (S::*)() volatile&&>());
879static_assert(!check_equality_comparable_with < int (S::*)() &&,
880 int (S::*)() volatile&& noexcept > ());
881static_assert(!check_equality_comparable_with<int (S::*)() &&,
882 int (S::*)() const volatile&&>());
883static_assert(!check_equality_comparable_with < int (S::*)() &&,
884 int (S::*)() const volatile&& noexcept > ());
885
886static_assert(check_equality_comparable_with<int (S::*)() && noexcept,
887 int (S::*)() && noexcept>());
888static_assert(!check_equality_comparable_with < int (S::*)() && noexcept,
889 int (S::*)() const&& > ());
890static_assert(!check_equality_comparable_with < int (S::*)() && noexcept,
891 int (S::*)() const&& noexcept > ());
892static_assert(!check_equality_comparable_with < int (S::*)() && noexcept,
893 int (S::*)() volatile&& > ());
894static_assert(!check_equality_comparable_with < int (S::*)() && noexcept,
895 int (S::*)() volatile&& noexcept > ());
896static_assert(!check_equality_comparable_with < int (S::*)() && noexcept,
897 int (S::*)() const volatile&& > ());
898static_assert(!check_equality_comparable_with < int (S::*)() && noexcept,
899 int (S::*)() const volatile&& noexcept > ());
900
901static_assert(check_equality_comparable_with<int (S::*)() const&&,
902 int (S::*)() const&&>());
903static_assert(check_equality_comparable_with<int (S::*)() const&&,
904 int (S::*)() const && noexcept>());
905static_assert(!check_equality_comparable_with<int (S::*)() const&&,
906 int (S::*)() volatile&&>());
907static_assert(!check_equality_comparable_with < int (S::*)() const&&,
908 int (S::*)() volatile&& noexcept > ());
909static_assert(!check_equality_comparable_with<int (S::*)() const&&,
910 int (S::*)() const volatile&&>());
911static_assert(!check_equality_comparable_with < int (S::*)() const&&,
912 int (S::*)() const volatile&& noexcept > ());
913
914static_assert(check_equality_comparable_with<int (S::*)() const && noexcept,
915 int (S::*)() const && noexcept>());
916static_assert(!check_equality_comparable_with < int (S::*)() const&& noexcept,
917 int (S::*)() volatile&& > ());
918static_assert(!check_equality_comparable_with < int (S::*)() const&& noexcept,
919 int (S::*)() volatile&& noexcept > ());
920static_assert(!check_equality_comparable_with < int (S::*)() const&& noexcept,
921 int (S::*)() const volatile&& > ());
922static_assert(!check_equality_comparable_with < int (S::*)() const&& noexcept,
923 int (S::*)() const volatile&& noexcept > ());
924
925static_assert(check_equality_comparable_with<int (S::*)() volatile&&,
926 int (S::*)() volatile&&>());
927static_assert(check_equality_comparable_with<
928 int (S::*)() volatile&&, int (S::*)() volatile && noexcept>());
929static_assert(!check_equality_comparable_with<int (S::*)() volatile&&,
930 int (S::*)() const volatile&&>());
931static_assert(!check_equality_comparable_with < int (S::*)() volatile&&,
932 int (S::*)() const volatile&& noexcept > ());
933
934static_assert(
935 check_equality_comparable_with<int (S::*)() volatile && noexcept,
936 int (S::*)() volatile && noexcept>());
937static_assert(!check_equality_comparable_with <
938 int (S::*)() volatile&& noexcept,
939 int (S::*)() const volatile&& > ());
940static_assert(!check_equality_comparable_with <
941 int (S::*)() volatile&& noexcept,
942 int (S::*)() const volatile&& noexcept > ());
943
944static_assert(check_equality_comparable_with<int (S::*)() const volatile&&,
945 int (S::*)() const volatile&&>());
946static_assert(
947 check_equality_comparable_with<int (S::*)() const volatile&&,
948 int (S::*)() const volatile && noexcept>());
949static_assert(
950 check_equality_comparable_with<int (S::*)() const volatile && noexcept,
951 int (S::*)() const volatile && noexcept>());
952
953static_assert(!check_equality_comparable_with<std::nullptr_t, int>());
954static_assert(check_equality_comparable_with<std::nullptr_t, int*>());
955// Array comparisons are ill-formed in C++26, but Clang doesn't implement this yet.
956#if TEST_STD_VER <= 23 || defined(TEST_COMPILER_CLANG)
957static_assert(check_equality_comparable_with<std::nullptr_t, int[5]>());
958#else
959static_assert(!check_equality_comparable_with<std::nullptr_t, int[5]>());
960#endif
961static_assert(check_equality_comparable_with<std::nullptr_t, int (*)()>());
962static_assert(check_equality_comparable_with<std::nullptr_t, int (&)()>());
963static_assert(check_equality_comparable_with<std::nullptr_t, int (S::*)()>());
964static_assert(
965 check_equality_comparable_with<std::nullptr_t, int (S::*)() noexcept>());
966static_assert(
967 check_equality_comparable_with<std::nullptr_t, int (S::*)() const>());
968static_assert(check_equality_comparable_with<std::nullptr_t,
969 int (S::*)() const noexcept>());
970static_assert(
971 check_equality_comparable_with<std::nullptr_t, int (S::*)() volatile>());
972static_assert(check_equality_comparable_with<std::nullptr_t,
973 int (S::*)() volatile noexcept>());
974static_assert(check_equality_comparable_with<std::nullptr_t,
975 int (S::*)() const volatile>());
976static_assert(check_equality_comparable_with<
977 std::nullptr_t, int (S::*)() const volatile noexcept>());
978static_assert(check_equality_comparable_with<std::nullptr_t, int (S::*)() &>());
979static_assert(
980 check_equality_comparable_with<std::nullptr_t, int (S::*)() & noexcept>());
981static_assert(
982 check_equality_comparable_with<std::nullptr_t, int (S::*)() const&>());
983static_assert(check_equality_comparable_with<std::nullptr_t,
984 int (S::*)() const & noexcept>());
985static_assert(
986 check_equality_comparable_with<std::nullptr_t, int (S::*)() volatile&>());
987static_assert(check_equality_comparable_with<
988 std::nullptr_t, int (S::*)() volatile & noexcept>());
989static_assert(check_equality_comparable_with<std::nullptr_t,
990 int (S::*)() const volatile&>());
991static_assert(check_equality_comparable_with<
992 std::nullptr_t, int (S::*)() const volatile & noexcept>());
993static_assert(
994 check_equality_comparable_with<std::nullptr_t, int (S::*)() &&>());
995static_assert(
996 check_equality_comparable_with<std::nullptr_t, int (S::*)() && noexcept>());
997static_assert(
998 check_equality_comparable_with<std::nullptr_t, int (S::*)() const&&>());
999static_assert(check_equality_comparable_with<std::nullptr_t,
1000 int (S::*)() const && noexcept>());
1001static_assert(
1002 check_equality_comparable_with<std::nullptr_t, int (S::*)() volatile&&>());
1003static_assert(check_equality_comparable_with<
1004 std::nullptr_t, int (S::*)() volatile && noexcept>());
1005static_assert(check_equality_comparable_with<std::nullptr_t,
1006 int (S::*)() const volatile&&>());
1007static_assert(check_equality_comparable_with<
1008 std::nullptr_t, int (S::*)() const volatile && noexcept>());
1009
1010static_assert(!std::equality_comparable_with<void, int>);
1011static_assert(!std::equality_comparable_with<void, int*>);
1012static_assert(!std::equality_comparable_with<void, std::nullptr_t>);
1013static_assert(!std::equality_comparable_with<void, int[5]>);
1014static_assert(!std::equality_comparable_with<void, int (*)()>);
1015static_assert(!std::equality_comparable_with<void, int (&)()>);
1016static_assert(!std::equality_comparable_with<void, int S::*>);
1017static_assert(!std::equality_comparable_with<void, int (S::*)()>);
1018static_assert(!std::equality_comparable_with<void, int (S::*)() noexcept>);
1019static_assert(!std::equality_comparable_with<void, int (S::*)() const>);
1020static_assert(
1021 !std::equality_comparable_with<void, int (S::*)() const noexcept>);
1022static_assert(!std::equality_comparable_with<void, int (S::*)() volatile>);
1023static_assert(
1024 !std::equality_comparable_with<void, int (S::*)() volatile noexcept>);
1025static_assert(
1026 !std::equality_comparable_with<void, int (S::*)() const volatile>);
1027static_assert(
1028 !std::equality_comparable_with<void, int (S::*)() const volatile noexcept>);
1029static_assert(!std::equality_comparable_with<void, int (S::*)() &>);
1030static_assert(!std::equality_comparable_with<void, int (S::*)() & noexcept>);
1031static_assert(!std::equality_comparable_with<void, int (S::*)() const&>);
1032static_assert(
1033 !std::equality_comparable_with<void, int (S::*)() const & noexcept>);
1034static_assert(!std::equality_comparable_with<void, int (S::*)() volatile&>);
1035static_assert(
1036 !std::equality_comparable_with<void, int (S::*)() volatile & noexcept>);
1037static_assert(
1038 !std::equality_comparable_with<void, int (S::*)() const volatile&>);
1039static_assert(!std::equality_comparable_with<void, int (S::*)() const volatile &
1040 noexcept>);
1041static_assert(!std::equality_comparable_with<void, int (S::*)() &&>);
1042static_assert(!std::equality_comparable_with < void,
1043 int (S::*)() && noexcept >);
1044static_assert(!std::equality_comparable_with<void, int (S::*)() const&&>);
1045static_assert(!std::equality_comparable_with < void,
1046 int (S::*)() const&& noexcept >);
1047static_assert(!std::equality_comparable_with<void, int (S::*)() volatile&&>);
1048static_assert(!std::equality_comparable_with < void,
1049 int (S::*)() volatile&& noexcept >);
1050static_assert(
1051 !std::equality_comparable_with<void, int (S::*)() const volatile&&>);
1052static_assert(!std::equality_comparable_with < void,
1053 int (S::*)() const volatile&& noexcept >);
1054} // namespace fundamentals
1055
1056namespace standard_types {
1057static_assert(check_equality_comparable_with<std::array<int, 10>,
1058 std::array<int, 10> >());
1059static_assert(!check_equality_comparable_with<std::array<int, 10>,
1060 std::array<double, 10> >());
1061static_assert(
1062 check_equality_comparable_with<std::deque<int>, std::deque<int> >());
1063static_assert(
1064 !check_equality_comparable_with<std::deque<int>, std::vector<int> >());
1065static_assert(check_equality_comparable_with<std::forward_list<int>,
1066 std::forward_list<int> >());
1067static_assert(!check_equality_comparable_with<std::forward_list<int>,
1068 std::vector<int> >());
1069static_assert(
1070 check_equality_comparable_with<std::list<int>, std::list<int> >());
1071static_assert(
1072 !check_equality_comparable_with<std::list<int>, std::vector<int> >());
1073
1074#ifndef TEST_HAS_NO_THREADS
1075static_assert(!check_equality_comparable_with<std::lock_guard<std::mutex>,
1076 std::lock_guard<std::mutex> >());
1077static_assert(!check_equality_comparable_with<std::lock_guard<std::mutex>,
1078 std::vector<int> >());
1079static_assert(!check_equality_comparable_with<std::mutex, std::mutex>());
1080static_assert(!check_equality_comparable_with<std::mutex, std::vector<int> >());
1081#endif
1082
1083static_assert(check_equality_comparable_with<std::map<int, void*>,
1084 std::map<int, void*> >());
1085static_assert(
1086 !check_equality_comparable_with<std::map<int, void*>, std::vector<int> >());
1087static_assert(
1088 check_equality_comparable_with<std::optional<std::vector<int> >,
1089 std::optional<std::vector<int> > >());
1090static_assert(check_equality_comparable_with<std::optional<std::vector<int> >,
1091 std::vector<int> >());
1092static_assert(
1093 check_equality_comparable_with<std::vector<int>, std::vector<int> >());
1094static_assert(!check_equality_comparable_with<std::vector<int>, int>());
1095} // namespace standard_types
1096
1097namespace types_fit_for_purpose {
1098static_assert(
1099 check_equality_comparable_with<cxx20_member_eq, cxx20_member_eq>());
1100static_assert(
1101 check_equality_comparable_with<cxx20_friend_eq, cxx20_friend_eq>());
1102static_assert(
1103 !check_equality_comparable_with<cxx20_member_eq, cxx20_friend_eq>());
1104
1105static_assert(check_equality_comparable_with<member_three_way_comparable,
1106 member_three_way_comparable>());
1107static_assert(check_equality_comparable_with<friend_three_way_comparable,
1108 friend_three_way_comparable>());
1109static_assert(!check_equality_comparable_with<member_three_way_comparable,
1110 friend_three_way_comparable>());
1111
1112static_assert(
1113 check_equality_comparable_with<explicit_operators, explicit_operators>());
1114static_assert(check_equality_comparable_with<equality_comparable_with_ec1,
1115 equality_comparable_with_ec1>());
1116static_assert(check_equality_comparable_with<different_return_types,
1117 different_return_types>());
1118static_assert(check_equality_comparable_with<explicit_operators,
1119 equality_comparable_with_ec1>());
1120static_assert(check_equality_comparable_with<explicit_operators,
1121 different_return_types>());
1122
1123static_assert(check_equality_comparable_with<one_way_eq, one_way_eq>());
1124static_assert(
1125 std::common_reference_with<one_way_eq const&, explicit_operators const&>);
1126static_assert(
1127 !check_equality_comparable_with<one_way_eq, explicit_operators>());
1128
1129static_assert(check_equality_comparable_with<one_way_ne, one_way_ne>());
1130static_assert(
1131 std::common_reference_with<one_way_ne const&, explicit_operators const&>);
1132static_assert(
1133 !check_equality_comparable_with<one_way_ne, explicit_operators>());
1134} // namespace types_fit_for_purpose
1135

source code of libcxx/test/std/concepts/concepts.compare/concept.equalitycomparable/equality_comparable_with.compile.pass.cpp