Skip to content

Commit a0e20e3

Browse files
committed
use full PackExpansion in diagnostic
1 parent 16c3992 commit a0e20e3

File tree

5 files changed

+22
-16
lines changed

5 files changed

+22
-16
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5310,7 +5310,7 @@ ERROR(vararg_not_allowed,none,
53105310
"variadic parameter cannot appear outside of a function parameter list",
53115311
())
53125312
ERROR(expansion_not_allowed,none,
5313-
"pack expansion repeat each %0 can only appear in a function parameter list, "
5313+
"pack expansion %0 can only appear in a function parameter list, "
53145314
"tuple element, or generic argument list", (Type))
53155315
ERROR(expansion_not_variadic,none,
53165316
"pack expansion %0 must contain at least one pack reference", (Type))

include/swift/Basic/SourceLoc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ class SourceRange {
157157
/// A half-open character-based source range.
158158
class CharSourceRange {
159159
SourceLoc Start;
160-
unsigned ByteLength{};
160+
unsigned ByteLength;
161161

162162
public:
163163
/// Constructs an invalid range.

lib/Sema/TypeCheckType.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4561,27 +4561,33 @@ NeverNullType TypeResolver::resolvePackExpansionType(PackExpansionTypeRepr *repr
45614561
return ErrorType::get(ctx);
45624562
}
45634563

4564+
PackExpansionType *result{};
4565+
GenericSignature genericSig;
4566+
Type shapeType;
4567+
if (resolution.getStage() == TypeResolutionStage::Interface) {
4568+
genericSig = resolution.getGenericSignature();
4569+
shapeType = genericSig->getReducedShape(rootParameterPacks[0]);
4570+
result = PackExpansionType::get(patternType, shapeType);
4571+
} else {
4572+
result = PackExpansionType::get(patternType, rootParameterPacks[0]);
4573+
}
4574+
45644575
// We might not allow variadic expansions here at all.
45654576
if (!options.isPackExpansionSupported(getDeclContext())) {
4566-
diagnose(repr->getLoc(), diag::expansion_not_allowed, patternType);
4577+
diagnose(repr->getLoc(), diag::expansion_not_allowed, result);
45674578
return ErrorType::get(ctx);
45684579
}
45694580

45704581
if (resolution.getStage() == TypeResolutionStage::Interface) {
4571-
auto genericSig = resolution.getGenericSignature();
4572-
auto shapeType = genericSig->getReducedShape(rootParameterPacks[0]);
4573-
auto result = PackExpansionType::get(patternType, shapeType);
4574-
45754582
for (auto type : rootParameterPacks) {
45764583
if (!genericSig->haveSameShape(type, shapeType)) {
45774584
ctx.Diags.diagnose(repr->getLoc(), diag::expansion_not_same_shape,
45784585
result, shapeType, type);
45794586
}
45804587
}
4581-
return result;
45824588
}
45834589

4584-
return PackExpansionType::get(patternType, rootParameterPacks[0]);
4590+
return result;
45854591
}
45864592

45874593
NeverNullType TypeResolver::resolvePackElement(PackElementTypeRepr *repr,

test/Constraints/pack-expansion-expressions.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ func sameShapeDiagnostics<each T, each U>(t: repeat each T, u: repeat each U) {
8787
_ = repeat (Array<each T>(), each u) // expected-error {{pack expansion requires that 'U' and 'T' have the same shape}}
8888
}
8989

90-
func returnPackExpansionType<each T>(_ t: repeat each T) -> repeat each T { // expected-error {{pack expansion repeat each 'T' can only appear in a function parameter list, tuple element, or generic argument list}}
90+
func returnPackExpansionType<each T>(_ t: repeat each T) -> repeat each T { // expected-error {{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument list}}
9191
fatalError()
9292
}
9393

test/type/pack_expansion.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// REQUIRES: asserts
44

55
func f1<each T>() -> repeat each T {}
6-
// expected-error@-1 {{pack expansion repeat each 'T' can only appear in a function parameter list, tuple element, or generic argument list}}
6+
// expected-error@-1 {{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument list}}
77

88
func f2<each T>() -> (repeat each T) {}
99
// okay
@@ -19,12 +19,12 @@ protocol P<T> {
1919
func f4<each T>() -> any P<repeat each T> {}
2020

2121
typealias T1<each T> = repeat each T
22-
// expected-error@-1 {{pack expansion repeat each 'T' can only appear in a function parameter list, tuple element, or generic argument list}}
22+
// expected-error@-1 {{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument list}}
2323

2424
typealias T2<each T> = (repeat each T)
2525

2626
func f4<each T>() -> repeat () -> each T {}
27-
// expected-error@-1 {{pack expansion repeat each '() -> T' can only appear in a function parameter list, tuple element, or generic argument list}}
27+
// expected-error@-1 {{pack expansion 'repeat () -> each T' can only appear in a function parameter list, tuple element, or generic argument list}}
2828

2929
func f5<each T>() -> () -> (repeat each T) {}
3030

@@ -36,20 +36,20 @@ enum E<each T> {
3636
case f2(_: G<repeat each T>)
3737

3838
var x: repeat each T { fatalError() }
39-
// expected-error@-1 {{pack expansion repeat each 'T' can only appear in a function parameter list, tuple element, or generic argument list}}
39+
// expected-error@-1 {{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument list}}
4040

4141
var x: (repeat each T) { fatalError() }
4242

4343
subscript(_: repeat each T) -> Int { fatalError() }
4444

4545
subscript() -> repeat each T { fatalError() }
46-
// expected-error@-1 {{pack expansion repeat each 'T' can only appear in a function parameter list, tuple element, or generic argument list}}
46+
// expected-error@-1 {{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument list}}
4747

4848
subscript() -> (repeat each T) { fatalError() }
4949
}
5050

5151
func withWhereClause<each T>(_ x: repeat each T) where repeat each T: P {}
52-
// expected-error@-1 {{pack expansion repeat each 'T' can only appear in a function parameter list, tuple element, or generic argument list}}
52+
// expected-error@-1 {{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument list}}
5353

5454
struct Outer<each T> {
5555
struct Bad<each U> {

0 commit comments

Comments
 (0)