// { dg-do compile { target c++23 } } #include #include template concept Eq = requires(T t, U u) { t == u; }; static_assert(Eq, std::expected>); static_assert(Eq, std::expected>); // static_assert(!Eq, std::expected>); static_assert(Eq, short>); static_assert(!Eq, short>); static_assert(Eq, std::unexpected>); static_assert(Eq, std::unexpected>); struct NotEqCmp { constexpr bool operator==(int) const { return true; } bool operator==(NotEqCmp) const = delete; }; constexpr bool test_eq() { std::expected e1; VERIFY(e1 == 1); std::expected e2; VERIFY(e2 == e2); VERIFY(e1 == e2); VERIFY(e1 != std::unexpected(1)); e1 = std::unexpected(1); VERIFY(e1 == std::unexpected(1)); VERIFY(e1 != std::unexpected(2)); VERIFY(e1 != e2); std::expected e3; VERIFY(e3 == e3); VERIFY(e3 != std::unexpected(1)); e3 = std::unexpected(1); VERIFY(e3 == e3); VERIFY(e3 == std::unexpected(1)); VERIFY(e3 != std::unexpected(2)); return true; } static_assert( test_eq() );