mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Previously we would ignore the effect that an if statement or ternary's condition exit counter might have on its branches, as we assumed a condition can't do any control flow. However, in the case where the condition throws an error, we need to account for the error branch.
446 lines
24 KiB
Swift
446 lines
24 KiB
Swift
// RUN: %empty-directory(%t)
|
|
// RUN: %target-build-swift %s -profile-generate -profile-coverage-mapping -o %t/main
|
|
|
|
// This unusual use of 'sh' allows the path of the profraw file to be
|
|
// substituted by %target-run.
|
|
// RUN: %target-codesign %t/main
|
|
// RUN: %target-run sh -c 'env LLVM_PROFILE_FILE=$1 $2' -- %t/default.profraw %t/main
|
|
|
|
// RUN: %llvm-profdata merge %t/default.profraw -o %t/default.profdata
|
|
// RUN: %llvm-cov show %t/main -instr-profile=%t/default.profdata | %FileCheck %s
|
|
|
|
// REQUIRES: profile_runtime
|
|
// REQUIRES: executable_test
|
|
// REQUIRES: OS=macosx
|
|
|
|
struct Err: Error {}
|
|
|
|
struct S {
|
|
static subscript() -> Int {
|
|
get throws { throw Err() }
|
|
}
|
|
func throwingMethod() throws -> Int { throw Err() }
|
|
}
|
|
|
|
func noThrowingFn() throws -> Int { 0 }
|
|
|
|
@discardableResult
|
|
func throwingFn() throws -> Int { throw Err() }
|
|
|
|
func throwingBool() throws -> Bool { throw Err() }
|
|
func noThrowingBool() throws -> Bool { true }
|
|
|
|
var throwingProp: Int {
|
|
get throws { throw Err() }
|
|
}
|
|
|
|
var throwingS: S {
|
|
get throws { throw Err() }
|
|
}
|
|
|
|
var noThrowingS: S {
|
|
get throws { S() }
|
|
}
|
|
|
|
func test1() -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
do { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
let x = try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return x // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} catch { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return 0 // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = test1() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test2() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
let x = try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return x // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test2() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test3() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
let x = try throwingProp // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return x // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test3() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test4() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
let x = try S[] // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return x // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test4() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
// Note we don't emit a region after the call since it would be empty.
|
|
func test5() -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
do { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} catch { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return 0 // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = test5() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func takesInts(_ x: Int, _ y: Int) {} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
|
|
// The throwing expr is nested here, the region starts after the throwing expr.
|
|
func test6() throws { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
takesInts(try throwingFn(), 0) // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
try? test6() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test7() throws { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
takesInts( // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try throwingFn(), // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
0 // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
) // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
try? test7() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test8() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
let x = try throwingS.throwingMethod() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return x // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test8()
|
|
|
|
func test9() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
let x = try noThrowingS.throwingMethod() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return x // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test9() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test10() throws { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
takesInts( // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try throwingFn(), // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
) // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
try? test10() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test11() throws { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
takesInts( // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try noThrowingFn(), // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
) // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
try? test11() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
// rdar://100470244 - Make sure we don't underflow the counter here.
|
|
func test12() -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
do { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return 1 // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} catch { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return 2 // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = test12() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test13() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
x: do { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} catch is Err { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
break x // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return 1 // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test13() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test14() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
x: do { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
do { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
break x // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} catch is Err { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return 1 // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} catch is Err { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
return 2 // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test14() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test15() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
x: do { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
do { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try noThrowingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
break x // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} catch is Err { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
return 1 // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} catch is Err { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
// CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return 2 // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test15() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test16() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
let x = try true // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
? throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
: throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
return x // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test16() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
// FIXME: The line execution count is misleading here as it includes the
|
|
// trailing edge of the thrown error from the first branch (rdar://118654503).
|
|
func test17() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
let x = try false // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
? throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
: throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return x // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test17() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
// FIXME: The line execution count is misleading here as it includes the
|
|
// trailing edge of the thrown error from the first branch (rdar://118654503).
|
|
func test18() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
let x = try true // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
? noThrowingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
: noThrowingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return x // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test18() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
@discardableResult
|
|
func takesOptInts(_ x: Int?, _ y: Int?) -> Int { 0 }
|
|
|
|
func test19() { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
takesOptInts( // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try? throwingFn(), // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try? throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
) // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
test19() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test20(
|
|
) throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try takesOptInts( // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
throwingFn(), // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try? throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
) // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
_ = try? test20() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test21() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
throw Err() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
}() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return 1 // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test21() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test22(
|
|
) throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try takesOptInts( // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
noThrowingFn(), // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try? throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
) // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test22() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test23() -> Int? { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
guard let x = try? throwingFn() else { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return nil // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return x // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = test23() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test24() -> Int? { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
guard let x = try? noThrowingFn() else { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return nil // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return x // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = test24() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test25() -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
let x = try! noThrowingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return x // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = test25() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test26() throws -> Int {
|
|
let x = if try throwingBool() { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} else { // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
return x // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test26() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test27() throws -> Int {
|
|
let x = if try noThrowingBool() { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} else { // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
return x // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test27() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test28() throws -> Int {
|
|
let x = if try !noThrowingBool() { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} else { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
return x // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test28() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test29() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try throwingBool() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
? try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
: try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
_ = try? test29() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test30() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try noThrowingBool() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
? try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
: try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
_ = try? test30() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
// FIXME: The line execution count is misleading here (rdar://118654503).
|
|
func test31() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try !noThrowingBool() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
? try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
: try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
_ = try? test31() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test32() throws { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
if try throwingBool(), // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try throwingBool() { // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} else { // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
_ = try? test32() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test33() throws { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
if try noThrowingBool(), // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try throwingBool() { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} else { // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
_ = try? test33() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test34() throws { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
if try noThrowingBool(), // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try noThrowingBool() { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} else { // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
_ = try? test34() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test35() throws { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
if try !noThrowingBool(), // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try noThrowingBool() { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} else { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
try throwingFn() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
_ = try? test35() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test36() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
guard try throwingBool() else { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return 1 // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
return 0 // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test36() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test37() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
guard try noThrowingBool() else { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return 1 // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return 0 // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test37() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test38() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
guard try !noThrowingBool() else { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return 1 // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return 0 // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test38() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test39() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
switch try throwingBool() { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
case true: // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
return 0 // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
case false: // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
return 1 // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
_ = try? test39() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
// FIXME: The line coverage for the second case isn't great (rdar://118654503).
|
|
func test40() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
switch try noThrowingBool() { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
case true: // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return 0 // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
case false: // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return 1 // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test40() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
// FIXME: The line coverage for the first case isn't great (rdar://118654503).
|
|
func test41() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
switch try !noThrowingBool() { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
case true: // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return 0 // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
case false: // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return 1 // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test41() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
func test42() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
let x = switch try throwingBool() { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
case true: // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
0 // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
case false: // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
1 // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
return x // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test42() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
// FIXME: The line coverage for the second case isn't great (rdar://118654503).
|
|
func test43() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
let x = switch try noThrowingBool() { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
case true: // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
0 // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
case false: // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
1 // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return x // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test43() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
|
|
// FIXME: The line coverage for the first case isn't great (rdar://118654503).
|
|
func test44() throws -> Int { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
let x = switch try !noThrowingBool() { // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
case true: // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
0 // CHECK: {{ *}}[[@LINE]]|{{ *}}0
|
|
case false: // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
1 // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
return x // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
} // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|
|
_ = try? test44() // CHECK: {{ *}}[[@LINE]]|{{ *}}1
|