diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -7863,8 +7863,13 @@ return Result::deleted(); } } else { + QualType T = Best->BuiltinParamTypes[0]; + assert(T == Best->BuiltinParamTypes[1] && + "builtin comparison for different types?"); + assert(Best->BuiltinParamTypes[2].isNull() && + "invalid builtin comparison"); Optional Cat = - getComparisonCategoryForBuiltinCmp(Args[0]->getType()); + getComparisonCategoryForBuiltinCmp(T); assert(Cat && "no category for builtin comparison?"); R.Category = *Cat; } diff --git a/clang/test/CXX/class/class.compare/class.spaceship/p2.cpp b/clang/test/CXX/class/class.compare/class.spaceship/p2.cpp --- a/clang/test/CXX/class/class.compare/class.spaceship/p2.cpp +++ b/clang/test/CXX/class/class.compare/class.spaceship/p2.cpp @@ -172,3 +172,23 @@ int C::*x; // expected-note {{because there is no viable three-way comparison function for member 'x'}} }; } + +namespace PR50591 { + struct a1 { + operator int() const; + }; + struct b1 { + auto operator<=>(b1 const &) const = default; + a1 f; + }; + std::strong_ordering cmp_b1 = b1() <=> b1(); + + struct a2 { + operator float() const; + }; + struct b2 { + auto operator<=>(b2 const &) const = default; + a2 f; + }; + std::partial_ordering cmp_b2 = b2() <=> b2(); +}