forked from swiftlang/swift
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathswitch.swift
263 lines (216 loc) · 6.76 KB
/
switch.swift
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
// RUN: %target-parse-verify-swift
// TODO: Implement tuple equality in the library.
// BLOCKED: <rdar://problem/13822406>
func ~= (x: (Int,Int), y: (Int,Int)) -> Bool {
return true
}
func parseError1(x: Int) {
switch func {} // expected-error {{expected expression in 'switch' statement}} expected-error {{expected '{' after 'switch' subject expression}} expected-error {{expected identifier in function declaration}} expected-error {{braced block of statements is an unused closure}} expected-error{{expression resolves to an unused function}}
}
func parseError2(x: Int) {
switch x // expected-error {{expected '{' after 'switch' subject expression}}
}
func parseError3(x: Int) {
switch x {
case // expected-error {{expected pattern}} expected-error {{expected ':' after 'case'}}
}
}
func parseError4(x: Int) {
switch x {
case let z where // expected-error {{expected expression for 'where' guard of 'case'}} expected-error {{expected ':' after 'case'}}
}
}
func parseError5(x: Int) {
switch x {
case let z // expected-error {{expected ':' after 'case'}} expected-warning {{immutable value 'z' was never used}} {{12-13=_}}
}
}
func parseError6(x: Int) {
switch x {
default // expected-error {{expected ':' after 'default'}}
}
}
var x: Int
switch x {} // expected-error {{'switch' statement body must have at least one 'case' or 'default' block}}
switch x {
case 0:
x = 0
// Multiple patterns per case
case 1, 2, 3:
x = 0
// 'where' guard
case _ where x % 2 == 0:
x = 1
x = 2
x = 3
case _ where x % 2 == 0,
_ where x % 3 == 0:
x = 1
case 10,
_ where x % 3 == 0:
x = 1
case _ where x % 2 == 0,
20:
x = 1
case let y where y % 2 == 0:
x = y + 1
case _ where 0: // expected-error {{type 'Int' does not conform to protocol 'BooleanType'}}
x = 0
default:
x = 1
}
// Multiple cases per case block
switch x {
case 0: // expected-error {{'case' label in a 'switch' should have at least one executable statement}} {{8-8= break}}
case 1:
x = 0
}
switch x {
case 0: // expected-error{{'case' label in a 'switch' should have at least one executable statement}} {{8-8= break}}
default:
x = 0
}
switch x {
case 0:
x = 0
case 1: // expected-error {{'case' label in a 'switch' should have at least one executable statement}} {{8-8= break}}
}
switch x {
case 0:
x = 0
default: // expected-error {{'default' label in a 'switch' should have at least one executable statement}} {{9-9= break}}
}
switch x {
case 0:
; // expected-error {{';' statements are not allowed}} {{3-5=}}
case 1:
x = 0
}
switch x {
x = 1 // expected-error{{all statements inside a switch must be covered by a 'case' or 'default'}}
default:
x = 0
case 0: // expected-error{{additional 'case' blocks cannot appear after the 'default' block of a 'switch'}}
x = 0
case 1:
x = 0
}
switch x {
default:
x = 0
default: // expected-error{{additional 'case' blocks cannot appear after the 'default' block of a 'switch'}}
x = 0
}
switch x {
x = 1 // expected-error{{all statements inside a switch must be covered by a 'case' or 'default'}}
}
switch x {
x = 1 // expected-error{{all statements inside a switch must be covered by a 'case' or 'default'}}
x = 2
}
switch x {
default: // expected-error{{'default' label in a 'switch' should have at least one executable statement}} {{9-9= break}}
case 0: // expected-error{{additional 'case' blocks cannot appear after the 'default' block of a 'switch'}}
x = 0
}
switch x {
default: // expected-error{{'default' label in a 'switch' should have at least one executable statement}} {{9-9= break}}
default: // expected-error{{additional 'case' blocks cannot appear after the 'default' block of a 'switch'}}
x = 0
}
switch x {
default where x == 0: // expected-error{{'default' cannot be used with a 'where' guard expression}}
x = 0
}
switch x {
case 0: // expected-error {{'case' label in a 'switch' should have at least one executable statement}} {{8-8= break}}
}
switch x {
case 0: // expected-error{{'case' label in a 'switch' should have at least one executable statement}} {{8-8= break}}
case 1:
x = 0
}
switch x {
case 0:
x = 0
case 1: // expected-error{{'case' label in a 'switch' should have at least one executable statement}} {{8-8= break}}
}
case 0: // expected-error{{'case' label can only appear inside a 'switch' statement}}
var y = 0
default: // expected-error{{'default' label can only appear inside a 'switch' statement}}
var z = 1
fallthrough // expected-error{{'fallthrough' is only allowed inside a switch}}
switch x {
case 0:
fallthrough
case 1:
fallthrough
default:
fallthrough // expected-error{{'fallthrough' without a following 'case' or 'default' block}}
}
// Fallthrough can transfer control anywhere within a case and can appear
// multiple times in the same case.
switch x {
case 0:
if true { fallthrough }
if false { fallthrough }
x += 1
default:
x += 1
}
// Cases cannot contain 'var' bindings if there are multiple matching patterns
// attached to a block. They may however contain other non-binding patterns.
var t = (1, 2)
switch t {
case (let a, 2): // expected-error {{'case' label in a 'switch' should have at least one executable statement}} {{17-17= break}}
case (1, _):
()
case (_, 2): // expected-error {{'case' label in a 'switch' should have at least one executable statement}} {{13-13= break}}
case (1, let a):
()
case (let a, 2): // expected-error {{'case' label in a 'switch' should have at least one executable statement}} {{17-17= break}}
case (1, let b):
()
case (1, let b): // let bindings
()
// var bindings are not allowed in cases.
// FIXME: rdar://problem/23378003
// This will eventually be an error.
case (1, var b): // expected-error {{Use of 'var' binding here is not allowed}} {{10-13=let}}
()
case (var a, 2): // expected-error {{Use of 'var' binding here is not allowed}} {{7-10=let}}
()
case (let a, 2), (1, let b): // expected-error {{'case' labels with multiple patterns cannot declare variables}}
()
case (let a, 2), (1, _): // expected-error {{'case' labels with multiple patterns cannot declare variables}}
()
case (_, 2), (let a, _): // expected-error {{'case' labels with multiple patterns cannot declare variables}}
()
// OK
case (_, 2), (1, _):
()
case (_, 2): // expected-error {{'case' label in a 'switch' should have at least one executable statement}} {{13-13= break}}
case (1, _):
()
}
// Fallthroughs can't transfer control into a case label with bindings.
switch t {
case (1, 2):
fallthrough // expected-error {{'fallthrough' cannot transfer control to a case label that declares variables}}
case (let a, let b):
t = (b, a)
}
func test_label(x : Int) {
Gronk:
switch x {
case 42: return
}
}
func enumElementSyntaxOnTuple() {
switch (1, 1) {
case .Bar: // expected-error {{enum case 'Bar' not found in type '(Int, Int)'}}
break
default:
break
}
}