Skip to content

Commit 8e0bcfa

Browse files
committed
Sema: Do better at diagnosing missing each
1 parent 55189ba commit 8e0bcfa

File tree

2 files changed

+31
-11
lines changed

2 files changed

+31
-11
lines changed

lib/Sema/CSGen.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -794,16 +794,13 @@ namespace {
794794
// value packs cannot be referenced without `each` immediately
795795
// preceding them.
796796
if (auto *expansionType = knownType->getAs<PackExpansionType>()) {
797-
if (auto *parentExpansionExpr = getParentPackExpansionExpr(E);
798-
parentExpansionExpr &&
799-
!isExpr<PackElementExpr>(CS.getParentExpr(E))) {
797+
if (!isa_and_nonnull<PackElementExpr>(CS.getParentExpr(E))) {
800798
auto packType = expansionType->getPatternType();
801799
(void)CS.recordFix(
802800
IgnoreMissingEachKeyword::create(CS, packType, locator));
803-
auto eltType =
804-
openPackElement(packType, locator, parentExpansionExpr);
805-
CS.setType(E, eltType);
806-
return eltType;
801+
802+
return openPackElement(packType, locator,
803+
getParentPackExpansionExpr(E));
807804
}
808805
}
809806
}

test/Constraints/pack-expansion-expressions.swift

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -263,12 +263,16 @@ func forwardFunctionPack<each T>(functions: repeat (each T) -> Bool) {
263263
takesFunctionPack(functions: repeat each functions)
264264
}
265265

266-
func packOutsideExpansion<each T>(_ t: repeat each T) {
266+
func packOutsideExpansion<each T>(
267+
t: repeat each T,
268+
t2: repeat (each T)?,
269+
t3: repeat () -> each T
270+
) {
267271
_ = t
268-
// expected-error@-1{{pack reference 'each T' can only appear in pack expansion}}
272+
// expected-error@-1{{value pack 'each T' must be referenced with 'each'}}
269273

270274
forward(t)
271-
// expected-error@-1{{pack reference 'each T' can only appear in pack expansion}}
275+
// expected-error@-1{{value pack 'each T' must be referenced with 'each'}}
272276

273277
_ = each t
274278
// expected-error@-1{{pack reference 'each T' can only appear in pack expansion}}
@@ -282,6 +286,25 @@ func packOutsideExpansion<each T>(_ t: repeat each T) {
282286

283287
_ = each tuple
284288
// expected-error@-1{{pack reference 'each T' can only appear in pack expansion}}
289+
290+
// https://github.com/swiftlang/swift/issues/78393
291+
let _ = (t2)
292+
// expected-error@-1{{value pack '(each T)?' must be referenced with 'each'}}
293+
let _ = t3
294+
// expected-error@-1{{value pack '() -> each T' must be referenced with 'each'}}
295+
}
296+
297+
do {
298+
// FIXME: https://github.com/swiftlang/swift/issues/78426
299+
func f<each T>(_: (repeat each T) -> (repeat each T)) {}
300+
// expected-error@+2 {{cannot infer type of closure parameter 'x' without a type annotation}}
301+
// expected-error@+1 {{cannot convert value of type '(Int, Int)' to closure result type '(_: _)'}}
302+
f { x in
303+
// Once this issue is fixed, verify that 'x' below is diagnosed correctly.
304+
// If it is not, please reopen https://github.com/swiftlang/swift/issues/78393.
305+
let _ = x
306+
return (1, 2)
307+
}
285308
}
286309

287310
func identity<T>(_ t: T) -> T { t }
@@ -722,7 +745,7 @@ do {
722745

723746
init(base: repeat each Base) {
724747
self.base = base
725-
// expected-error@-1 {{pack reference 'each Base' can only appear in pack expansion}}
748+
// expected-error@-1 {{value pack 'each Base' must be referenced with 'each'}}
726749
}
727750
}
728751
}

0 commit comments

Comments
 (0)