Files
swift-mirror/test/SILGen/unreachable_code.swift
Robert Widmann 43f06afef2 Defer analysis of large switch bodies
This presents a regression in diagnostic quality that is definitely
worth it not to lie to SILGen about whether a switch is covered or not.

At the same time, disable SIL’s unreachable diagnostic for ‘default’
clauses which would previously cause a warning to be emitted if the
default was proven to be unreachable.  This analysis is incomplete
anyways and can be done by Sema in the future if we desire.
2017-12-13 16:22:48 -05:00

140 lines
3.0 KiB
Swift

// RUN: %target-swift-frontend -enable-sil-ownership -emit-sil %s -o /dev/null -verify
func testUnreachableAfterReturn() -> Int {
var x: Int = 3
return x
x += 1 //expected-warning {{code after 'return' will never be executed}}
}
func testUnreachableAfterIfReturn(a: Bool) -> Int {
if a {
return 1
} else {
return 0
}
var _: Int = testUnreachableAfterReturn() // expected-warning {{will never be executed}}
}
func testUnreachableForAfterContinue(b: Bool) {
for _ in 0..<10 {
var y: Int = 300
y += 1
if b {
break
y += 1 // expected-warning {{code after 'break' will never be executed}}
}
continue
y -= 1 // expected-warning {{code after 'continue' will never be executed}}
}
}
func testUnreachableWhileAfterContinue(b: Bool) {
var i:Int = 0
while (i<10) {
var y: Int = 300
y += 1
if b {
break
y += 1 // expected-warning {{code after 'break' will never be executed}}
}
continue
i += 1 // expected-warning {{code after 'continue' will never be executed}}
}
}
func testBreakAndContinue() {
var m = 0
for _ in 0 ..< 10 {
m += 1
if m == 15 {
break
} else {
continue
}
m += 1 // expected-warning {{will never be executed}}
}
}
// <rdar://problem/20253447> `case let Case` without bindings incorrectly matches other cases
enum Tree {
case Leaf(Int)
case Branch(Int)
}
func testUnreachableCase1(a : Tree) {
switch a {
case let Leaf:
_ = Leaf
return
case .Branch(_): // expected-warning {{case will never be executed}}
// expected-warning@-1 {{case is already handled by previous patterns; consider removing it}}
return
}
}
func testUnreachableCase2(a : Tree) {
switch a {
case let Leaf:
_ = Leaf
fallthrough
case .Branch(_): // expected-warning {{case is already handled by previous patterns; consider removing it}}
return
}
}
func testUnreachableCase3(a : Tree) {
switch a {
case _:
break
case .Branch(_): // expected-warning {{case will never be executed}}
// expected-warning@-1 {{case is already handled by previous patterns; consider removing it}}
return
}
}
func testUnreachableCase4(a : Tree) {
switch a {
case .Leaf(_):
return
case .Branch(_):
return
}
}
func testUnreachableCase5(a : Tree) {
switch a {
case _:
break
default:
return
}
}
func testOptionalEvaluationBreak(a : Tree) {
class SR5763 { func foo() {} }
func createOptional() -> SR5763? { return SR5763() }
switch a {
case _:
break
createOptional()?.foo() // expected-warning {{code after 'break' will never be executed}}
}
}
func testUnreachableAfterThrow(e: Error) throws {
throw e
return // expected-warning {{code after 'throw' will never be executed}}
}
class TestThrowInInit {
required init(e: Error) throws {
throw e // no unreachable code diagnostic for the implicit return.
}
}
func sr6141() {
var bar: String? = ""
return;
bar?.append("x") // expected-warning{{code after 'return' will never be executed}}
}