@@ -4002,19 +4002,31 @@ void TypeWitnessSystem::mergeEquivalenceClasses(
4002
4002
TypeWitnessSystem::ResolvedTypeComparisonResult
4003
4003
TypeWitnessSystem::compareResolvedTypes (Type ty1, Type ty2) {
4004
4004
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;
4012
4027
}
4013
4028
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;
4018
4030
}
4019
4031
4020
4032
//
0 commit comments