[Diagnostics] Don't attempt to synthesize arguments when destructuring a single tuple argument results in an overrun

If arguments are represented by a single tuple it's possible
that the issue is not about missing parameters but instead
about tuple destructuring. Fix `fixMissingArguments` to check for
overruns after destructuring and stop if that produces more
arguments then parameters because such situations are better
diagnosed as a general conversion failure rather than a missing
argument(s) problem.

Resolves: rdar://159408715
(cherry picked from commit 1f887202e1)
This commit is contained in:
Pavel Yaskevich
2025-12-09 16:52:41 -08:00
parent cac74c361e
commit a0835e7e73
2 changed files with 7 additions and 1 deletions

View File

@@ -2747,6 +2747,12 @@ static bool fixMissingArguments(ConstraintSystem &cs, ASTNode anchor,
args.pop_back();
for (const auto &elt : tuple->getElements())
args.emplace_back(elt.getType(), elt.getName());
// If unpacking a tuple results in more arguments than parameters
// it would be diagnosed as a general mismatch because it's unclear
// whether it's a problem with missing or extraneous parameters.
if (args.size() > params.size())
return true;
} else if (auto *typeVar = argType->getAs<TypeVariableType>()) {
auto isParam = [](const Expr *expr) {
if (auto *DRE = dyn_cast<DeclRefExpr>(expr)) {

View File

@@ -1,4 +1,4 @@
// {"kind":"typecheck","languageMode":6,"signature":"fixMissingArguments(swift::constraints::ConstraintSystem&, swift::ASTNode, llvm::SmallVectorImpl<swift::AnyFunctionType::Param>&, llvm::ArrayRef<swift::AnyFunctionType::Param>, unsigned int, swift::constraints::ConstraintLocatorBuilder)","signatureAssert":"Assertion failed: (Index < Length && \"Invalid index!\"), function operator[]"}
// RUN: not --crash %target-swift-frontend -typecheck -swift-version 6 %s
// RUN: not %target-swift-frontend -typecheck -swift-version 6 %s
func a((Int, Int, Int)) a > {
b, c in