File: pack_expansion.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (110 lines) | stat: -rw-r--r-- 4,395 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// RUN: %target-typecheck-verify-swift -disable-availability-checking

func f1<each T>() -> repeat each T {}
// 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}}

func f2<each T>() -> (repeat each T) {}
// okay

struct G<each T> {}

func f3<each T>() -> G<repeat each T> {}

protocol P<T> {
  associatedtype T
}

func f4<each T>() -> any P<repeat each T> {}
// 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}}

typealias T1<each T> = repeat each T
// 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}}

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

func f4<each T>() -> repeat () -> each T {}
// 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}}

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

func f6<each T>() -> (repeat each T) -> () {}

enum E<each T> { // expected-error {{enums cannot declare a type pack}}
  case f1(_: repeat each T)

  case f2(_: G<repeat each T>)

  var x: repeat each T { fatalError() }
  // 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}}

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

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

  subscript() -> repeat each T { fatalError() }
  // 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}}

  subscript() -> (repeat each T) { fatalError() }
}

func withWhereClause<each T>(_ x: repeat each T) where repeat each T: P {}

struct Outer<each T> {
  struct Bad<each U> {
    typealias Value = (repeat (each T, each U)) // expected-error {{pack expansion 'repeat (each T, each U)' requires that 'each T' and 'each U' have the same shape}}
  }

  struct Good<each U> where (repeat (each T, each U)): Any {
    typealias Value = (repeat (each T, each U))
  }

  struct AlsoGood<each U> {
    typealias Value = (repeat (each T, E<repeat each U>))
  }
}

func packRef<each T>(_: repeat each T) where repeat each T: P {}

func packMemberRef<each T>(_: repeat (each T).T) where repeat each T: P {}
// expected-error@-1 {{generic parameter 'T' is not used in function signature}}

// expected-error@+1 {{'each' cannot be applied to non-pack type 'Int'}}{{31-35=}}
func invalidPackRefEachInt(_: each Int) {}

// expected-error@+1 {{pack expansion 'Int' must contain at least one pack reference}}
func invalidPackRefRepeatInt(_: repeat Int) {}

// expected-error@+1 {{pack reference 'T' requires expansion using keyword 'repeat'}}
func packRefOutsideExpansion<each T>(_: each T) {}

// expected-error@+1 {{pack reference 'T' requires expansion using keyword 'repeat'}}
func packRefOutsideExpansion<each T>(_: Array<each T>) {}

// expected-error@+1 {{pack reference 'T' requires expansion using keyword 'repeat'}}
func packRefOutsideExpansion<each T>(_: Array<(each T) -> ()>) {}

// expected-error@+1 {{pack reference 'T' requires expansion using keyword 'repeat'}}
func packRefOutsideExpansion<each T>(_: (each T)) {}

// expected-error@+1 {{pack reference 'T' requires expansion using keyword 'repeat'}}
func packRefOutsideExpansion<each T>(_: each T.Type) {}

// expected-error@+1 {{pack reference 'T' requires expansion using keyword 'repeat'}}
func packRefOutsideExpansionRequirement1<each T>(_: repeat each T) where each T: P {}

// expected-error@+1 {{pack reference 'T' requires expansion using keyword 'repeat'}}
func packRefOutsideExpansionRequirement2<each T>(_: repeat each T) where G<each T>: P {}

// coverage to ensure a 'repeat each' type is considered Copyable
func golden<Z>(_ z: Z) {}
func hour<each T>(_ t: repeat each T)  {
  _ = (repeat golden(each t))
}

func unusedParameterPack1<each T: Sequence>(_: repeat (each T).Element) {}
// expected-error@-1 {{generic parameter 'T' is not used in function signature}}

typealias First<T, U> = T

func unusedParameterPack2<each T>(_: repeat First<Int, each T>) {}
// expected-error@-1 {{generic parameter 'T' is not used in function signature}}