https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109738
--- Comment #3 from Scott Zhong <szhong at perforce dot com> --- Is it very problematic if this is the correct behavior C++20 behaviour. For example, #include <compare> #include <iostream> struct IntWrapper { int value; constexpr IntWrapper(int value): value{value} { } auto operator<=>(const IntWrapper&) const = default; bool operator==(const IntWrapper&) const = default; }; struct Derived : public IntWrapper { int value2; Derived() : IntWrapper(0), value2(0) { } bool operator<(const Derived&) const { std::cout << "Derived::operator<()" << std::endl; return false; } }; int main() { Derived a,b; std::cout << (a <=> b < 0) << std::endl; return 0; } Derived::operator<() is not called, only IntWrapper::operator<=>() is called. The scenario is IntWrapper has been updated to utilize spaceship operator but the Derived class (downstream customers) hasn't been able to update their code to provide the spaceship operator yet. It could potentially be hard to debug that this scenario is happening.