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