// Test with all operators explicitly defaulted. // { dg-do run { target c++20 } } #include template struct D { T i; auto operator<=>(const D& x) const = default; bool operator==(const D& x) const = default; bool operator!=(const D& x) const = default; bool operator<(const D& x) const = default; bool operator<=(const D& x) const = default; bool operator>(const D& x) const = default; bool operator>=(const D& x) const = default; }; template struct E { T i; auto operator<=>(const E& x) const = default; // auto operator==(const E& x) const = default; // auto operator!=(const E& x) const = default; // auto operator<(const E& x) const = default; // auto operator<=(const E& x) const = default; // auto operator>(const E& x) const = default; // auto operator>=(const E& x) const = default; }; template struct F { T i; constexpr auto operator<=>(T x) const { return i<=>x; } constexpr bool operator== (T x) const { return i==x; } }; #define assert(X) do { if (!(X)) __builtin_abort(); } while (0) template constexpr bool check_eq (T d, U d2) { return is_eq (d <=> d2) && is_eq (d2 <=> d) && is_lteq (d <=> d2) && is_lteq (d2 <=> d) && !is_lt (d <=> d2) && !is_lt (d2 <=> d) && is_gteq (d <=> d2) && is_gteq (d2 <=> d) && !is_gt (d <=> d2) && !is_gt (d2 <=> d) && d == d2 && d2 == d && !(d != d2) && !(d2 != d) && d >= d2 && d <= d2 && d2 >= d && d2 <= d && !(d < d2) && !(d2 < d) && !(d > d2) && !(d2 > d); } template constexpr bool check_less (T d, U d2) { return !is_eq (d <=> d2) && !is_eq (d2 <=> d) && is_lteq (d <=> d2) && !is_lteq (d2 <=> d) && is_lt (d <=> d2) && !is_lt (d2 <=> d) && !is_gteq (d <=> d2) && is_gteq (d2 <=> d) && !is_gt (d <=> d2) && is_gt (d2 <=> d) && !(d == d2) && !(d2 == d) && (d != d2) && (d2 != d) && !(d >= d2) && (d <= d2) && (d2 >= d) && !(d2 <= d) && (d < d2) && !(d2 < d) && !(d > d2) && (d2 > d); } int main() { constexpr D d{42}; constexpr D d2{24}; static_assert (check_eq (d, d)); static_assert (check_less (d2, d)); constexpr E e { 3.14 }; constexpr E ee { 2.72 }; static_assert (check_eq (e, e)); static_assert (check_less (ee, e)); constexpr F f { 'b' }; static_assert (check_eq (f, 'b')); static_assert (check_less (f, 'c')); static_assert (check_less ('a', f)); }