xref: /llvm-project/libcxx/test/std/utilities/optional/optional.relops/compare.three_way.pass.cpp (revision 03cda77409023e64d6338dcb4e36bf1e40b33ea3)
1*03cda774SHristo Hristov //===----------------------------------------------------------------------===//
2*03cda774SHristo Hristov //
3*03cda774SHristo Hristov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*03cda774SHristo Hristov // See https://llvm.org/LICENSE.txt for license information.
5*03cda774SHristo Hristov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*03cda774SHristo Hristov //
7*03cda774SHristo Hristov //===----------------------------------------------------------------------===//
8*03cda774SHristo Hristov 
9*03cda774SHristo Hristov // UNSUPPORTED: c++03, c++11, c++14, c++17
10*03cda774SHristo Hristov 
11*03cda774SHristo Hristov // <optional>
12*03cda774SHristo Hristov 
13*03cda774SHristo Hristov // [optional.relops], relational operators
14*03cda774SHristo Hristov 
15*03cda774SHristo Hristov // template<class T, three_way_comparable_with<T> U>
16*03cda774SHristo Hristov //   constexpr compare_three_way_result_t<T, U>
17*03cda774SHristo Hristov //     operator<=>(const optional<T>&, const optional<U>&);
18*03cda774SHristo Hristov 
19*03cda774SHristo Hristov #include <cassert>
20*03cda774SHristo Hristov #include <compare>
21*03cda774SHristo Hristov #include <optional>
22*03cda774SHristo Hristov 
23*03cda774SHristo Hristov #include "test_comparisons.h"
24*03cda774SHristo Hristov 
test()25*03cda774SHristo Hristov constexpr bool test() {
26*03cda774SHristo Hristov   {
27*03cda774SHristo Hristov     std::optional<int> op1;
28*03cda774SHristo Hristov     std::optional<int> op2;
29*03cda774SHristo Hristov 
30*03cda774SHristo Hristov     assert((op1 <=> op2) == std::strong_ordering::equal);
31*03cda774SHristo Hristov     assert(testOrder(op1, op2, std::strong_ordering::equal));
32*03cda774SHristo Hristov   }
33*03cda774SHristo Hristov   {
34*03cda774SHristo Hristov     std::optional<int> op1{3};
35*03cda774SHristo Hristov     std::optional<int> op2{3};
36*03cda774SHristo Hristov     assert((op1 <=> op1) == std::strong_ordering::equal);
37*03cda774SHristo Hristov     assert(testOrder(op1, op1, std::strong_ordering::equal));
38*03cda774SHristo Hristov     assert((op1 <=> op2) == std::strong_ordering::equal);
39*03cda774SHristo Hristov     assert(testOrder(op1, op2, std::strong_ordering::equal));
40*03cda774SHristo Hristov     assert((op2 <=> op1) == std::strong_ordering::equal);
41*03cda774SHristo Hristov     assert(testOrder(op2, op1, std::strong_ordering::equal));
42*03cda774SHristo Hristov   }
43*03cda774SHristo Hristov   {
44*03cda774SHristo Hristov     std::optional<int> op;
45*03cda774SHristo Hristov     std::optional<int> op1{2};
46*03cda774SHristo Hristov     std::optional<int> op2{3};
47*03cda774SHristo Hristov     assert((op <=> op2) == std::strong_ordering::less);
48*03cda774SHristo Hristov     assert(testOrder(op, op2, std::strong_ordering::less));
49*03cda774SHristo Hristov     assert((op1 <=> op2) == std::strong_ordering::less);
50*03cda774SHristo Hristov     assert(testOrder(op1, op2, std::strong_ordering::less));
51*03cda774SHristo Hristov   }
52*03cda774SHristo Hristov   {
53*03cda774SHristo Hristov     std::optional<int> op;
54*03cda774SHristo Hristov     std::optional<int> op1{3};
55*03cda774SHristo Hristov     std::optional<int> op2{2};
56*03cda774SHristo Hristov     assert((op1 <=> op) == std::strong_ordering::greater);
57*03cda774SHristo Hristov     assert(testOrder(op1, op, std::strong_ordering::greater));
58*03cda774SHristo Hristov     assert((op1 <=> op2) == std::strong_ordering::greater);
59*03cda774SHristo Hristov     assert(testOrder(op1, op2, std::strong_ordering::greater));
60*03cda774SHristo Hristov   }
61*03cda774SHristo Hristov 
62*03cda774SHristo Hristov   return true;
63*03cda774SHristo Hristov }
64*03cda774SHristo Hristov 
main(int,char **)65*03cda774SHristo Hristov int main(int, char**) {
66*03cda774SHristo Hristov   assert(test());
67*03cda774SHristo Hristov   static_assert(test());
68*03cda774SHristo Hristov   return 0;
69*03cda774SHristo Hristov }
70