You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Sema: Better distinguish scalar from variadic generic argument positions, and reject pack expansion types there
We used to disallow pack expansions in generic argument lists of
protocols, but allow them for all other nominal types. However,
we only actually checked that the pack expansions match up if
the type itself was variadic.
Fix this by repurposing Context::ProtocolGenericArgument into
Context::ScalarGenericArgument, and using that when the type does
not have a parameter pack.
Context::GenericArgument is now Context::VariadicGenericArgument,
and we only use it if the type has a parameter pack, in which case
we use the PackMatcher, so any pack expansions in the wrong place
are caught there.
Fixes rdar://116716014 and #69088.
// 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 of a variadic type}}
40
40
letlocalAnnotated:repeateachT=repeateach t
41
-
// expected-error@-1{{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument list}}
41
+
// expected-error@-1{{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument of a variadic type}}
@@ -92,7 +92,7 @@ func sameShapeDiagnostics<each T, each U>(t: repeat each T, u: repeat each U) {
92
92
_ =(repeat(Array<eachT>(),each u)) // expected-error {{pack expansion requires that 'each T' and 'each U' have the same shape}}
93
93
}
94
94
95
-
func returnPackExpansionType<eachT>(_ t:repeateachT)->repeateachT{ // expected-error {{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument list}}
95
+
func returnPackExpansionType<eachT>(_ t:repeateachT)->repeateachT{ // expected-error {{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument of a variadic type}}
Copy file name to clipboardExpand all lines: test/Generics/rdar115538574.swift
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -5,5 +5,5 @@ protocol P<A> {
5
5
}
6
6
7
7
func f<eachT>(_:someP<repeateachT>){}
8
-
// expected-error@-1 {{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument list}}
8
+
// expected-error@-1 {{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument of a variadic type}}
9
9
// expected-error@-2 {{generic parameter 'T' is not used in function signature}}
typealiasOne=A<repeateachT> // expected-error {{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument of a variadic type}}
// expected-error@-1 {{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument list}}
4
+
// expected-error@-1 {{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument of a variadic type}}
5
5
6
6
func f2<eachT>()->(repeateachT){}
7
7
// okay
@@ -15,15 +15,15 @@ protocol P<T> {
15
15
}
16
16
17
17
func f4<eachT>()->anyP<repeateachT>{}
18
-
// expected-error@-1 {{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument list}}
18
+
// expected-error@-1 {{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument of a variadic type}}
19
19
20
20
typealiasT1<eachT>=repeateachT
21
-
// expected-error@-1 {{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument list}}
21
+
// expected-error@-1 {{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument of a variadic type}}
22
22
23
23
typealiasT2<eachT>=(repeateachT)
24
24
25
25
func f4<eachT>()->repeat()->eachT{}
26
-
// expected-error@-1 {{pack expansion 'repeat () -> each T' can only appear in a function parameter list, tuple element, or generic argument list}}
26
+
// expected-error@-1 {{pack expansion 'repeat () -> each T' can only appear in a function parameter list, tuple element, or generic argument of a variadic type}}
27
27
28
28
func f5<eachT>()->()->(repeateachT){}
29
29
@@ -35,14 +35,14 @@ enum E<each T> { // expected-error {{enums cannot declare a type pack}}
35
35
case f2(_:G<repeateachT>)
36
36
37
37
varx:repeateachT{fatalError()}
38
-
// expected-error@-1 {{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument list}}
38
+
// expected-error@-1 {{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument of a variadic type}}
39
39
40
40
varx:(repeateachT){fatalError()}
41
41
42
42
subscript(_:repeateachT)->Int{fatalError()}
43
43
44
44
subscript()->repeateachT{fatalError()}
45
-
// expected-error@-1 {{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument list}}
45
+
// expected-error@-1 {{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument of a variadic type}}
0 commit comments