Skip to content

Commit 23599b6

Browse files
committed
Sema: Heuristic to prefer shorter type parameters when resolving abstract witnesses
1 parent c614c01 commit 23599b6

File tree

2 files changed

+25
-12
lines changed

2 files changed

+25
-12
lines changed

lib/Sema/AssociatedTypeInference.cpp

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4002,19 +4002,31 @@ void TypeWitnessSystem::mergeEquivalenceClasses(
40024002
TypeWitnessSystem::ResolvedTypeComparisonResult
40034003
TypeWitnessSystem::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
//

test/decl/protocol/req/associated_type_inference_proto_ext.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
// RUN: %target-typecheck-verify-swift
1+
// RUN: %target-typecheck-verify-swift -enable-experimental-associated-type-inference
2+
// RUN: %target-typecheck-verify-swift -disable-experimental-associated-type-inference
23

34
func assertEqualTypes<T>(_: T.Type, _: T.Type) {}
45

0 commit comments

Comments
 (0)