Skip to content

Commit b7a2fa2

Browse files
Merge pull request #64186 from sophiapoirier/each_non_pack_fixit
[Variadic Generics] fixit for pack expansion on a non-pack generic type
2 parents 23111df + 5182493 commit b7a2fa2

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
@@ -4583,8 +4583,15 @@ NeverNullType TypeResolver::resolvePackElement(PackElementTypeRepr *repr,
45834583
return ErrorType::get(ctx);
45844584

45854585
if (!packReference->isParameterPack()) {
4586-
ctx.Diags.diagnose(repr->getLoc(), diag::each_non_pack,
4587-
packReference);
4586+
auto diag =
4587+
ctx.Diags.diagnose(repr->getLoc(), diag::each_non_pack, packReference);
4588+
if (auto *packIdent = dyn_cast<IdentTypeRepr>(repr->getPackType())) {
4589+
if (auto *packIdentBinding = packIdent->getBoundDecl()) {
4590+
if (packIdentBinding->getLoc().isValid()) {
4591+
diag.fixItInsert(packIdentBinding->getLoc(), "each ");
4592+
}
4593+
}
4594+
}
45884595
return packReference;
45894596
}
45904597

test/Constraints/pack-expansion-expressions.swift

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

102-
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}}
102+
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}}
103103
fatalError()
104104
}
105105

106+
func expansionOfNonPackType<T>(_ t: repeat each T) {}
107+
// expected-error@-1 {{'each' cannot be applied to non-pack type 'T'}}{{29-29=each }}
108+
// expected-error@-2 {{variadic expansion 'T' must contain at least one variadic generic parameter}}
109+
106110
func tupleExpansion<each T, each U>(
107111
_ tuple1: (repeat each T),
108112
_ tuple2: (repeat each U)

0 commit comments

Comments
 (0)