Skip to content

Commit 6402411

Browse files
committed
Make always-immutable pattern bindings a warning for now
These will become errors after the next release branch. rdar://problem/23172698
1 parent b951525 commit 6402411

File tree

7 files changed

+41
-17
lines changed

7 files changed

+41
-17
lines changed

Diff for: include/swift/AST/DiagnosticsParse.def

+2-2
Original file line numberDiff line numberDiff line change
@@ -641,8 +641,8 @@ ERROR(untyped_pattern_ellipsis,pattern_parsing,none,
641641
"'...' cannot be applied to a subpattern which is not explicitly typed", ())
642642
ERROR(non_func_decl_pattern_init,pattern_parsing,none,
643643
"default argument is only permitted for a non-curried function parameter",())
644-
ERROR(var_not_allowed_in_pattern,pattern_parsing, none,
645-
"'var' is not allowed in this pattern binding", ())
644+
WARNING(var_not_allowed_in_pattern,pattern_parsing, none,
645+
"Use of 'var' binding here is deprecated and will be removed in a future version of Swift", ())
646646
ERROR(var_pattern_in_var,pattern_parsing,none,
647647
"'%select{var|let}0' cannot appear nested inside another 'var' or "
648648
"'let' pattern", (unsigned))

Diff for: lib/Parse/ParseStmt.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -1234,7 +1234,8 @@ ParserStatus Parser::parseStmtCondition(StmtCondition &Condition,
12341234
if (BindingKind == BK_Case) {
12351235
// In our recursive parse, remember that we're in a matching pattern.
12361236
llvm::SaveAndRestore<decltype(InVarOrLetPattern)>
1237-
T(InVarOrLetPattern, IVOLP_InMatchingPattern);
1237+
T(InVarOrLetPattern, IVOLP_AlwaysImmutable);
1238+
12381239
ThePattern = parseMatchingPattern(/*isExprBasic*/ true);
12391240
} else if (BindingKind == BK_LetCase || BindingKind == BK_VarCase) {
12401241
// Recover from the 'if let case' typo gracefully.
@@ -2268,6 +2269,7 @@ ParserResult<Stmt> Parser::parseStmtForEach(SourceLoc ForLoc,
22682269
// if desired by using a 'var' pattern.
22692270
assert(InVarOrLetPattern == IVOLP_NotInVarOrLet &&
22702271
"for-each loops cannot exist inside other patterns");
2272+
22712273
InVarOrLetPattern = IVOLP_AlwaysImmutable;
22722274
pattern = parseTypedPattern();
22732275
assert(InVarOrLetPattern == IVOLP_AlwaysImmutable);

Diff for: test/Constraints/patterns.swift

+5-2
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,11 @@ case x ?? 42: break // match value
165165
default: break
166166
}
167167

168-
for (var x) in 0...100 {} // expected-error {{'var' is not allowed in this pattern binding}}
169-
for var x in 0...100 {} // expected-error {{'var' is not allowed in this pattern binding}}
168+
// FIXME: rdar://problem/23378003
169+
// These will eventually become errors.
170+
for (var x) in 0...100 {} // expected-warning {{Use of 'var' binding here is deprecated and will be removed in a future version of Swift}} {{6-9=}}
171+
for var x in 0...100 {} // expected-warning {{Use of 'var' binding here is deprecated and will be removed in a future version of Swift}} {{5-9=}}
172+
170173
for (let x) in 0...100 {} // expected-error {{'let' pattern is already in an immutable context}}
171174

172175
var (let y) = 42 // expected-error {{'let' cannot appear nested inside another 'var' or 'let' pattern}}

Diff for: test/Parse/foreach.swift

+4-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ func for_each(r: Range<Int>, iir: IntRange<Int>) {
3333
for i r { // expected-error 2{{expected ';' in 'for' statement}} expected-error {{use of unresolved identifier 'i'}}
3434
}
3535
for i in r sum = sum + i; // expected-error{{expected '{' to start the body of for-each loop}}
36-
for var x in 0..<10 {} // expected-error {{'var' is not allowed in this pattern binding}} {{7-11=}}
3736
for let x in 0..<10 {} // expected-error {{'let' pattern is already in an immutable context}} {{7-11=}}
37+
38+
// FIXME: rdar://problem/23378003
39+
// This will eventually become an error.
40+
for var x in 0..<10 {} // expected-warning {{Use of 'var' binding here is deprecated and will be removed in a future version of Swift}} {{7-11=}}
3841
}

Diff for: test/Parse/matching_patterns.swift

+4-2
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,11 @@ case let (let b): // expected-error {{'let' cannot appear nested inside another
3232
print(b)
3333

3434
// 'var' patterns (not allowed)
35-
case var a: // expected-error {{'var' is not allowed in this pattern binding}}
35+
// FIXME: rdar://problem/23378003
36+
// This will eventually be an error.
37+
case var a: // expected-warning {{Use of 'var' binding here is deprecated and will be removed in a future version of Swift}} {{6-9=let}}
3638
a += 1
37-
case var let a: // expected-error {{'var' is not allowed in this pattern binding}}
39+
case var let a: // expected-warning {{Use of 'var' binding here is deprecated and will be removed in a future version of Swift}} {{6-9=let}}
3840
// expected-error@-1 {{'let' cannot appear nested inside another 'var' or 'let' pattern}}
3941
print(a, terminator: "")
4042

Diff for: test/Parse/switch.swift

+4-2
Original file line numberDiff line numberDiff line change
@@ -214,9 +214,11 @@ case (1, let b): // let bindings
214214
()
215215

216216
// var bindings are not allowed in cases.
217-
case (1, var b): // expected-error {{'var' is not allowed in this pattern binding}}
217+
// FIXME: rdar://problem/23378003
218+
// This will eventually be an error.
219+
case (1, var b): // expected-warning {{Use of 'var' binding here is deprecated and will be removed in a future version of Swift}} {{10-13=let}}
218220
()
219-
case (var a, 2): // expected-error {{'var' is not allowed in this pattern binding}}
221+
case (var a, 2): // expected-warning {{Use of 'var' binding here is deprecated and will be removed in a future version of Swift}} {{7-10=let}}
220222
()
221223

222224
case (let a, 2), (1, let b): // expected-error {{'case' labels with multiple patterns cannot declare variables}}

Diff for: test/decl/var/usage.swift

+19-7
Original file line numberDiff line numberDiff line change
@@ -170,27 +170,35 @@ func testOpenExistential(var x: Fooable,
170170
func couldThrow() throws {}
171171

172172
func testFixitsInStatementsWithPatterns(a : Int?) {
173-
if var b = a, // expected-error {{'var' is not allowed in this pattern binding}} {{6-9=let}}
174-
var b2 = a { // expected-error {{'var' is not allowed in this pattern binding}} {{7-10=let}}
173+
// FIXME: rdar://problem/23378003
174+
// This will eventually be an error.
175+
if var b = a, // expected-warning {{Use of 'var' binding here is deprecated and will be removed in a future version of Swift}} {{6-9=let}}
176+
var b2 = a { // expected-warning {{Use of 'var' binding here is deprecated and will be removed in a future version of Swift}} {{7-10=let}}
175177
b = 1
176178
b2 = 1
177179
_ = b
178180
_ = b2
179181
}
180182

181183
var g = [1,2,3].generate()
182-
while var x = g.next() { // expected-error {{'var' is not allowed in this pattern binding}} {{9-12=let}}
184+
// FIXME: rdar://problem/23378003
185+
// This will eventually be an error.
186+
while var x = g.next() { // expected-warning {{Use of 'var' binding here is deprecated and will be removed in a future version of Swift}} {{9-12=let}}
183187
x = 0
184188
_ = x
185189
}
186190

187-
guard var y = Optional.Some(1) else { // expected-error {{'var' is not allowed in this pattern binding}} {{9-12=let}}
191+
// FIXME: rdar://problem/23378003
192+
// This will eventually be an error.
193+
guard var y = Optional.Some(1) else { // expected-warning {{Use of 'var' binding here is deprecated and will be removed in a future version of Swift}} {{9-12=let}}
188194
return
189195
}
190196
y = 0
191197
_ = y
192198

193-
for var b in [42] { // expected-error {{'var' is not allowed in this pattern binding}} {{7-11=}}
199+
// FIXME: rdar://problem/23378003
200+
// This will eventually be an error.
201+
for var b in [42] { // expected-warning {{Use of 'var' binding here is deprecated and will be removed in a future version of Swift}} {{7-11=}}
194202
b = 42
195203
_ = b
196204
}
@@ -201,13 +209,17 @@ func testFixitsInStatementsWithPatterns(a : Int?) {
201209

202210
do {
203211
try couldThrow()
204-
} catch var err { // expected-error {{'var' is not allowed in this pattern binding}} {{11-14=let}}
212+
// FIXME: rdar://problem/23378003
213+
// This will eventually be an error.
214+
} catch var err { // expected-warning {{Use of 'var' binding here is deprecated and will be removed in a future version of Swift}} {{11-14=let}}
205215
// expected-warning@-1 {{variable 'err' was never mutated; consider changing to 'let' constant}}
206216
_ = err
207217
}
208218

209219
switch a {
210-
case var b: // expected-error {{'var' is not allowed in this pattern binding}} {{10-13=let}}
220+
// FIXME: rdar://problem/23378003
221+
// This will eventually be an error.
222+
case var b: // expected-warning {{Use of 'var' binding here is deprecated and will be removed in a future version of Swift}} {{10-13=let}}
211223
// expected-warning@-1 {{variable 'b' was never mutated; consider changing to 'let' constant}}
212224
_ = b
213225
}

0 commit comments

Comments
 (0)