mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
155 lines
3.0 KiB
Swift
155 lines
3.0 KiB
Swift
// RUN: %target-typecheck-verify-swift
|
|
|
|
enum E {
|
|
case e1
|
|
case e2
|
|
}
|
|
|
|
func foo1(e : E) {
|
|
switch e { // expected-error{{switch must be exhaustive}}
|
|
// expected-note@-1 {{add missing case: '.e2'}}
|
|
case .e1: return
|
|
}
|
|
}
|
|
|
|
func foo2(i : Int) {
|
|
switch i { // expected-error{{switch must be exhaustive}}
|
|
// expected-note@-1{{add a default clause}}{{+3:3-3=default:\n<#code#>\n}}
|
|
case 1: return
|
|
}
|
|
}
|
|
|
|
|
|
// Treat nil as .none and do not emit false
|
|
// non-exhaustive warning.
|
|
func testSwitchEnumOptionalNil(_ x: Int?) -> Int {
|
|
switch x { // no warning
|
|
case .some(_):
|
|
return 1
|
|
case nil:
|
|
return -1
|
|
}
|
|
}
|
|
|
|
// Do not emit false non-exhaustive warnings if both
|
|
// true and false are covered by the switch.
|
|
func testSwitchEnumBool(_ b: Bool, xi: Int) -> Int {
|
|
var x = xi
|
|
let Cond = b
|
|
|
|
switch Cond { // no warning
|
|
default:
|
|
x += 1
|
|
}
|
|
|
|
switch Cond { // expected-error{{switch must be exhaustive}}
|
|
// expected-note@-1 {{missing case: 'false'}}
|
|
case true:
|
|
x += 1
|
|
}
|
|
|
|
switch Cond { // expected-error{{switch must be exhaustive}}
|
|
// expected-note@-1 {{missing case: 'true'}}
|
|
case false:
|
|
x += 1
|
|
}
|
|
|
|
switch Cond { // no warning
|
|
case true:
|
|
x += 1
|
|
case false:
|
|
x -= 1
|
|
}
|
|
|
|
return x
|
|
}
|
|
|
|
func testSwitchOptionalBool(_ b: Bool?, xi: Int) -> Int {
|
|
var x = xi
|
|
switch b { // No warning
|
|
case .some(true):
|
|
x += 1
|
|
case .some(false):
|
|
x += 1
|
|
case .none:
|
|
x -= 1
|
|
}
|
|
|
|
switch b { // expected-error{{switch must be exhaustive}}
|
|
// expected-note@-1 {{add missing case: '.some(false)'}}
|
|
case .some(true):
|
|
x += 1
|
|
case .none:
|
|
x -= 1
|
|
}
|
|
|
|
return xi
|
|
}
|
|
|
|
// Do not emit false non-exhaustive warnings if both
|
|
// true and false are covered for a boolean element of a tuple.
|
|
func testSwitchEnumBoolTuple(_ b1: Bool, b2: Bool, xi: Int) -> Int {
|
|
var x = xi
|
|
let Cond = (b1, b2)
|
|
|
|
switch Cond { // no warning
|
|
default:
|
|
x += 1
|
|
}
|
|
|
|
switch Cond { // expected-error{{switch must be exhaustive}}
|
|
// expected-note@-1 {{add missing case: '(false, _)'}}
|
|
// expected-note@-2 {{add missing case: '(_, false)'}}
|
|
// expected-note@-3 {{add missing cases}}
|
|
case (true, true):
|
|
x += 1
|
|
}
|
|
|
|
switch Cond { // expected-error{{switch must be exhaustive}}
|
|
// expected-note@-1 {{add missing case: '(true, _)'}}
|
|
// expected-note@-2 {{add missing case: '(_, false)'}}
|
|
// expected-note@-3 {{add missing cases}}
|
|
case (false, true):
|
|
x += 1
|
|
}
|
|
|
|
switch Cond { // no warning
|
|
case (true, true):
|
|
x += 1
|
|
case (true, false):
|
|
x += 1
|
|
case (false, true):
|
|
x -= 1
|
|
case (false, false):
|
|
x -= 1
|
|
}
|
|
|
|
return x
|
|
}
|
|
|
|
func non_fully_covered_switch(x: Int) -> Int {
|
|
var x = x
|
|
switch x { // expected-error{{switch must be exhaustive}}
|
|
// expected-note@-1{{add a default clause}}
|
|
case 0:
|
|
x += 1
|
|
case 3:
|
|
x -= 1
|
|
}
|
|
return x
|
|
}
|
|
|
|
// Do not crash if another switch statement follows a fallthrough.
|
|
func fallthrough_not_last(i: Int) {
|
|
switch i {
|
|
case 1:
|
|
fallthrough
|
|
switch i {
|
|
case 1: break
|
|
default: break
|
|
}
|
|
default:
|
|
break
|
|
}
|
|
}
|