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