@@ -3761,24 +3761,31 @@ static bool diagnoseContextualFunctionCallGenericAmbiguity(
3761
3761
if (!GP)
3762
3762
return false ;
3763
3763
3764
- auto typeParamResultInvolvesTypeVar =
3765
- [&cs, &applyFnType](unsigned paramIdx, TypeVariableType *typeVar) {
3766
- assert (paramIdx < applyFnType->getNumParams ());
3767
- auto param = applyFnType->getParams ()[paramIdx];
3768
- if (param.isVariadic ()) {
3769
- auto paramType = param.getParameterType ();
3770
- // Variadic parameter is constructed as an ArraySliceType(which is
3771
- // just sugared type for a bound generic) with the closure type as
3772
- // element.
3773
- auto baseType =
3774
- paramType->getDesugaredType ()->castTo <BoundGenericType>();
3775
- auto paramFnType =
3776
- baseType->getGenericArgs ()[0 ]->castTo <FunctionType>();
3777
- return cs.typeVarOccursInType (typeVar, paramFnType->getResult ());
3778
- }
3779
- auto paramFnType = param.getParameterType ()->castTo <FunctionType>();
3780
- return cs.typeVarOccursInType (typeVar, paramFnType->getResult ());
3781
- };
3764
+ auto applyLoc =
3765
+ cs.getConstraintLocator (AE, {LocatorPathElt::ApplyArgument ()});
3766
+ auto argMatching =
3767
+ contextualFix.first ->argumentMatchingChoices .find (applyLoc);
3768
+ if (argMatching == contextualFix.first ->argumentMatchingChoices .end ()) {
3769
+ return false ;
3770
+ }
3771
+
3772
+ auto typeParamResultInvolvesTypeVar = [&cs, &applyFnType, &argMatching](
3773
+ unsigned argIdx,
3774
+ TypeVariableType *typeVar) {
3775
+ auto argParamMatch = argMatching->second .parameterBindings [argIdx];
3776
+ auto param = applyFnType->getParams ()[argParamMatch.front ()];
3777
+ if (param.isVariadic ()) {
3778
+ auto paramType = param.getParameterType ();
3779
+ // Variadic parameter is constructed as an ArraySliceType(which is
3780
+ // just sugared type for a bound generic) with the closure type as
3781
+ // element.
3782
+ auto baseType = paramType->getDesugaredType ()->castTo <BoundGenericType>();
3783
+ auto paramFnType = baseType->getGenericArgs ()[0 ]->castTo <FunctionType>();
3784
+ return cs.typeVarOccursInType (typeVar, paramFnType->getResult ());
3785
+ }
3786
+ auto paramFnType = param.getParameterType ()->castTo <FunctionType>();
3787
+ return cs.typeVarOccursInType (typeVar, paramFnType->getResult ());
3788
+ };
3782
3789
3783
3790
llvm::SmallVector<ClosureExpr *, 4 > closureArguments;
3784
3791
// A single closure argument.
0 commit comments