https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105200
--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- If one defines instead say bool operator<(const foo, const foo); then the built-in candidate isn't considered because of https://eel.is/c++draft/over.match.oper#3.3 But for the user operator<=> vs. built-in operator<, they don't have the same operator name, so the built-in operator< is in the candidate set.