@@ -1721,14 +1721,29 @@ void Solution::recordSingleArgMatchingChoice(ConstraintLocator *locator) {
17211721 MatchCallArgumentResult::forArity (1 )});
17221722}
17231723
1724- Type Solution::simplifyType (Type type) const {
1724+ Type Solution::simplifyType (Type type, bool wantInterfaceType) const {
1725+ // If we've been asked for an interface type, start by mapping any archetypes
1726+ // out of context.
1727+ if (wantInterfaceType)
1728+ type = type->mapTypeOutOfContext ();
1729+
17251730 if (!(type->hasTypeVariable () || type->hasPlaceholder ()))
17261731 return type;
17271732
17281733 // Map type variables to fixed types from bindings.
17291734 auto &cs = getConstraintSystem ();
1730- auto resolvedType = cs.simplifyTypeImpl (
1731- type, [&](TypeVariableType *tvt) -> Type { return getFixedType (tvt); });
1735+ auto resolvedType =
1736+ cs.simplifyTypeImpl (type, [&](TypeVariableType *tvt) -> Type {
1737+ // If we want the interface type, use the generic parameter if we
1738+ // have one, otherwise map the fixed type out of context.
1739+ if (wantInterfaceType) {
1740+ if (auto *gp = tvt->getImpl ().getGenericParameter ())
1741+ return gp;
1742+ return getFixedType (tvt)->mapTypeOutOfContext ();
1743+ }
1744+ return getFixedType (tvt);
1745+ });
1746+ ASSERT (!(wantInterfaceType && resolvedType->hasPrimaryArchetype ()));
17321747
17331748 // Placeholders shouldn't be reachable through a solution, they are only
17341749 // useful to determine what went wrong exactly.
@@ -4008,29 +4023,7 @@ ASTNode ConstraintSystem::includingParentApply(ASTNode node) {
40084023}
40094024
40104025Type Solution::resolveInterfaceType (Type type) const {
4011- auto resolvedType = type.transformRec ([&](Type type) -> std::optional<Type> {
4012- if (auto *tvt = type->getAs <TypeVariableType>()) {
4013- // If this type variable is for a generic parameter, return that.
4014- if (auto *gp = tvt->getImpl ().getGenericParameter ())
4015- return gp;
4016-
4017- // Otherwise resolve its fixed type, mapped out of context.
4018- auto fixed = simplifyType (tvt);
4019- return resolveInterfaceType (fixed->mapTypeOutOfContext ());
4020- }
4021- if (auto *dmt = type->getAs <DependentMemberType>()) {
4022- // For a dependent member, first resolve the base.
4023- auto newBase = resolveInterfaceType (dmt->getBase ());
4024-
4025- // Then reconstruct using its associated type.
4026- assert (dmt->getAssocType ());
4027- return DependentMemberType::get (newBase, dmt->getAssocType ());
4028- }
4029- return std::nullopt ;
4030- });
4031-
4032- assert (!resolvedType->hasArchetype ());
4033- return resolvedType;
4026+ return simplifyType (type, /* wantInterfaceType*/ true );
40344027}
40354028
40364029std::optional<FunctionArgApplyInfo>
0 commit comments