Skip to content

Commit cf991ae

Browse files
authored
Merge pull request #64733 from xedin/rdar-106775969
[CSSimplify] Exploaded tuple argument should assume param's label if …
2 parents f702272 + b07dafa commit cf991ae

File tree

3 files changed

+30
-2
lines changed

3 files changed

+30
-2
lines changed

lib/Sema/CSSimplify.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1635,7 +1635,22 @@ static ConstraintSystem::TypeMatchResult matchCallArguments(
16351635
SmallVector<SynthesizedArg, 4> synthesizedArgs;
16361636
for (unsigned i = 0, n = argTuple->getNumElements(); i != n; ++i) {
16371637
const auto &elt = argTuple->getElement(i);
1638-
AnyFunctionType::Param argument(elt.getType(), elt.getName());
1638+
1639+
// If tuple doesn't have a label for its first element
1640+
// and parameter does, let's assume parameter's label
1641+
// to aid argument matching. For example:
1642+
//
1643+
// \code
1644+
// func test(val: Int, _: String) {}
1645+
//
1646+
// test(val: (42, "")) // expands into `(val: 42, "")`
1647+
// \endcode
1648+
Identifier label = elt.getName();
1649+
if (i == 0 && !elt.hasName() && params[0].hasLabel()) {
1650+
label = params[0].getLabel();
1651+
}
1652+
1653+
AnyFunctionType::Param argument(elt.getType(), label);
16391654
synthesizedArgs.push_back(SynthesizedArg{i, argument});
16401655
argsWithLabels.push_back(argument);
16411656
}

test/Constraints/pack-expansion-expressions.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,13 +331,20 @@ func test_pack_expansions_with_closures() {
331331
// rdar://107151854 - crash on invalid due to specialized pack expansion
332332
func test_pack_expansion_specialization() {
333333
struct Data<each T> {
334-
init(_: repeat each T) {} // expected-note {{'init(_:)' declared here}}
334+
init(_: repeat each T) {} // expected-note 2 {{'init(_:)' declared here}}
335+
init(vals: repeat each T) {} // expected-note 2 {{'init(vals:)' declared here}}
335336
}
336337

337338
_ = Data<Int>() // expected-error {{missing argument for parameter #1 in call}}
338339
_ = Data<Int>(0) // Ok
339340
_ = Data<Int, String>(42, "") // Ok
340341
_ = Data<Int>(42, "") // expected-error {{extra argument in call}}
342+
_ = Data<Int, String>((42, ""))
343+
// expected-error@-1 {{initializer expects 2 separate arguments; remove extra parentheses to change tuple into separate arguments}}
344+
_ = Data<Int, String, Float>(vals: (42, "", 0))
345+
// expected-error@-1 {{initializer expects 3 separate arguments; remove extra parentheses to change tuple into separate arguments}}
346+
_ = Data<Int, String, Float>((vals: 42, "", 0))
347+
// expected-error@-1 {{initializer expects 3 separate arguments; remove extra parentheses to change tuple into separate arguments}}
341348
}
342349

343350
// rdar://107280056 - "Ambiguous without more context" with opaque return type + variadics

test/Constraints/tuple_arguments.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1799,3 +1799,9 @@ func variadicSplat() {
17991799
_ = y.count
18001800
}
18011801
}
1802+
1803+
func tuple_splat_with_a_label() {
1804+
func test(vals: Int, _: String, _: Float) {} // expected-note 2 {{'test(vals:_:_:)' declared here}}
1805+
test(vals: (23, "hello", 3.14)) // expected-error {{local function 'test' expects 3 separate arguments; remove extra parentheses to change tuple into separate arguments}}
1806+
test((vals: 23, "hello", 3.14)) // expected-error {{local function 'test' expects 3 separate arguments; remove extra parentheses to change tuple into separate arguments}}
1807+
}

0 commit comments

Comments
 (0)