xref: /llvm-project/libcxx/test/std/utilities/expected/expected.unexpected/equality.pass.cpp (revision 9fd3c4115cf2cd3da1405e1f2c38d53582b5dc81)
1e356f681SHui Xie //===----------------------------------------------------------------------===//
26a54dfbfSLouis Dionne //
3e356f681SHui Xie // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e356f681SHui Xie // See https://llvm.org/LICENSE.txt for license information.
5e356f681SHui Xie // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e356f681SHui Xie //
7e356f681SHui Xie //===----------------------------------------------------------------------===//
8e356f681SHui Xie 
9e356f681SHui Xie // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
10e356f681SHui Xie 
11e356f681SHui Xie // template<class E2>
12e356f681SHui Xie // friend constexpr bool operator==(const unexpected& x, const unexpected<E2>& y);
13e356f681SHui Xie //
14e356f681SHui Xie // Mandates: The expression x.error() == y.error() is well-formed and its result is convertible to bool.
15e356f681SHui Xie //
16e356f681SHui Xie // Returns: x.error() == y.error().
17e356f681SHui Xie 
18e356f681SHui Xie #include <cassert>
19e356f681SHui Xie #include <concepts>
20e356f681SHui Xie #include <expected>
21e356f681SHui Xie #include <utility>
22e356f681SHui Xie 
23e356f681SHui Xie struct Error {
24e356f681SHui Xie   int i;
25e356f681SHui Xie   friend constexpr bool operator==(const Error&, const Error&) = default;
26*9fd3c411SA. Jiang   friend constexpr bool operator==(const Error& lhs, int rhs) noexcept { return lhs.i == rhs; }
27e356f681SHui Xie };
28e356f681SHui Xie 
29e356f681SHui Xie constexpr bool test() {
30e356f681SHui Xie   std::unexpected<Error> unex1(Error{2});
31e356f681SHui Xie   std::unexpected<Error> unex2(Error{3});
32e356f681SHui Xie   std::unexpected<Error> unex3(Error{2});
33*9fd3c411SA. Jiang 
34e356f681SHui Xie   assert(unex1 == unex3);
35e356f681SHui Xie   assert(unex1 != unex2);
36e356f681SHui Xie   assert(unex2 != unex3);
37*9fd3c411SA. Jiang 
38*9fd3c411SA. Jiang   std::unexpected<int> unex_i1(1);
39*9fd3c411SA. Jiang   std::unexpected<int> unex_i2(2);
40*9fd3c411SA. Jiang 
41*9fd3c411SA. Jiang   assert(unex1 != unex_i1);
42*9fd3c411SA. Jiang   assert(unex_i1 != unex1);
43*9fd3c411SA. Jiang   assert(unex1 == unex_i2);
44*9fd3c411SA. Jiang   assert(unex_i2 == unex1);
45*9fd3c411SA. Jiang 
46e356f681SHui Xie   return true;
47e356f681SHui Xie }
48e356f681SHui Xie 
49e356f681SHui Xie int main(int, char**) {
50e356f681SHui Xie   test();
51e356f681SHui Xie   static_assert(test());
52e356f681SHui Xie   return 0;
53e356f681SHui Xie }
54