xref: /llvm-project/libcxx/test/std/utilities/expected/expected.unexpected/equality.pass.cpp (revision 9fd3c4115cf2cd3da1405e1f2c38d53582b5dc81)
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, c++20
10 
11 // template<class E2>
12 // friend constexpr bool operator==(const unexpected& x, const unexpected<E2>& y);
13 //
14 // Mandates: The expression x.error() == y.error() is well-formed and its result is convertible to bool.
15 //
16 // Returns: x.error() == y.error().
17 
18 #include <cassert>
19 #include <concepts>
20 #include <expected>
21 #include <utility>
22 
23 struct Error {
24   int i;
25   friend constexpr bool operator==(const Error&, const Error&) = default;
26   friend constexpr bool operator==(const Error& lhs, int rhs) noexcept { return lhs.i == rhs; }
27 };
28 
29 constexpr bool test() {
30   std::unexpected<Error> unex1(Error{2});
31   std::unexpected<Error> unex2(Error{3});
32   std::unexpected<Error> unex3(Error{2});
33 
34   assert(unex1 == unex3);
35   assert(unex1 != unex2);
36   assert(unex2 != unex3);
37 
38   std::unexpected<int> unex_i1(1);
39   std::unexpected<int> unex_i2(2);
40 
41   assert(unex1 != unex_i1);
42   assert(unex_i1 != unex1);
43   assert(unex1 == unex_i2);
44   assert(unex_i2 == unex1);
45 
46   return true;
47 }
48 
49 int main(int, char**) {
50   test();
51   static_assert(test());
52   return 0;
53 }
54