@@ -5808,9 +5808,6 @@ bool ConstraintSystem::repairFailures(
5808
5808
}
5809
5809
5810
5810
case ConstraintLocator::FunctionArgument: {
5811
- auto *argLoc = getConstraintLocator(
5812
- locator.withPathElement(LocatorPathElt::SynthesizedArgument(0)));
5813
-
5814
5811
// Let's drop the last element which points to a single argument
5815
5812
// and see if this is a contextual mismatch.
5816
5813
path.pop_back();
@@ -5819,38 +5816,41 @@ bool ConstraintSystem::repairFailures(
5819
5816
path.back().getKind() == ConstraintLocator::ContextualType))
5820
5817
return false;
5821
5818
5822
- auto arg = llvm::find_if(getTypeVariables(),
5823
- [&argLoc](const TypeVariableType *typeVar) {
5824
- return typeVar->getImpl().getLocator() == argLoc;
5825
- });
5819
+ if (auto argToParamElt =
5820
+ path.back().getAs<LocatorPathElt::ApplyArgToParam>()) {
5821
+ auto loc = getConstraintLocator(anchor, path);
5826
5822
5827
- // What we have here is a form or tuple splat with no arguments
5828
- // demonstrated by following example:
5829
- //
5830
- // func foo<T: P>(_: T, _: (T.Element) -> Int) {}
5831
- // foo { 42 }
5832
- //
5833
- // In cases like this `T.Element` might be resolved to `Void`
5834
- // which means that we have to try a single empty tuple argument
5835
- // as a narrow exception to SE-0110, see `matchFunctionTypes`.
5836
- //
5837
- // But if `T.Element` didn't get resolved to `Void` we'd like
5838
- // to diagnose this as a missing argument which can't be ignored or
5839
- // a tuple is trying to be inferred as a tuple for destructuring but
5840
- // contextual argument does not match(in this case we remove the extra
5841
- // closure arguments).
5842
- if (arg != getTypeVariables().end()) {
5843
- if (auto argToParamElt =
5844
- path.back().getAs<LocatorPathElt::ApplyArgToParam>()) {
5845
- auto loc = getConstraintLocator(anchor, path);
5846
- auto closureAnchor =
5847
- getAsExpr<ClosureExpr>(simplifyLocatorToAnchor(loc));
5848
- if (rhs->is<TupleType>() && closureAnchor &&
5849
- closureAnchor->getParameters()->size() > 1) {
5823
+ if (auto closure = getAsExpr<ClosureExpr>(simplifyLocatorToAnchor(loc))) {
5824
+ auto closureTy = getClosureType(closure);
5825
+ // What we have here is a form or tuple splat with no arguments
5826
+ // demonstrated by following example:
5827
+ //
5828
+ // func foo<T: P>(_: T, _: (T.Element) -> Int) {}
5829
+ // foo { 42 }
5830
+ //
5831
+ // In cases like this `T.Element` might be resolved to `Void`
5832
+ // which means that we have to try a single empty tuple argument
5833
+ // as a narrow exception to SE-0110, see `matchFunctionTypes`.
5834
+ //
5835
+ // But if `T.Element` didn't get resolved to `Void` we'd like
5836
+ // to diagnose this as a missing argument which can't be ignored or
5837
+ // a tuple is trying to be inferred as a tuple for destructuring but
5838
+ // contextual argument does not match(in this case we remove the extra
5839
+ // closure arguments).
5840
+ if (closureTy->getNumParams() == 0) {
5841
+ conversionsOrFixes.push_back(AddMissingArguments::create(
5842
+ *this, {SynthesizedArg{0, AnyFunctionType::Param(lhs)}}, loc));
5843
+ break;
5844
+ }
5845
+
5846
+ // Since this is a problem with `FunctionArgument` we know that the
5847
+ // contextual type only has one parameter, if closure has more than
5848
+ // that the fix is to remove extraneous ones.
5849
+ if (closureTy->getNumParams() > 1) {
5850
5850
auto callee = getCalleeLocator(loc);
5851
5851
if (auto overload = findSelectedOverloadFor(callee)) {
5852
- auto fnType =
5853
- simplifyType(overload->adjustedOpenedType) ->castTo<FunctionType>();
5852
+ auto fnType = simplifyType(overload->adjustedOpenedType)
5853
+ ->castTo<FunctionType>();
5854
5854
auto paramIdx = argToParamElt->getParamIdx();
5855
5855
auto paramType = fnType->getParams()[paramIdx].getParameterType();
5856
5856
if (auto paramFnType = paramType->getAs<FunctionType>()) {
@@ -5861,11 +5861,6 @@ bool ConstraintSystem::repairFailures(
5861
5861
}
5862
5862
}
5863
5863
}
5864
-
5865
- conversionsOrFixes.push_back(AddMissingArguments::create(
5866
- *this, {SynthesizedArg{0, AnyFunctionType::Param(*arg)}},
5867
- getConstraintLocator(anchor, path)));
5868
- break;
5869
5864
}
5870
5865
5871
5866
auto *parentLoc = getConstraintLocator(anchor, path);
0 commit comments