Skip to content

Commit 5182493

Browse files
committed
[Variadic Generics] fixit for pack expansion on a non-pack generic type
1 parent 03456ac commit 5182493

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

lib/Sema/TypeCheckType.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4579,8 +4579,15 @@ NeverNullType TypeResolver::resolvePackElement(PackElementTypeRepr *repr,
45794579
return ErrorType::get(ctx);
45804580

45814581
if (!packReference->isParameterPack()) {
4582-
ctx.Diags.diagnose(repr->getLoc(), diag::each_non_pack,
4583-
packReference);
4582+
auto diag =
4583+
ctx.Diags.diagnose(repr->getLoc(), diag::each_non_pack, packReference);
4584+
if (auto *packIdent = dyn_cast<IdentTypeRepr>(repr->getPackType())) {
4585+
if (auto *packIdentBinding = packIdent->getBoundDecl()) {
4586+
if (packIdentBinding->getLoc().isValid()) {
4587+
diag.fixItInsert(packIdentBinding->getLoc(), "each ");
4588+
}
4589+
}
4590+
}
45844591
return packReference;
45854592
}
45864593

test/Constraints/pack-expansion-expressions.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,14 @@ func returnRepeatTuple<each T>(_ t: repeat each T) -> (repeat T) { // expected-e
9191
fatalError()
9292
}
9393

94-
func paremeterAsPackTypeWithoutExpansion<each T>(_ t: T) -> repeat each T { // expected-error {{variadic expansion 'T' cannot appear outside of a function parameter list, function result, tuple element or generic argument list}}
94+
func parameterAsPackTypeWithoutExpansion<each T>(_ t: T) -> repeat each T { // expected-error {{variadic expansion 'T' cannot appear outside of a function parameter list, function result, tuple element or generic argument list}}
9595
fatalError()
9696
}
9797

98+
func expansionOfNonPackType<T>(_ t: repeat each T) {}
99+
// expected-error@-1 {{'each' cannot be applied to non-pack type 'T'}}{{29-29=each }}
100+
// expected-error@-2 {{variadic expansion 'T' must contain at least one variadic generic parameter}}
101+
98102
func tupleExpansion<each T, each U>(
99103
_ tuple1: (repeat each T),
100104
_ tuple2: (repeat each U)

0 commit comments

Comments
 (0)