https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107325
Bug ID: 107325 Summary: Defaulted operator<=> with a non-comparison-category return type is not deleted Product: gcc Version: 12.2.0 Status: UNCONFIRMED Keywords: accepts-invalid Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: de34 at live dot cn Target Milestone: --- In this example, the operator<=> overload for Bar<int> is deleted according to [class.spaceship] (1.3) and (2.2), and thus decltype(Bar<int>{} <=> Bar<int>{}) is ill-formed. But gcc currently accepts it (Godbolt link: https://godbolt.org/z/z1bPbGPx7). #include <compare> template<class Ord> struct Bar { friend Ord operator<=>(Bar, Bar) = default; }; using SO = decltype(Bar<std::strong_ordering>{} <=> Bar<std::strong_ordering>{}); // OK using WO = decltype(Bar<std::weak_ordering>{} <=> Bar<std::weak_ordering>{}); // OK using PO = decltype(Bar<std::partial_ordering>{} <=> Bar<std::partial_ordering>{}); // OK using I = decltype(Bar<int>{} <=> Bar<int>{}); // This should be rejected.