@@ -4002,19 +4002,31 @@ void TypeWitnessSystem::mergeEquivalenceClasses(
40024002TypeWitnessSystem::ResolvedTypeComparisonResult
40034003TypeWitnessSystem::compareResolvedTypes (Type ty1, Type ty2) {
40044004 assert (ty1 && ty2);
4005- if (!ty1->isTypeParameter ()) {
4006- if (ty2->isTypeParameter ()) {
4007- // A concrete type is better than a type parameter.
4008- return ResolvedTypeComparisonResult::Better;
4009- } else if (!ty1->isEqual (ty2)) {
4010- return ResolvedTypeComparisonResult::Ambiguity;
4011- }
4005+
4006+ // Prefer shorter type parameters. This is just a heuristic and has no
4007+ // theoretical basis at all.
4008+ if (ty1->isTypeParameter () && ty2->isTypeParameter ()) {
4009+ return compareDependentTypes (ty1, ty2) < 0
4010+ ? ResolvedTypeComparisonResult::Better
4011+ : ResolvedTypeComparisonResult::EquivalentOrWorse;
4012+ }
4013+
4014+ // A concrete type is better than a type parameter.
4015+ if (!ty1->isTypeParameter () && ty2->isTypeParameter ()) {
4016+ return ResolvedTypeComparisonResult::Better;
4017+ }
4018+
4019+ // A type parameter is worse than a concrete type.
4020+ if (ty1->isTypeParameter () && !ty2->isTypeParameter ()) {
4021+ return ResolvedTypeComparisonResult::EquivalentOrWorse;
4022+ }
4023+
4024+ // Ambiguous concrete types.
4025+ if (ty1->isEqual (ty2)) {
4026+ return ResolvedTypeComparisonResult::EquivalentOrWorse;
40124027 }
40134028
4014- // Anything else is either equivalent (i.e. actually equal concrete types or
4015- // type parameter vs. type parameter), or worse (i.e. type parameter vs.
4016- // concrete type).
4017- return ResolvedTypeComparisonResult::EquivalentOrWorse;
4029+ return ResolvedTypeComparisonResult::Ambiguity;
40184030}
40194031
40204032//
0 commit comments