1d8380ad9SArthur O'Dwyer //===----------------------------------------------------------------------===//
2d8380ad9SArthur O'Dwyer //
3d8380ad9SArthur O'Dwyer // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d8380ad9SArthur O'Dwyer // See https://llvm.org/LICENSE.txt for license information.
5d8380ad9SArthur O'Dwyer // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d8380ad9SArthur O'Dwyer //
7d8380ad9SArthur O'Dwyer //===----------------------------------------------------------------------===//
8d8380ad9SArthur O'Dwyer 
9d8380ad9SArthur O'Dwyer // UNSUPPORTED: c++03, c++11, c++14, c++17
10d8380ad9SArthur O'Dwyer 
11d8380ad9SArthur O'Dwyer // <compare>
12d8380ad9SArthur O'Dwyer 
13d8380ad9SArthur O'Dwyer // template<class T> constexpr weak_ordering weak_order(const T& a, const T& b);
14d8380ad9SArthur O'Dwyer 
15d8380ad9SArthur O'Dwyer #include <compare>
16d8380ad9SArthur O'Dwyer 
17d8380ad9SArthur O'Dwyer #include <cassert>
18d8380ad9SArthur O'Dwyer #include <cmath>
19d8380ad9SArthur O'Dwyer #include <iterator> // std::size
20d8380ad9SArthur O'Dwyer #include <limits>
21d8380ad9SArthur O'Dwyer #include <type_traits>
22d8380ad9SArthur O'Dwyer #include <utility>
23d8380ad9SArthur O'Dwyer 
24d8380ad9SArthur O'Dwyer #include "test_macros.h"
25d8380ad9SArthur O'Dwyer 
26d8380ad9SArthur O'Dwyer template<class T, class U>
has_weak_order(T && t,U && u)27d8380ad9SArthur O'Dwyer constexpr auto has_weak_order(T&& t, U&& u)
28d8380ad9SArthur O'Dwyer     -> decltype(std::weak_order(static_cast<T&&>(t), static_cast<U&&>(u)), true)
29d8380ad9SArthur O'Dwyer {
30d8380ad9SArthur O'Dwyer     return true;
31d8380ad9SArthur O'Dwyer }
32d8380ad9SArthur O'Dwyer 
has_weak_order(...)33d8380ad9SArthur O'Dwyer constexpr bool has_weak_order(...) {
34d8380ad9SArthur O'Dwyer     return false;
35d8380ad9SArthur O'Dwyer }
36d8380ad9SArthur O'Dwyer 
37d8380ad9SArthur O'Dwyer namespace N11 {
38d8380ad9SArthur O'Dwyer     struct A {};
39d8380ad9SArthur O'Dwyer     struct B {};
weak_order(const A &,const A &)40d8380ad9SArthur O'Dwyer     std::strong_ordering weak_order(const A&, const A&) { return std::strong_ordering::less; }
41d8380ad9SArthur O'Dwyer     std::strong_ordering weak_order(const A&, const B&);
42d8380ad9SArthur O'Dwyer }
43d8380ad9SArthur O'Dwyer 
test_1_1()44d8380ad9SArthur O'Dwyer void test_1_1()
45d8380ad9SArthur O'Dwyer {
46d8380ad9SArthur O'Dwyer     // If the decayed types of E and F differ, weak_order(E, F) is ill-formed.
47d8380ad9SArthur O'Dwyer 
48d8380ad9SArthur O'Dwyer     static_assert( has_weak_order(1, 2));
49d8380ad9SArthur O'Dwyer     static_assert(!has_weak_order(1, (short)2));
50d8380ad9SArthur O'Dwyer     static_assert(!has_weak_order(1, 2.0));
51d8380ad9SArthur O'Dwyer     static_assert(!has_weak_order(1.0f, 2.0));
52d8380ad9SArthur O'Dwyer 
53d8380ad9SArthur O'Dwyer     static_assert( has_weak_order((int*)nullptr, (int*)nullptr));
54d8380ad9SArthur O'Dwyer     static_assert(!has_weak_order((int*)nullptr, (const int*)nullptr));
55d8380ad9SArthur O'Dwyer     static_assert(!has_weak_order((const int*)nullptr, (int*)nullptr));
56d8380ad9SArthur O'Dwyer     static_assert( has_weak_order((const int*)nullptr, (const int*)nullptr));
57d8380ad9SArthur O'Dwyer 
58d8380ad9SArthur O'Dwyer     N11::A a;
59d8380ad9SArthur O'Dwyer     N11::B b;
60d8380ad9SArthur O'Dwyer     static_assert( has_weak_order(a, a));
61d8380ad9SArthur O'Dwyer     static_assert(!has_weak_order(a, b));
62d8380ad9SArthur O'Dwyer }
63d8380ad9SArthur O'Dwyer 
64d8380ad9SArthur O'Dwyer namespace N12 {
65d8380ad9SArthur O'Dwyer     struct A {};
weak_order(A &,A &&)66d8380ad9SArthur O'Dwyer     std::strong_ordering weak_order(A&, A&&) { return std::strong_ordering::less; }
weak_order(A &&,A &&)67d8380ad9SArthur O'Dwyer     std::strong_ordering weak_order(A&&, A&&) { return std::strong_ordering::equal; }
68d8380ad9SArthur O'Dwyer     std::strong_ordering weak_order(const A&, const A&);
69d8380ad9SArthur O'Dwyer 
70d8380ad9SArthur O'Dwyer     struct B {
71d8380ad9SArthur O'Dwyer         friend std::partial_ordering weak_order(B&, B&);
72d8380ad9SArthur O'Dwyer     };
73d8380ad9SArthur O'Dwyer 
74d8380ad9SArthur O'Dwyer     struct WeakOrder {
operator std::weak_orderingN12::WeakOrder75d8380ad9SArthur O'Dwyer         explicit operator std::weak_ordering() const { return std::weak_ordering::less; }
76d8380ad9SArthur O'Dwyer     };
77d8380ad9SArthur O'Dwyer     struct C {
78d8380ad9SArthur O'Dwyer         bool touched = false;
weak_order(C & lhs,C &)79d8380ad9SArthur O'Dwyer         friend WeakOrder weak_order(C& lhs, C&) { lhs.touched = true; return WeakOrder(); }
80d8380ad9SArthur O'Dwyer     };
81d8380ad9SArthur O'Dwyer }
82d8380ad9SArthur O'Dwyer 
test_1_2()83d8380ad9SArthur O'Dwyer void test_1_2()
84d8380ad9SArthur O'Dwyer {
85d8380ad9SArthur O'Dwyer     // Otherwise, weak_ordering(weak_order(E, F))
86d8380ad9SArthur O'Dwyer     // if it is a well-formed expression with overload resolution performed
87d8380ad9SArthur O'Dwyer     // in a context that does not include a declaration of std::weak_order.
88d8380ad9SArthur O'Dwyer 
89d8380ad9SArthur O'Dwyer     // Test that weak_order does not const-qualify the forwarded arguments.
90d8380ad9SArthur O'Dwyer     N12::A a;
91d8380ad9SArthur O'Dwyer     assert(std::weak_order(a, std::move(a)) == std::weak_ordering::less);
92d8380ad9SArthur O'Dwyer     assert(std::weak_order(std::move(a), std::move(a)) == std::weak_ordering::equivalent);
93d8380ad9SArthur O'Dwyer 
94d8380ad9SArthur O'Dwyer     // The type of weak_order(e,f) must be explicitly convertible to weak_ordering.
95d8380ad9SArthur O'Dwyer     N12::B b;
96d8380ad9SArthur O'Dwyer     static_assert(!has_weak_order(b, b));
97d8380ad9SArthur O'Dwyer 
98d8380ad9SArthur O'Dwyer     N12::C c1, c2;
99d8380ad9SArthur O'Dwyer     ASSERT_SAME_TYPE(decltype(std::weak_order(c1, c2)), std::weak_ordering);
100d8380ad9SArthur O'Dwyer     assert(std::weak_order(c1, c2) == std::weak_ordering::less);
101d8380ad9SArthur O'Dwyer     assert(c1.touched);
102d8380ad9SArthur O'Dwyer     assert(!c2.touched);
103d8380ad9SArthur O'Dwyer }
104d8380ad9SArthur O'Dwyer 
105d8380ad9SArthur O'Dwyer template<class F>
test_1_3()106d8380ad9SArthur O'Dwyer constexpr bool test_1_3()
107d8380ad9SArthur O'Dwyer {
108d8380ad9SArthur O'Dwyer     // Otherwise, if the decayed type T of E is a floating-point type,
109d8380ad9SArthur O'Dwyer     // yields a value of type weak_ordering that is consistent with
110d8380ad9SArthur O'Dwyer     // the ordering observed by T's comparison operators and strong_order,
111d8380ad9SArthur O'Dwyer     // and if numeric_limits<T>::is_iec559 is true, is additionally consistent with
112d8380ad9SArthur O'Dwyer     // the following equivalence classes...
113d8380ad9SArthur O'Dwyer 
114d8380ad9SArthur O'Dwyer     // std::numeric_limits<F>::is_iec559 is usually true.
115d8380ad9SArthur O'Dwyer     // It is false for F=long double on AIX; but this test is still expected
116d8380ad9SArthur O'Dwyer     // to pass (e.g. std::weak_order(+0, -0) == weak_ordering::equivalent,
117d8380ad9SArthur O'Dwyer     // even on AIX).
118d8380ad9SArthur O'Dwyer 
119d8380ad9SArthur O'Dwyer     ASSERT_SAME_TYPE(decltype(std::weak_order(F(0), F(0))), std::weak_ordering);
120d8380ad9SArthur O'Dwyer 
121d8380ad9SArthur O'Dwyer     F v[] = {
122d8380ad9SArthur O'Dwyer         -std::numeric_limits<F>::infinity(),
123d8380ad9SArthur O'Dwyer         std::numeric_limits<F>::lowest(),  // largest (finite) negative number
124d8380ad9SArthur O'Dwyer         F(-1.0), F(-0.1),
125d8380ad9SArthur O'Dwyer         -std::numeric_limits<F>::min(),    // smallest (normal) negative number
126d8380ad9SArthur O'Dwyer         F(-0.0),                           // negative zero
127d8380ad9SArthur O'Dwyer         F(0.0),
128d8380ad9SArthur O'Dwyer         std::numeric_limits<F>::min(),     // smallest (normal) positive number
129d8380ad9SArthur O'Dwyer         F(0.1), F(1.0), F(2.0), F(3.14),
130d8380ad9SArthur O'Dwyer         std::numeric_limits<F>::max(),     // largest (finite) positive number
131d8380ad9SArthur O'Dwyer         std::numeric_limits<F>::infinity(),
132d8380ad9SArthur O'Dwyer     };
133d8380ad9SArthur O'Dwyer 
134d8380ad9SArthur O'Dwyer     static_assert(std::size(v) == 14);
135d8380ad9SArthur O'Dwyer 
136d8380ad9SArthur O'Dwyer     // Sanity-check that array 'v' is indeed in the right order.
137d8380ad9SArthur O'Dwyer     for (int i=0; i < 14; ++i) {
138d8380ad9SArthur O'Dwyer         for (int j=0; j < 14; ++j) {
139d8380ad9SArthur O'Dwyer             auto naturalOrder = (v[i] <=> v[j]);
140d8380ad9SArthur O'Dwyer             if (v[i] == 0 && v[j] == 0) {
141d8380ad9SArthur O'Dwyer                 assert(naturalOrder == std::partial_ordering::equivalent);
142d8380ad9SArthur O'Dwyer             } else {
143d8380ad9SArthur O'Dwyer                 assert(naturalOrder == std::partial_ordering::unordered || naturalOrder == (i <=> j));
144d8380ad9SArthur O'Dwyer             }
145d8380ad9SArthur O'Dwyer         }
146d8380ad9SArthur O'Dwyer     }
147d8380ad9SArthur O'Dwyer 
148d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[0], v[0]) == std::weak_ordering::equivalent);
149d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[0], v[1]) == std::weak_ordering::less);
150d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[0], v[2]) == std::weak_ordering::less);
151d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[0], v[3]) == std::weak_ordering::less);
152d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[0], v[4]) == std::weak_ordering::less);
153d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[0], v[5]) == std::weak_ordering::less);
154d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[0], v[6]) == std::weak_ordering::less);
155d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[0], v[7]) == std::weak_ordering::less);
156d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[0], v[8]) == std::weak_ordering::less);
157d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[0], v[9]) == std::weak_ordering::less);
158d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[0], v[10]) == std::weak_ordering::less);
159d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[0], v[11]) == std::weak_ordering::less);
160d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[0], v[12]) == std::weak_ordering::less);
161d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[0], v[13]) == std::weak_ordering::less);
162d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[1], v[0]) == std::weak_ordering::greater);
163d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[1], v[1]) == std::weak_ordering::equivalent);
164d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[1], v[2]) == std::weak_ordering::less);
165d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[1], v[3]) == std::weak_ordering::less);
166d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[1], v[4]) == std::weak_ordering::less);
167d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[1], v[5]) == std::weak_ordering::less);
168d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[1], v[6]) == std::weak_ordering::less);
169d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[1], v[7]) == std::weak_ordering::less);
170d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[1], v[8]) == std::weak_ordering::less);
171d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[1], v[9]) == std::weak_ordering::less);
172d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[1], v[10]) == std::weak_ordering::less);
173d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[1], v[11]) == std::weak_ordering::less);
174d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[1], v[12]) == std::weak_ordering::less);
175d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[1], v[13]) == std::weak_ordering::less);
176d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[2], v[0]) == std::weak_ordering::greater);
177d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[2], v[1]) == std::weak_ordering::greater);
178d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[2], v[2]) == std::weak_ordering::equivalent);
179d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[2], v[3]) == std::weak_ordering::less);
180d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[2], v[4]) == std::weak_ordering::less);
181d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[2], v[5]) == std::weak_ordering::less);
182d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[2], v[6]) == std::weak_ordering::less);
183d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[2], v[7]) == std::weak_ordering::less);
184d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[2], v[8]) == std::weak_ordering::less);
185d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[2], v[9]) == std::weak_ordering::less);
186d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[2], v[10]) == std::weak_ordering::less);
187d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[2], v[11]) == std::weak_ordering::less);
188d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[2], v[12]) == std::weak_ordering::less);
189d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[2], v[13]) == std::weak_ordering::less);
190d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[3], v[0]) == std::weak_ordering::greater);
191d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[3], v[1]) == std::weak_ordering::greater);
192d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[3], v[2]) == std::weak_ordering::greater);
193d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[3], v[3]) == std::weak_ordering::equivalent);
194d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[3], v[4]) == std::weak_ordering::less);
195d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[3], v[5]) == std::weak_ordering::less);
196d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[3], v[6]) == std::weak_ordering::less);
197d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[3], v[7]) == std::weak_ordering::less);
198d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[3], v[8]) == std::weak_ordering::less);
199d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[3], v[9]) == std::weak_ordering::less);
200d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[3], v[10]) == std::weak_ordering::less);
201d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[3], v[11]) == std::weak_ordering::less);
202d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[3], v[12]) == std::weak_ordering::less);
203d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[3], v[13]) == std::weak_ordering::less);
204d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[4], v[0]) == std::weak_ordering::greater);
205d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[4], v[1]) == std::weak_ordering::greater);
206d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[4], v[2]) == std::weak_ordering::greater);
207d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[4], v[3]) == std::weak_ordering::greater);
208d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[4], v[4]) == std::weak_ordering::equivalent);
209d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[4], v[5]) == std::weak_ordering::less);
210d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[4], v[6]) == std::weak_ordering::less);
211d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[4], v[7]) == std::weak_ordering::less);
212d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[4], v[8]) == std::weak_ordering::less);
213d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[4], v[9]) == std::weak_ordering::less);
214d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[4], v[10]) == std::weak_ordering::less);
215d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[4], v[11]) == std::weak_ordering::less);
216d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[4], v[12]) == std::weak_ordering::less);
217d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[4], v[13]) == std::weak_ordering::less);
218d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[5], v[0]) == std::weak_ordering::greater);
219d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[5], v[1]) == std::weak_ordering::greater);
220d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[5], v[2]) == std::weak_ordering::greater);
221d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[5], v[3]) == std::weak_ordering::greater);
222d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[5], v[4]) == std::weak_ordering::greater);
223d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[5], v[5]) == std::weak_ordering::equivalent);
224d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[5], v[6]) == std::weak_ordering::equivalent);
225d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[5], v[7]) == std::weak_ordering::less);
226d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[5], v[8]) == std::weak_ordering::less);
227d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[5], v[9]) == std::weak_ordering::less);
228d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[5], v[10]) == std::weak_ordering::less);
229d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[5], v[11]) == std::weak_ordering::less);
230d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[5], v[12]) == std::weak_ordering::less);
231d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[5], v[13]) == std::weak_ordering::less);
232d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[6], v[0]) == std::weak_ordering::greater);
233d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[6], v[1]) == std::weak_ordering::greater);
234d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[6], v[2]) == std::weak_ordering::greater);
235d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[6], v[3]) == std::weak_ordering::greater);
236d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[6], v[4]) == std::weak_ordering::greater);
237d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[6], v[5]) == std::weak_ordering::equivalent);
238d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[6], v[6]) == std::weak_ordering::equivalent);
239d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[6], v[7]) == std::weak_ordering::less);
240d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[6], v[8]) == std::weak_ordering::less);
241d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[6], v[9]) == std::weak_ordering::less);
242d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[6], v[10]) == std::weak_ordering::less);
243d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[6], v[11]) == std::weak_ordering::less);
244d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[6], v[12]) == std::weak_ordering::less);
245d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[6], v[13]) == std::weak_ordering::less);
246d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[7], v[0]) == std::weak_ordering::greater);
247d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[7], v[1]) == std::weak_ordering::greater);
248d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[7], v[2]) == std::weak_ordering::greater);
249d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[7], v[3]) == std::weak_ordering::greater);
250d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[7], v[4]) == std::weak_ordering::greater);
251d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[7], v[5]) == std::weak_ordering::greater);
252d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[7], v[6]) == std::weak_ordering::greater);
253d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[7], v[7]) == std::weak_ordering::equivalent);
254d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[7], v[8]) == std::weak_ordering::less);
255d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[7], v[9]) == std::weak_ordering::less);
256d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[7], v[10]) == std::weak_ordering::less);
257d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[7], v[11]) == std::weak_ordering::less);
258d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[7], v[12]) == std::weak_ordering::less);
259d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[7], v[13]) == std::weak_ordering::less);
260d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[8], v[0]) == std::weak_ordering::greater);
261d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[8], v[1]) == std::weak_ordering::greater);
262d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[8], v[2]) == std::weak_ordering::greater);
263d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[8], v[3]) == std::weak_ordering::greater);
264d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[8], v[4]) == std::weak_ordering::greater);
265d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[8], v[5]) == std::weak_ordering::greater);
266d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[8], v[6]) == std::weak_ordering::greater);
267d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[8], v[7]) == std::weak_ordering::greater);
268d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[8], v[8]) == std::weak_ordering::equivalent);
269d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[8], v[9]) == std::weak_ordering::less);
270d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[8], v[10]) == std::weak_ordering::less);
271d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[8], v[11]) == std::weak_ordering::less);
272d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[8], v[12]) == std::weak_ordering::less);
273d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[8], v[13]) == std::weak_ordering::less);
274d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[9], v[0]) == std::weak_ordering::greater);
275d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[9], v[1]) == std::weak_ordering::greater);
276d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[9], v[2]) == std::weak_ordering::greater);
277d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[9], v[3]) == std::weak_ordering::greater);
278d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[9], v[4]) == std::weak_ordering::greater);
279d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[9], v[5]) == std::weak_ordering::greater);
280d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[9], v[6]) == std::weak_ordering::greater);
281d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[9], v[7]) == std::weak_ordering::greater);
282d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[9], v[8]) == std::weak_ordering::greater);
283d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[9], v[9]) == std::weak_ordering::equivalent);
284d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[9], v[10]) == std::weak_ordering::less);
285d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[9], v[11]) == std::weak_ordering::less);
286d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[9], v[12]) == std::weak_ordering::less);
287d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[9], v[13]) == std::weak_ordering::less);
288d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[10], v[0]) == std::weak_ordering::greater);
289d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[10], v[1]) == std::weak_ordering::greater);
290d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[10], v[2]) == std::weak_ordering::greater);
291d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[10], v[3]) == std::weak_ordering::greater);
292d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[10], v[4]) == std::weak_ordering::greater);
293d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[10], v[5]) == std::weak_ordering::greater);
294d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[10], v[6]) == std::weak_ordering::greater);
295d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[10], v[7]) == std::weak_ordering::greater);
296d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[10], v[8]) == std::weak_ordering::greater);
297d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[10], v[9]) == std::weak_ordering::greater);
298d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[10], v[10]) == std::weak_ordering::equivalent);
299d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[10], v[11]) == std::weak_ordering::less);
300d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[10], v[12]) == std::weak_ordering::less);
301d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[10], v[13]) == std::weak_ordering::less);
302d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[11], v[0]) == std::weak_ordering::greater);
303d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[11], v[1]) == std::weak_ordering::greater);
304d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[11], v[2]) == std::weak_ordering::greater);
305d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[11], v[3]) == std::weak_ordering::greater);
306d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[11], v[4]) == std::weak_ordering::greater);
307d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[11], v[5]) == std::weak_ordering::greater);
308d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[11], v[6]) == std::weak_ordering::greater);
309d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[11], v[7]) == std::weak_ordering::greater);
310d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[11], v[8]) == std::weak_ordering::greater);
311d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[11], v[9]) == std::weak_ordering::greater);
312d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[11], v[10]) == std::weak_ordering::greater);
313d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[11], v[11]) == std::weak_ordering::equivalent);
314d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[11], v[12]) == std::weak_ordering::less);
315d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[11], v[13]) == std::weak_ordering::less);
316d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[12], v[0]) == std::weak_ordering::greater);
317d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[12], v[1]) == std::weak_ordering::greater);
318d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[12], v[2]) == std::weak_ordering::greater);
319d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[12], v[3]) == std::weak_ordering::greater);
320d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[12], v[4]) == std::weak_ordering::greater);
321d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[12], v[5]) == std::weak_ordering::greater);
322d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[12], v[6]) == std::weak_ordering::greater);
323d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[12], v[7]) == std::weak_ordering::greater);
324d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[12], v[8]) == std::weak_ordering::greater);
325d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[12], v[9]) == std::weak_ordering::greater);
326d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[12], v[10]) == std::weak_ordering::greater);
327d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[12], v[11]) == std::weak_ordering::greater);
328d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[12], v[12]) == std::weak_ordering::equivalent);
329d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[12], v[13]) == std::weak_ordering::less);
330d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[13], v[0]) == std::weak_ordering::greater);
331d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[13], v[1]) == std::weak_ordering::greater);
332d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[13], v[2]) == std::weak_ordering::greater);
333d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[13], v[3]) == std::weak_ordering::greater);
334d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[13], v[4]) == std::weak_ordering::greater);
335d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[13], v[5]) == std::weak_ordering::greater);
336d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[13], v[6]) == std::weak_ordering::greater);
337d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[13], v[7]) == std::weak_ordering::greater);
338d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[13], v[8]) == std::weak_ordering::greater);
339d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[13], v[9]) == std::weak_ordering::greater);
340d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[13], v[10]) == std::weak_ordering::greater);
341d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[13], v[11]) == std::weak_ordering::greater);
342d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[13], v[12]) == std::weak_ordering::greater);
343d8380ad9SArthur O'Dwyer     assert(std::weak_order(v[13], v[13]) == std::weak_ordering::equivalent);
344d8380ad9SArthur O'Dwyer 
345d8380ad9SArthur O'Dwyer 
346d8380ad9SArthur O'Dwyer     // There's no way to produce a specifically positive or negative NAN
347d8380ad9SArthur O'Dwyer     // at compile-time, so the NAN-related tests must be runtime-only.
348d8380ad9SArthur O'Dwyer 
349d8380ad9SArthur O'Dwyer     if (!std::is_constant_evaluated()) {
350*4cd768edSCasey Carter         F nq = std::copysign(std::numeric_limits<F>::quiet_NaN(), F(-1));
351*4cd768edSCasey Carter         F ns = std::copysign(std::numeric_limits<F>::signaling_NaN(), F(-1));
352*4cd768edSCasey Carter         F ps = std::copysign(std::numeric_limits<F>::signaling_NaN(), F(+1));
353*4cd768edSCasey Carter         F pq = std::copysign(std::numeric_limits<F>::quiet_NaN(), F(+1));
354d8380ad9SArthur O'Dwyer 
355d8380ad9SArthur O'Dwyer         assert(std::weak_order(nq, nq) == std::weak_ordering::equivalent);
356d8380ad9SArthur O'Dwyer         assert(std::weak_order(nq, ns) == std::weak_ordering::equivalent);
357d8380ad9SArthur O'Dwyer         for (int i=0; i < 14; ++i) {
358d8380ad9SArthur O'Dwyer             assert(std::weak_order(nq, v[i]) == std::weak_ordering::less);
359d8380ad9SArthur O'Dwyer         }
360d8380ad9SArthur O'Dwyer         assert(std::weak_order(nq, ps) == std::weak_ordering::less);
361d8380ad9SArthur O'Dwyer         assert(std::weak_order(nq, pq) == std::weak_ordering::less);
362d8380ad9SArthur O'Dwyer 
363d8380ad9SArthur O'Dwyer         assert(std::weak_order(ns, nq) == std::weak_ordering::equivalent);
364d8380ad9SArthur O'Dwyer         assert(std::weak_order(ns, ns) == std::weak_ordering::equivalent);
365d8380ad9SArthur O'Dwyer         for (int i=0; i < 14; ++i) {
366d8380ad9SArthur O'Dwyer             assert(std::weak_order(ns, v[i]) == std::weak_ordering::less);
367d8380ad9SArthur O'Dwyer         }
368d8380ad9SArthur O'Dwyer         assert(std::weak_order(ns, ps) == std::weak_ordering::less);
369d8380ad9SArthur O'Dwyer         assert(std::weak_order(ns, pq) == std::weak_ordering::less);
370d8380ad9SArthur O'Dwyer 
371d8380ad9SArthur O'Dwyer         assert(std::weak_order(ps, nq) == std::weak_ordering::greater);
372d8380ad9SArthur O'Dwyer         assert(std::weak_order(ps, ns) == std::weak_ordering::greater);
373d8380ad9SArthur O'Dwyer         for (int i=0; i < 14; ++i) {
374d8380ad9SArthur O'Dwyer             assert(std::weak_order(ps, v[i]) == std::weak_ordering::greater);
375d8380ad9SArthur O'Dwyer         }
376d8380ad9SArthur O'Dwyer         assert(std::weak_order(ps, ps) == std::weak_ordering::equivalent);
377d8380ad9SArthur O'Dwyer         assert(std::weak_order(ps, pq) == std::weak_ordering::equivalent);
378d8380ad9SArthur O'Dwyer 
379d8380ad9SArthur O'Dwyer         assert(std::weak_order(pq, nq) == std::weak_ordering::greater);
380d8380ad9SArthur O'Dwyer         assert(std::weak_order(pq, ns) == std::weak_ordering::greater);
381d8380ad9SArthur O'Dwyer         for (int i=0; i < 14; ++i) {
382d8380ad9SArthur O'Dwyer             assert(std::weak_order(pq, v[i]) == std::weak_ordering::greater);
383d8380ad9SArthur O'Dwyer         }
384d8380ad9SArthur O'Dwyer         assert(std::weak_order(pq, ps) == std::weak_ordering::equivalent);
385d8380ad9SArthur O'Dwyer         assert(std::weak_order(pq, pq) == std::weak_ordering::equivalent);
386d8380ad9SArthur O'Dwyer     }
387d8380ad9SArthur O'Dwyer 
388d8380ad9SArthur O'Dwyer     return true;
389d8380ad9SArthur O'Dwyer }
390d8380ad9SArthur O'Dwyer 
391d8380ad9SArthur O'Dwyer namespace N14 {
392d8380ad9SArthur O'Dwyer     // Compare to N12::A.
393d8380ad9SArthur O'Dwyer     struct A {};
394d8380ad9SArthur O'Dwyer     bool operator==(const A&, const A&);
operator <=>(A &,A &&)395d8380ad9SArthur O'Dwyer     constexpr std::weak_ordering operator<=>(A&, A&&) { return std::weak_ordering::less; }
operator <=>(A &&,A &&)396d8380ad9SArthur O'Dwyer     constexpr std::weak_ordering operator<=>(A&&, A&&) { return std::weak_ordering::equivalent; }
397d8380ad9SArthur O'Dwyer     std::weak_ordering operator<=>(const A&, const A&);
398d8380ad9SArthur O'Dwyer     static_assert(std::three_way_comparable<A>);
399d8380ad9SArthur O'Dwyer 
400d8380ad9SArthur O'Dwyer     struct B {
401d8380ad9SArthur O'Dwyer         std::weak_ordering operator<=>(const B&) const;  // lacks operator==
402d8380ad9SArthur O'Dwyer     };
403d8380ad9SArthur O'Dwyer     static_assert(!std::three_way_comparable<B>);
404d8380ad9SArthur O'Dwyer 
405d8380ad9SArthur O'Dwyer     struct C {
406d8380ad9SArthur O'Dwyer         bool *touched;
407d8380ad9SArthur O'Dwyer         bool operator==(const C&) const;
operator <=>N14::C408d8380ad9SArthur O'Dwyer         constexpr std::weak_ordering operator<=>(const C& rhs) const {
409d8380ad9SArthur O'Dwyer             *rhs.touched = true;
410d8380ad9SArthur O'Dwyer             return std::weak_ordering::equivalent;
411d8380ad9SArthur O'Dwyer         }
412d8380ad9SArthur O'Dwyer     };
413d8380ad9SArthur O'Dwyer     static_assert(std::three_way_comparable<C>);
414d8380ad9SArthur O'Dwyer }
415d8380ad9SArthur O'Dwyer 
test_1_4()416d8380ad9SArthur O'Dwyer constexpr bool test_1_4()
417d8380ad9SArthur O'Dwyer {
418d8380ad9SArthur O'Dwyer     // Otherwise, weak_ordering(compare_three_way()(E, F)) if it is a well-formed expression.
419d8380ad9SArthur O'Dwyer 
420d8380ad9SArthur O'Dwyer     // Test neither weak_order nor compare_three_way const-qualify the forwarded arguments.
421d8380ad9SArthur O'Dwyer     N14::A a;
422d8380ad9SArthur O'Dwyer     assert(std::weak_order(a, std::move(a)) == std::weak_ordering::less);
423d8380ad9SArthur O'Dwyer     assert(std::weak_order(std::move(a), std::move(a)) == std::weak_ordering::equivalent);
424d8380ad9SArthur O'Dwyer 
425d8380ad9SArthur O'Dwyer     N14::B b;
426d8380ad9SArthur O'Dwyer     static_assert(!has_weak_order(b, b));
427d8380ad9SArthur O'Dwyer 
428d8380ad9SArthur O'Dwyer     // Test that the arguments are passed to <=> in the correct order.
429d8380ad9SArthur O'Dwyer     bool c1_touched = false;
430d8380ad9SArthur O'Dwyer     bool c2_touched = false;
431d8380ad9SArthur O'Dwyer     N14::C c1 = {&c1_touched};
432d8380ad9SArthur O'Dwyer     N14::C c2 = {&c2_touched};
433d8380ad9SArthur O'Dwyer     assert(std::weak_order(c1, c2) == std::weak_ordering::equivalent);
434d8380ad9SArthur O'Dwyer     assert(!c1_touched);
435d8380ad9SArthur O'Dwyer     assert(c2_touched);
436d8380ad9SArthur O'Dwyer 
437d8380ad9SArthur O'Dwyer     return true;
438d8380ad9SArthur O'Dwyer }
439d8380ad9SArthur O'Dwyer 
440d8380ad9SArthur O'Dwyer namespace N15 {
441d8380ad9SArthur O'Dwyer     struct A {};
strong_order(A &,A &&)442d8380ad9SArthur O'Dwyer     constexpr std::strong_ordering strong_order(A&, A&&) { return std::strong_ordering::less; }
strong_order(A &&,A &&)443d8380ad9SArthur O'Dwyer     constexpr std::strong_ordering strong_order(A&&, A&&) { return std::strong_ordering::equal; }
444d8380ad9SArthur O'Dwyer     std::strong_ordering strong_order(const A&, const A&);
445d8380ad9SArthur O'Dwyer 
446d8380ad9SArthur O'Dwyer     struct B {
447d8380ad9SArthur O'Dwyer         friend std::weak_ordering strong_order(B&, B&);
448d8380ad9SArthur O'Dwyer     };
449d8380ad9SArthur O'Dwyer 
450d8380ad9SArthur O'Dwyer     struct WeakOrder {
operator std::weak_orderingN15::WeakOrder451d8380ad9SArthur O'Dwyer         operator std::weak_ordering() const { return std::weak_ordering::less; }
452d8380ad9SArthur O'Dwyer     };
453d8380ad9SArthur O'Dwyer     struct C {
454d8380ad9SArthur O'Dwyer         friend WeakOrder strong_order(C& lhs, C&);
455d8380ad9SArthur O'Dwyer     };
456d8380ad9SArthur O'Dwyer 
457d8380ad9SArthur O'Dwyer     struct StrongOrder {
operator std::strong_orderingN15::StrongOrder458d8380ad9SArthur O'Dwyer         constexpr explicit operator std::strong_ordering() const { return std::strong_ordering::less; }
459d8380ad9SArthur O'Dwyer         operator std::weak_ordering() const = delete;
460d8380ad9SArthur O'Dwyer     };
461d8380ad9SArthur O'Dwyer     struct D {
462d8380ad9SArthur O'Dwyer         bool touched = false;
strong_order(D & lhs,D &)463d8380ad9SArthur O'Dwyer         friend constexpr StrongOrder strong_order(D& lhs, D&) { lhs.touched = true; return StrongOrder(); }
464d8380ad9SArthur O'Dwyer     };
465d8380ad9SArthur O'Dwyer }
466d8380ad9SArthur O'Dwyer 
test_1_5()467d8380ad9SArthur O'Dwyer constexpr bool test_1_5()
468d8380ad9SArthur O'Dwyer {
469d8380ad9SArthur O'Dwyer     // Otherwise, weak_ordering(strong_order(E, F)) [that is, std::strong_order]
470d8380ad9SArthur O'Dwyer     // if it is a well-formed expression.
471d8380ad9SArthur O'Dwyer 
472d8380ad9SArthur O'Dwyer     // Test that weak_order and strong_order do not const-qualify the forwarded arguments.
473d8380ad9SArthur O'Dwyer     N15::A a;
474d8380ad9SArthur O'Dwyer     assert(std::weak_order(a, std::move(a)) == std::weak_ordering::less);
475d8380ad9SArthur O'Dwyer     assert(std::weak_order(std::move(a), std::move(a)) == std::weak_ordering::equivalent);
476d8380ad9SArthur O'Dwyer 
477d8380ad9SArthur O'Dwyer     // The type of ADL strong_order(e,f) must be explicitly convertible to strong_ordering
478d8380ad9SArthur O'Dwyer     // (not just to weak_ordering), or else std::strong_order(e,f) won't exist.
479d8380ad9SArthur O'Dwyer     N15::B b;
480d8380ad9SArthur O'Dwyer     static_assert(!has_weak_order(b, b));
481d8380ad9SArthur O'Dwyer 
482d8380ad9SArthur O'Dwyer     // The type of ADL strong_order(e,f) must be explicitly convertible to strong_ordering
483d8380ad9SArthur O'Dwyer     // (not just to weak_ordering), or else std::strong_order(e,f) won't exist.
484d8380ad9SArthur O'Dwyer     N15::C c;
485d8380ad9SArthur O'Dwyer     static_assert(!has_weak_order(c, c));
486d8380ad9SArthur O'Dwyer 
487d8380ad9SArthur O'Dwyer     N15::D d1, d2;
488d8380ad9SArthur O'Dwyer     ASSERT_SAME_TYPE(decltype(std::weak_order(d1, d2)), std::weak_ordering);
489d8380ad9SArthur O'Dwyer     assert(std::weak_order(d1, d2) == std::weak_ordering::less);
490d8380ad9SArthur O'Dwyer     assert(d1.touched);
491d8380ad9SArthur O'Dwyer     assert(!d2.touched);
492d8380ad9SArthur O'Dwyer 
493d8380ad9SArthur O'Dwyer     return true;
494d8380ad9SArthur O'Dwyer }
495d8380ad9SArthur O'Dwyer 
main(int,char **)496d8380ad9SArthur O'Dwyer int main(int, char**)
497d8380ad9SArthur O'Dwyer {
498d8380ad9SArthur O'Dwyer     test_1_1();
499d8380ad9SArthur O'Dwyer     test_1_2();
500d8380ad9SArthur O'Dwyer     test_1_3<float>();
501d8380ad9SArthur O'Dwyer     test_1_3<double>();
502d8380ad9SArthur O'Dwyer     test_1_3<long double>();
503d8380ad9SArthur O'Dwyer     test_1_4();
504d8380ad9SArthur O'Dwyer     test_1_5();
505d8380ad9SArthur O'Dwyer 
506d8380ad9SArthur O'Dwyer     static_assert(test_1_3<float>());
507d8380ad9SArthur O'Dwyer     static_assert(test_1_3<double>());
508d8380ad9SArthur O'Dwyer     static_assert(test_1_3<long double>());
509d8380ad9SArthur O'Dwyer     static_assert(test_1_4());
510d8380ad9SArthur O'Dwyer     static_assert(test_1_5());
511d8380ad9SArthur O'Dwyer 
512d8380ad9SArthur O'Dwyer     return 0;
513d8380ad9SArthur O'Dwyer }
514