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.
856 lines
44 KiB
Swift
856 lines
44 KiB
Swift
// RUN: %target-swift-frontend -Xllvm -sil-full-demangle -profile-generate -profile-coverage-mapping -emit-sorted-sil -emit-sil -module-name coverage_errors %s | %FileCheck %s
|
||
// RUN: %target-swift-frontend -profile-generate -profile-coverage-mapping -emit-ir %s
|
||
|
||
struct S {
|
||
static subscript() -> Int {
|
||
get throws { 5 }
|
||
}
|
||
subscript() -> Int {
|
||
get throws { 5 }
|
||
}
|
||
func throwingMethod() throws -> Int { 0 }
|
||
}
|
||
|
||
@discardableResult
|
||
func throwingFn() throws -> Int { 0 }
|
||
|
||
func throwingBool() throws -> Bool { true }
|
||
|
||
var throwingProp: Int {
|
||
get throws { 5 }
|
||
}
|
||
|
||
var throwingS: S {
|
||
get throws { S() }
|
||
}
|
||
|
||
enum SomeErr : Error {
|
||
case Err1
|
||
case Err2
|
||
}
|
||
|
||
// Unfortunately due the sorting of the SIL, we have to write the SIL function
|
||
// checks up here.
|
||
|
||
// func test1() -> Int {
|
||
// do {
|
||
// let x = try throwingFn()
|
||
// return x
|
||
// } catch {
|
||
// return 0
|
||
// }
|
||
// }
|
||
// CHECK-LABEL: sil hidden @$s15coverage_errors5test1SiyF : $@convention(thin) () -> Int
|
||
// CHECK: bb0:
|
||
// CHECK: increment_profiler_counter 0
|
||
// CHECK: [[FN:%[0-9]+]] = function_ref @$s15coverage_errors10throwingFnSiyKF
|
||
// CHECK: try_apply [[FN]]() : $@convention(thin) () -> (Int, @error any Error), normal [[BB_NORMAL:bb[0-9]+]], error [[BB_ERR:bb[0-9]+]]
|
||
//
|
||
// CHECK: [[BB_ERR]]
|
||
// CHECK-NEXT: increment_profiler_counter 1
|
||
// FIXME: This next counter is redundant, we ought to be able to
|
||
// eliminate this with the SILOptimizer implementation.
|
||
// CHECK: increment_profiler_counter 2
|
||
|
||
// func test2() throws -> Int {
|
||
// let x = try throwingFn()
|
||
// return x
|
||
// }
|
||
// CHECK-LABEL: sil hidden @$s15coverage_errors5test2SiyKF : $@convention(thin) () -> (Int, @error any Error)
|
||
// CHECK: bb0:
|
||
// CHECK: increment_profiler_counter 0
|
||
// CHECK: [[FN:%[0-9]+]] = function_ref @$s15coverage_errors10throwingFnSiyKF
|
||
// CHECK: try_apply [[FN]]() : $@convention(thin) () -> (Int, @error any Error), normal [[BB_NORMAL:bb[0-9]+]], error [[BB_ERR:bb[0-9]+]]
|
||
//
|
||
// CHECK: [[BB_ERR]]
|
||
// CHECK-NEXT: increment_profiler_counter 1
|
||
|
||
// func test3() throws -> Int {
|
||
// let x = try throwingProp
|
||
// return x
|
||
// }
|
||
// CHECK-LABEL: sil hidden @$s15coverage_errors5test3SiyKF : $@convention(thin) () -> (Int, @error any Error)
|
||
// CHECK: bb0:
|
||
// CHECK: increment_profiler_counter 0
|
||
// CHECK: [[FN:%[0-9]+]] = function_ref @$s15coverage_errors12throwingPropSivg
|
||
// CHECK: try_apply [[FN]]() : $@convention(thin) () -> (Int, @error any Error), normal [[BB_NORMAL:bb[0-9]+]], error [[BB_ERR:bb[0-9]+]]
|
||
//
|
||
// CHECK: [[BB_ERR]]
|
||
// CHECK-NEXT: increment_profiler_counter 1
|
||
|
||
// func test4() throws -> Int {
|
||
// let x = try S[]
|
||
// return x
|
||
// }
|
||
// CHECK-LABEL: sil hidden @$s15coverage_errors5test4SiyKF : $@convention(thin) () -> (Int, @error any Error)
|
||
// CHECK: bb0:
|
||
// CHECK: increment_profiler_counter 0
|
||
// CHECK: [[FN:%[0-9]+]] = function_ref @$s15coverage_errors1SVSiycigZ
|
||
// CHECK: try_apply [[FN]]({{%[0-9]+}}) : $@convention(method) (@thin S.Type) -> (Int, @error any Error), normal [[BB_NORMAL:bb[0-9]+]], error [[BB_ERR:bb[0-9]+]]
|
||
//
|
||
// CHECK: [[BB_ERR]]
|
||
// CHECK-NEXT: increment_profiler_counter 1
|
||
|
||
// func test17(
|
||
// _ x: S
|
||
// ) throws -> Int {
|
||
// let y = try x[]
|
||
// return y
|
||
// }
|
||
// CHECK-LABEL: sil hidden @$s15coverage_errors6test17ySiAA1SVKF : $@convention(thin) (S) -> (Int, @error any Error)
|
||
// CHECK: bb0(%0 : $S):
|
||
// CHECK: increment_profiler_counter 0
|
||
// CHECK: [[FN:%[0-9]+]] = function_ref @$s15coverage_errors1SVSiycig
|
||
// CHECK: try_apply [[FN]](%0) : $@convention(method) (S) -> (Int, @error any Error), normal [[BB_NORMAL:bb[0-9]+]], error [[BB_ERR:bb[0-9]+]]
|
||
//
|
||
// CHECK: [[BB_ERR]]
|
||
// CHECK-NEXT: increment_profiler_counter 1
|
||
|
||
// func test18(
|
||
// _ x: S
|
||
// ) throws -> Int {
|
||
// let y = try x.throwingMethod()
|
||
// return y
|
||
// }
|
||
// CHECK-LABEL: sil hidden @$s15coverage_errors6test18ySiAA1SVKF : $@convention(thin) (S) -> (Int, @error any Error)
|
||
// CHECK: bb0(%0 : $S):
|
||
// CHECK: increment_profiler_counter 0
|
||
// CHECK: [[FN:%[0-9]+]] = function_ref @$s15coverage_errors1SV14throwingMethodSiyKF
|
||
// CHECK: try_apply [[FN]](%0) : $@convention(method) (S) -> (Int, @error any Error), normal [[BB_NORMAL:bb[0-9]+]], error [[BB_ERR:bb[0-9]+]]
|
||
//
|
||
// CHECK: [[BB_ERR]]
|
||
// CHECK-NEXT: increment_profiler_counter 1
|
||
|
||
// func test19() throws -> Int {
|
||
// let x = try throwingS.throwingMethod()
|
||
// return x
|
||
// }
|
||
// CHECK-LABEL: sil hidden @$s15coverage_errors6test19SiyKF : $@convention(thin) () -> (Int, @error any Error)
|
||
// CHECK: bb0:
|
||
// CHECK: increment_profiler_counter 0
|
||
// CHECK: [[GETTER:%[0-9]+]] = function_ref @$s15coverage_errors9throwingSAA1SVvg
|
||
// CHECK: try_apply [[GETTER]]() : $@convention(thin) () -> (S, @error any Error), normal [[BB_NORMAL:bb[0-9]+]], error [[BB_ERR:bb[0-9]+]]
|
||
//
|
||
// CHECK: [[BB_ERR]]
|
||
// CHECK-NEXT: increment_profiler_counter 1
|
||
// CHECK: [[BB_NORMAL]]([[S:%[0-9]+]] : $S):
|
||
// CHECK: [[FN:%[0-9]+]] = function_ref @$s15coverage_errors1SV14throwingMethodSiyKF
|
||
// CHECK: try_apply [[FN]]([[S]]) : $@convention(method) (S) -> (Int, @error any Error), normal [[BB_NORMAL:bb[0-9]+]], error [[BB_ERR:bb[0-9]+]]
|
||
//
|
||
// CHECK: [[BB_ERR]]
|
||
// CHECK-NEXT: increment_profiler_counter 2
|
||
|
||
// func test21() throws -> Int {
|
||
// try { throw SomeErr.Err1 }()
|
||
// return 1
|
||
// }
|
||
// CHECK-LABEL: sil hidden @$s15coverage_errors6test21SiyKF : $@convention(thin) () -> (Int, @error any Error)
|
||
// CHECK: bb0:
|
||
// CHECK: increment_profiler_counter 0
|
||
// CHECK: [[FN:%[0-9]+]] = function_ref @$s15coverage_errors6test21SiyKFyyKXEfU_
|
||
// CHECK: try_apply [[FN]]() : $@convention(thin) () -> @error any Error, normal [[BB_NORMAL:bb[0-9]+]], error [[BB_ERR:bb[0-9]+]]
|
||
//
|
||
// CHECK: [[BB_ERR]]
|
||
// CHECK-NEXT: increment_profiler_counter 1
|
||
|
||
// func test28() throws -> Int {
|
||
// let x = try .random()
|
||
// ? throwingFn()
|
||
// : throwingFn()
|
||
// return x
|
||
// }
|
||
// CHECK-LABEL: sil hidden @$s15coverage_errors6test28SiyKF : $@convention(thin) () -> (Int, @error any Error)
|
||
// CHECK: bb0:
|
||
// CHECK: increment_profiler_counter 0
|
||
// CHECK: function_ref @$sSb6randomSbyFZ
|
||
// CHECK: cond_br {{%[0-9]+}}, [[BB_TRUE:bb[0-9]+]], [[BB_FALSE:bb[0-9]+]]
|
||
//
|
||
// CHECK: [[BB_FALSE]]
|
||
// CHECK: [[THROW_FN:%[0-9]+]] = function_ref @$s15coverage_errors10throwingFnSiyKF
|
||
// CHECK: try_apply [[THROW_FN]]() : $@convention(thin) () -> (Int, @error any Error), normal [[BB_NORMAL:bb[0-9]+]], error [[BB_ERR:bb[0-9]+]]
|
||
//
|
||
// CHECK: [[BB_ERR]]
|
||
// CHECK: increment_profiler_counter 3
|
||
//
|
||
// CHECK: [[BB_TRUE]]
|
||
// CHECK: increment_profiler_counter 1
|
||
// CHECK: [[THROW_FN:%[0-9]+]] = function_ref @$s15coverage_errors10throwingFnSiyKF
|
||
// CHECK: try_apply [[THROW_FN]]() : $@convention(thin) () -> (Int, @error any Error), normal [[BB_NORMAL:bb[0-9]+]], error [[BB_ERR:bb[0-9]+]]
|
||
//
|
||
// CHECK: [[BB_ERR]]
|
||
// CHECK: increment_profiler_counter 2
|
||
|
||
// func test43() -> Int? {
|
||
// let x = try? throwingS.throwingMethod()
|
||
// return x
|
||
// }
|
||
// CHECK-LABEL: sil hidden @$s15coverage_errors6test43SiSgyF : $@convention(thin) () -> Optional<Int>
|
||
// CHECK: bb0:
|
||
// CHECK: increment_profiler_counter 0
|
||
// CHECK: [[GETTER:%[0-9]+]] = function_ref @$s15coverage_errors9throwingSAA1SVvg : $@convention(thin) () -> (S, @error any Error)
|
||
// CHECK: try_apply [[GETTER]]() : $@convention(thin) () -> (S, @error any Error), normal [[BB_NORMAL:bb[0-9]+]], error [[BB_ERR:bb[0-9]+]]
|
||
//
|
||
// CHECK: [[BB_ERR]]
|
||
// CHECK: increment_profiler_counter 1
|
||
//
|
||
// CHECK: [[BB_NORMAL]]
|
||
// CHECK: [[METHOD:%[0-9]+]] = function_ref @$s15coverage_errors1SV14throwingMethodSiyKF : $@convention(method) (S) -> (Int, @error any Error) // user: %5
|
||
// CHECK: try_apply [[METHOD]]({{%[0-9]+}}) : $@convention(method) (S) -> (Int, @error any Error), normal [[BB_NORMAL:bb[0-9]+]], error [[BB_ERR:bb[0-9]+]]
|
||
//
|
||
// CHECK: [[BB_ERR]]
|
||
// CHECK: increment_profiler_counter 2
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors5test1SiyF"
|
||
func test1() -> Int { // CHECK-NEXT: [[@LINE]]:21 -> [[@LINE+7]]:2 : 0
|
||
do { // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE+3]]:4 : 0
|
||
let x = try throwingFn() // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+1]]:13 : (0 - 1)
|
||
return x
|
||
} catch { // CHECK-NEXT: [[@LINE]]:11 -> [[@LINE+2]]:4 : 2
|
||
return 0
|
||
}
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors5test2SiyKF"
|
||
func test2() throws -> Int { // CHECK-NEXT: [[@LINE]]:28 -> [[@LINE+3]]:2 : 0
|
||
let x = try throwingFn() // CHECK-NEXT: [[@LINE]]:27 -> [[@LINE+1]]:11 : (0 - 1)
|
||
return x
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors5test3SiyKF"
|
||
func test3() throws -> Int { // CHECK-NEXT: [[@LINE]]:28 -> [[@LINE+3]]:2 : 0
|
||
let x = try throwingProp // CHECK-NEXT: [[@LINE]]:27 -> [[@LINE+1]]:11 : (0 - 1)
|
||
return x
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors5test4SiyKF"
|
||
func test4() throws -> Int { // CHECK-NEXT: [[@LINE]]:28 -> [[@LINE+3]]:2 : 0
|
||
let x = try S[] // CHECK-NEXT: [[@LINE]]:18 -> [[@LINE+1]]:11 : (0 - 1)
|
||
return x
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors5test5yyKF"
|
||
func test5() throws {
|
||
// CHECK-NEXT: [[@LINE-1]]:21 -> [[@LINE+2]]:2 : 0
|
||
throw SomeErr.Err2
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors5test6yyyyKXEKF"
|
||
func test6(
|
||
_ fn: () throws -> ()
|
||
) rethrows { // CHECK-NEXT: [[@LINE]]:12 -> [[@LINE+8]]:2 : 0
|
||
do { // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE+2]]:4 : 0
|
||
try fn() // CHECK-NEXT: [[@LINE]]:13 -> [[@LINE+1]]:4 : (0 - 1)
|
||
} catch SomeErr.Err1 { // CHECK-NEXT: [[@LINE]]:24 -> [[@LINE+2]]:4 : 2
|
||
return
|
||
} // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+3]]:2 : (0 - 1)
|
||
|
||
try fn() // CHECK-NEXT: [[@LINE]]:11 -> [[@LINE+1]]:2 : ((0 - 1) - 3)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors5test7s5Int32VyF"
|
||
func test7() -> Int32 { // CHECK-NEXT: [[@LINE]]:23 -> [[@LINE+31]]:2 : 0
|
||
var x : Int32 = 0
|
||
|
||
do { // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE+3]]:4 : 0
|
||
throw SomeErr.Err1
|
||
x += 2 // CHECK-NEXT: [[@LINE]]:5 -> [[@LINE+1]]:4 : zero
|
||
} catch SomeErr.Err1 { // CHECK-NEXT: [[@LINE]]:24 -> [[@LINE+1]]:4 : 1
|
||
} catch _ { // CHECK-NEXT: [[@LINE]]:13 -> [[@LINE+1]]:4 : 2
|
||
} // CHECK-NEXT: [[@LINE]]:4 -> {{[0-9:]+}} : (1 + 2)
|
||
|
||
do { // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE+2]]:4 : (1 + 2)
|
||
try test6(test5) // CHECK-NEXT: [[@LINE]]:21 -> [[@LINE+1]]:4 : ((1 + 2) - 3)
|
||
} catch _ { // CHECK-NEXT: [[@LINE]]:13 -> [[@LINE+1]]:4 : 4
|
||
} // CHECK-NEXT: [[@LINE]]:4 -> {{[0-9:]+}} : (((1 + 2) + 4) - 3)
|
||
|
||
do { // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE+5]]:4 : (((1 + 2) + 4) - 3)
|
||
try test6 { // (closures are mapped separately)
|
||
() throws -> () in
|
||
throw SomeErr.Err1
|
||
} // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE+1]]:4 : ((((1 + 2) + 4) - 3) - 5)
|
||
} catch _ {} // CHECK-NEXT: [[@LINE]]:13 -> [[@LINE]]:15 : 6
|
||
// CHECK-NEXT: [[@LINE-1]]:15 -> {{[0-9:]+}} : (((((1 + 2) + 4) + 6) - 3) - 5)
|
||
|
||
// TODO: We ought to realize that everything after try! is unreachable
|
||
// This is similar issue to rdar://100896177
|
||
try! test6 {
|
||
() throws -> () in
|
||
return
|
||
} // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+2]]:11 : ((((((1 + 2) + 4) + 6) - 3) - 5) - 7
|
||
|
||
return x
|
||
} // CHECK-NEXT: }
|
||
|
||
// rdar://34244637 - Coverage after a do-catch is incorrect
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors5test8ySiSbF"
|
||
func test8(_ b: Bool) -> Int { // CHECK-NEXT: [[@LINE]]:30 {{.*}} : 0
|
||
do { // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE+2]]:4 : 0
|
||
throw SomeErr.Err1
|
||
} catch { // CHECK-NEXT: [[@LINE]]:11 {{.*}} : 1
|
||
// CHECK-NEXT: [[@LINE+1]]:8 {{.*}} : 1
|
||
if b { // CHECK-NEXT: [[@LINE]]:10 {{.*}} : 2
|
||
return 1
|
||
} // CHECK-NEXT: [[@LINE]]:6 {{.*}} : (1 - 2)
|
||
} // CHECK: [[@LINE]]:4 {{.*}} : (1 - 2)
|
||
return 0
|
||
}
|
||
|
||
// Test coverage with nested do-catches
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors5test9SiyF"
|
||
func test9() -> Int { // CHECK-NEXT: [[@LINE]]:21 -> [[@LINE+11]]:2 : 0
|
||
do { // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE+7]]:4 : 0
|
||
try test5() // CHECK-NEXT: [[@LINE]]:16 -> [[@LINE+6]]:4 : (0 - 1)
|
||
do { // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE+2]]:6 : (0 - 1)
|
||
throw SomeErr.Err1
|
||
} catch { // CHECK-NEXT: [[@LINE]]:13 -> [[@LINE+2]]:6 : 2
|
||
return 0
|
||
}
|
||
} catch { // CHECK-NEXT: [[@LINE]]:11 -> [[@LINE+2]]:4 : 3
|
||
return 1
|
||
}
|
||
} // CHECK-NEXT: }
|
||
|
||
// Test coverage with a do-catch inside of a repeat-while
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test10SiyF"
|
||
func test10() -> Int {
|
||
repeat { // CHECK: [[@LINE]]:10 {{.*}} : 1
|
||
do {
|
||
throw SomeErr.Err1
|
||
} catch { // CHECK: [[@LINE]]:13 {{.*}} : 2
|
||
return 0
|
||
} // CHECK-NOT: [[@LINE]]:6 ->
|
||
|
||
} while false // CHECK: [[@LINE]]:11 {{.*}} : (1 - 2)
|
||
return 1
|
||
}
|
||
|
||
// Test coverage with a break inside a do-catch inside of a repeat-while
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test11SiyF"
|
||
func test11() -> Int { // CHECK-NEXT: [[@LINE]]:22 -> [[@LINE+11]]:2 : 0
|
||
repeat { // CHECK-NEXT: [[@LINE]]:10 -> [[@LINE+8]]:4 : 1
|
||
do { // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE+2]]:6 : 1
|
||
try test5() // CHECK-NEXT: [[@LINE]]:18 -> [[@LINE+1]]:6 : (1 - 2)
|
||
} catch { // CHECK-NEXT: [[@LINE]]:13 -> [[@LINE+2]]:6 : 3
|
||
break
|
||
} // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE+3]]:4 : (1 - 2)
|
||
// FIXME: This exit counter is wrong (rdar://118472537)
|
||
// CHECK-NEXT: [[@LINE+1]]:4 -> [[@LINE+2]]:11 : (0 - 2)
|
||
} while false // CHECK-NEXT: [[@LINE]]:11 -> [[@LINE]]:16 : (1 - 3)
|
||
return 1
|
||
} // CHECK-NEXT: }
|
||
|
||
// rdar://41010883 – Make sure we don't introduce an empty unreachable region.
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test12SiyKF"
|
||
func test12() throws -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+7]]:2 : 0
|
||
do { // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE+3]]:4 : 0
|
||
try test5() // CHECK-NEXT: [[@LINE]]:16 -> [[@LINE+1]]:13 : (0 - 1)
|
||
return 1
|
||
} catch is SomeErr { // CHECK-NEXT: [[@LINE]]:22 -> [[@LINE+2]]:4 : 2
|
||
throw SomeErr.Err1
|
||
}
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test13SiyF"
|
||
func test13() -> Int { // CHECK-NEXT: [[@LINE]]:22 -> [[@LINE+6]]:2 : 0
|
||
do { // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE+2]]:4 : 0
|
||
return try throwingFn() // Note we don't emit a region here because it would be empty.
|
||
} catch { // CHECK-NEXT: [[@LINE]]:11 -> [[@LINE+2]]:4 : 2
|
||
return 0
|
||
}
|
||
} // CHECK-NEXT: }
|
||
|
||
func takesInts(_ x: Int, _ y: Int) {}
|
||
|
||
// The throwing expr is nested here, the region starts after the throwing expr.
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test14yyKF"
|
||
func test14() throws { // CHECK-NEXT: [[@LINE]]:22 -> [[@LINE+2]]:2 : 0
|
||
takesInts(try throwingFn(), 0) // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+1]]:2 : (0 - 1)
|
||
} // CHECK-NEXT: }
|
||
|
||
// The return can be reached via the catch if SomeErr.Err1 was thrown, OR the
|
||
// 'do' block if an error wasn't thrown.
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test15SiyKF"
|
||
func test15() throws -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+6]]:2 : 0
|
||
do { // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE+2]]:4 : 0
|
||
try test5() // CHECK-NEXT: [[@LINE]]:16 -> [[@LINE+1]]:4 : (0 - 1)
|
||
} catch SomeErr.Err1 { // CHECK-NEXT: [[@LINE]]:24 -> [[@LINE+1]]:4 : 2
|
||
} // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+1]]:11 : ((0 + 2) - 1)
|
||
return 2
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test16SiyKF"
|
||
func test16() throws -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+9]]:2 : 0
|
||
do { // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE+5]]:4 : 0
|
||
do { // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE+2]]:6 : 0
|
||
try test5() // CHECK-NEXT: [[@LINE]]:18 -> [[@LINE+1]]:6 : (0 - 1)
|
||
} catch SomeErr.Err1 { // CHECK-NEXT: [[@LINE]]:26 -> [[@LINE+1]]:6 : 2
|
||
} // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE+1]]:4 : ((0 + 2) - 1)
|
||
} catch SomeErr.Err2 { // CHECK-NEXT: [[@LINE]]:24 -> [[@LINE+1]]:4 : 3
|
||
} // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+1]]:11 : (((0 + 2) + 3) - 1)
|
||
return 2
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test17ySiAA1SVKF"
|
||
func test17(
|
||
_ x: S
|
||
) throws -> Int { // CHECK-NEXT: [[@LINE]]:17 -> [[@LINE+3]]:2 : 0
|
||
let y = try x[] // CHECK-NEXT: [[@LINE]]:18 -> [[@LINE+1]]:11 : (0 - 1)
|
||
return y
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test18ySiAA1SVKF"
|
||
func test18(
|
||
_ x: S
|
||
) throws -> Int { // CHECK-NEXT: [[@LINE]]:17 -> [[@LINE+3]]:2 : 0
|
||
let y = try x.throwingMethod() // CHECK-NEXT: [[@LINE]]:33 -> [[@LINE+1]]:11 : (0 - 1)
|
||
return y
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test19SiyKF"
|
||
func test19() throws -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+3]]:2 : 0
|
||
let x = try throwingS.throwingMethod() // CHECK-NEXT: [[@LINE]]:24 -> [[@LINE+1]]:11 : (0 - 1)
|
||
return x // CHECK-NEXT: [[@LINE-1]]:41 -> [[@LINE]]:11 : ((0 - 1) - 2)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test20yyKF"
|
||
func test20() throws { // CHECK-NEXT: [[@LINE]]:22 -> [[@LINE+5]]:2 : 0
|
||
takesInts(
|
||
try throwingFn(), // CHECK-NEXT: [[@LINE]]:21 -> [[@LINE+3]]:2 : (0 - 1)
|
||
try throwingFn() // CHECK-NEXT: [[@LINE]]:21 -> [[@LINE+2]]:2 : ((0 - 1) - 2)
|
||
)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test21SiyKF"
|
||
func test21() throws -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+3]]:2 : 0
|
||
try { throw SomeErr.Err1 }() // CHECK-NEXT: [[@LINE]]:31 -> [[@LINE+1]]:11 : (0 - 1)
|
||
return 1
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test22SiyKF"
|
||
func test22() throws -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+7]]:2 : 0
|
||
x: do { // CHECK-NEXT: [[@LINE]]:9 -> [[@LINE+2]]:4 : 0
|
||
try test5() // CHECK-NEXT: [[@LINE]]:16 -> [[@LINE+1]]:4 : (0 - 1)
|
||
} catch SomeErr.Err1 { // CHECK-NEXT: [[@LINE]]:24 -> [[@LINE+2]]:4 : 2
|
||
break x
|
||
} // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+1]]:11 : ((0 + 2) - 1)
|
||
return 1 // CHECK-NEXT: }
|
||
}
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test23SiyKF"
|
||
func test23() throws -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+11]]:2 : 0
|
||
x: do { // CHECK-NEXT: [[@LINE]]:9 -> [[@LINE+7]]:4 : 0
|
||
do { // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE+3]]:6 : 0
|
||
try test5() // CHECK-NEXT: [[@LINE]]:18 -> [[@LINE+1]]:14 : (0 - 1)
|
||
break x
|
||
} catch SomeErr.Err1 { // CHECK-NEXT: [[@LINE]]:26 -> [[@LINE+1]]:6 : 2
|
||
} // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE+1]]:13 : 2
|
||
return 1
|
||
} catch SomeErr.Err2 { // CHECK-NEXT: [[@LINE]]:24 -> [[@LINE+1]]:4 : 3
|
||
} // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+1]]:11 : ((0 + 3) - 1)
|
||
return 2
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test24SiyKF"
|
||
func test24() throws -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+4]]:2 : 0
|
||
let x = .random() ? try throwingFn() : 0 // CHECK-NEXT: [[@LINE]]:23 -> [[@LINE]]:39 : 1
|
||
return x // CHECK-NEXT: [[@LINE-1]]:39 -> [[@LINE]]:11 : (0 - 2)
|
||
// CHECK-NEXT: [[@LINE-2]]:42 -> [[@LINE-2]]:43 : (0 - 1)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test25SiyKF"
|
||
func test25() throws -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+4]]:2 : 0
|
||
let x = .random() ? 0 : try throwingFn() // CHECK-NEXT: [[@LINE]]:23 -> [[@LINE]]:24 : 1
|
||
return x // CHECK-NEXT: [[@LINE-1]]:27 -> [[@LINE-1]]:43 : (0 - 1)
|
||
// CHECK-NEXT: [[@LINE-2]]:43 -> [[@LINE-1]]:11 : (0 - 2)
|
||
} // CHECK-NEXT: }
|
||
|
||
// Note in this case the throws region of the first branch overlaps the
|
||
// second branch, which isn't ideal, but it matches what we already do
|
||
// for e.g if statements and returns, and doesn't impact the resulting
|
||
// coverage since we always take the counter for the smallest subrange,
|
||
// which in this case is the region for the second branch.
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test26SiyKF"
|
||
func test26() throws -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+5]]:2 : 0
|
||
let x = .random() ? try throwingFn() : try throwingFn() // CHECK-NEXT: [[@LINE]]:23 -> [[@LINE]]:39 : 1
|
||
return x // CHECK-NEXT: [[@LINE-1]]:39 -> [[@LINE]]:11 : (0 - 2)
|
||
// CHECK-NEXT: [[@LINE-2]]:42 -> [[@LINE-2]]:58 : (0 - 1)
|
||
// CHECK-NEXT: [[@LINE-3]]:58 -> [[@LINE-2]]:11 : ((0 - 2) - 3)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test27SiyKF"
|
||
func test27() throws -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+5]]:2 : 0
|
||
let x = try .random() ? throwingFn() : throwingFn() // CHECK-NEXT: [[@LINE]]:27 -> [[@LINE]]:39 : 1
|
||
return x // CHECK-NEXT: [[@LINE-1]]:39 -> [[@LINE]]:11 : (0 - 2)
|
||
// CHECK-NEXT: [[@LINE-2]]:42 -> [[@LINE-2]]:54 : (0 - 1)
|
||
// CHECK-NEXT: [[@LINE-3]]:54 -> [[@LINE-2]]:11 : ((0 - 2) - 3)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test28SiyKF"
|
||
func test28() throws -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+5]]:2 : 0
|
||
let x = try .random() // CHECK-NEXT: [[@LINE+1]]:7 -> [[@LINE+1]]:19 : 1
|
||
? throwingFn() // CHECK-NEXT: [[@LINE]]:19 -> [[@LINE+2]]:11 : (0 - 2)
|
||
: throwingFn() // CHECK-NEXT: [[@LINE]]:7 -> [[@LINE]]:19 : (0 - 1)
|
||
return x // CHECK-NEXT: [[@LINE-1]]:19 -> [[@LINE]]:11 : ((0 - 2) - 3)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test29Si_SityKF"
|
||
func test29() throws -> (Int, Int) { // CHECK-NEXT: [[@LINE]]:36 -> [[@LINE+7]]:2 : 0
|
||
let x = try .random() // CHECK-NEXT: [[@LINE+1]]:7 -> [[@LINE+1]]:24 : 1
|
||
? (throwingFn(), 0) // CHECK-NEXT: [[@LINE]]:20 -> [[@LINE]]:24 : (1 - 2)
|
||
: (0, throwingFn()) // CHECK-NEXT: [[@LINE-1]]:24 -> [[@LINE+1]]:11 : (0 - 2)
|
||
return x // CHECK-NEXT: [[@LINE-1]]:7 -> [[@LINE-1]]:24 : (0 - 1)
|
||
// CHECK-NEXT: [[@LINE-2]]:23 -> [[@LINE-2]]:24 : ((0 - 1) - 3)
|
||
// CHECK-NEXT: [[@LINE-3]]:24 -> [[@LINE-2]]:11 : ((0 - 2) - 3)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test30Si_SityKF"
|
||
func test30() throws -> (Int, Int) { // CHECK-NEXT: [[@LINE]]:36 -> [[@LINE+6]]:2 : 0
|
||
let x = try .random() // CHECK-NEXT: [[@LINE+1]]:7 -> [[@LINE+1]]:35 : 1
|
||
? (throwingFn(), throwingFn()) // CHECK-NEXT: [[@LINE]]:20 -> [[@LINE]]:35 : (1 - 2)
|
||
: (0, 0) // CHECK-NEXT: [[@LINE-1]]:34 -> [[@LINE-1]]:35 : ((1 - 2) - 3)
|
||
return x // CHECK-NEXT: [[@LINE-2]]:35 -> [[@LINE]]:11 : ((0 - 2) - 3)
|
||
// CHECK-NEXT: [[@LINE-2]]:7 -> [[@LINE-2]]:13 : (0 - 1)
|
||
} // CHECK-NEXT: }
|
||
|
||
@discardableResult
|
||
func takesOptInts(_ x: Int?, _ y: Int?) -> Int { 0 }
|
||
|
||
// `throwingFn` is within a `try?`, so the non-error branch is empty.
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test31yyF"
|
||
func test31() { // CHECK-NEXT: [[@LINE]]:15 -> [[@LINE+2]]:2 : 0
|
||
takesOptInts(try? throwingFn(), 0)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test32yyF"
|
||
func test32() { // CHECK-NEXT: [[@LINE]]:15 -> [[@LINE+5]]:2 : 0
|
||
takesOptInts(
|
||
try? throwingFn(),
|
||
try? throwingFn()
|
||
)
|
||
} // CHECK-NEXT: }
|
||
|
||
// Here the throws region extends into the second arg.
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test33SiSgyF"
|
||
func test33() -> Int? { // CHECK-NEXT: [[@LINE]]:23 -> [[@LINE+2]]:2 : 0
|
||
try? takesOptInts(throwingFn(), 0) // CHECK-NEXT: [[@LINE]]:33 -> [[@LINE]]:37 : (0 - 1)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test34SiSgyF"
|
||
func test34() -> Int? { // CHECK-NEXT: [[@LINE]]:23 -> [[@LINE+3]]:2 : 0
|
||
try? takesOptInts(throwingFn(), throwingFn()) // CHECK-NEXT: [[@LINE]]:33 -> [[@LINE]]:48 : (0 - 1)
|
||
// CHECK-NEXT: [[@LINE-1]]:47 -> [[@LINE-1]]:48 : ((0 - 1) - 2)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test35SiSgyF"
|
||
func test35() -> Int? { // CHECK-NEXT: [[@LINE]]:23 -> [[@LINE+5]]:2 : 0
|
||
try? takesOptInts(
|
||
throwingFn(), // CHECK-NEXT: [[@LINE]]:17 -> [[@LINE+2]]:4 : (0 - 1)
|
||
throwingFn() // CHECK-NEXT: [[@LINE]]:17 -> [[@LINE+1]]:4 : ((0 - 1) - 2)
|
||
)
|
||
} // CHECK-NEXT: }
|
||
|
||
// The 'try's here are redundant.
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test36SiSgyF"
|
||
func test36() -> Int? { // CHECK-NEXT: [[@LINE]]:23 -> [[@LINE+5]]:2 : 0
|
||
try? takesOptInts(
|
||
try throwingFn(), // CHECK-NEXT: [[@LINE]]:21 -> [[@LINE+2]]:4 : (0 - 1)
|
||
try throwingFn() // CHECK-NEXT: [[@LINE]]:21 -> [[@LINE+1]]:4 : ((0 - 1) - 2)
|
||
)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test37SiSgyF"
|
||
func test37() -> Int? { // CHECK-NEXT: [[@LINE]]:23 -> [[@LINE+5]]:2 : 0
|
||
try? takesOptInts(
|
||
try throwingFn(), // CHECK-NEXT: [[@LINE]]:21 -> [[@LINE+2]]:4 : (0 - 1)
|
||
try? S[]
|
||
)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test38SiSgyF"
|
||
func test38() -> Int? { // CHECK-NEXT: [[@LINE]]:23 -> [[@LINE+5]]:2 : 0
|
||
try? takesOptInts(
|
||
try? throwingFn(),
|
||
try S[] // CHECK-NEXT: [[@LINE]]:12 -> [[@LINE+1]]:4 : (0 - 2)
|
||
)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test39Si_SitSgyF"
|
||
func test39(
|
||
) -> (Int, Int)? { // CHECK-NEXT: [[@LINE]]:18 -> [[@LINE+5]]:2 : 0
|
||
try? (takesOptInts(
|
||
throwingFn(), // CHECK-NEXT: [[@LINE]]:17 -> [[@LINE+2]]:8 : (0 - 1)
|
||
try? throwingProp
|
||
), 0)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test40SiyKF"
|
||
func test40(
|
||
) throws -> Int { // CHECK-NEXT: [[@LINE]]:17 -> [[@LINE+5]]:2 : 0
|
||
try takesOptInts(
|
||
try? throwingFn(),
|
||
throwingProp // CHECK-NEXT: [[@LINE]]:17 -> [[@LINE+2]]:2 : (0 - 2)
|
||
)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test41SiyKF"
|
||
func test41(
|
||
) throws -> Int { // CHECK-NEXT: [[@LINE]]:17 -> [[@LINE+5]]:2 : 0
|
||
try takesOptInts(
|
||
throwingFn(), // CHECK-NEXT: [[@LINE]]:17 -> [[@LINE+3]]:2 : (0 - 1)
|
||
try? throwingFn()
|
||
)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test42SiSgyF"
|
||
func test42() -> Int? { // CHECK-NEXT: [[@LINE]]:23 -> [[@LINE+5]]:2 : 0
|
||
guard let x = try? throwingFn() else { // CHECK-NEXT: [[@LINE]]:40 -> [[@LINE+2]]:4 : 1
|
||
return nil
|
||
} // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+1]]:11 : (0 - 1)
|
||
return x
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test43SiSgyF"
|
||
func test43() -> Int? { // CHECK-NEXT: [[@LINE]]:23 -> [[@LINE+3]]:2 : 0
|
||
let x = try? throwingS.throwingMethod() // CHECK-NEXT: [[@LINE]]:25 -> [[@LINE]]:42 : (0 - 1)
|
||
return x
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test44SiSgyKF"
|
||
func test44() throws -> Int? { // CHECK-NEXT: [[@LINE]]:30 -> [[@LINE+3]]:2 : 0
|
||
let x = try (try? throwingS)?.throwingMethod() // CHECK-NEXT: [[@LINE]]:49 -> [[@LINE+1]]:11 : (0 - 2)
|
||
return x
|
||
}
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test45yyF"
|
||
func test45() { // CHECK-NEXT: [[@LINE]]:15 -> [[@LINE+2]]:2 : 0
|
||
_ = try? { throw SomeErr.Err1 }()
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test45yyFyyKXEfU_"
|
||
// CHECK-NEXT: [[@LINE-4]]:12 -> [[@LINE-4]]:34 : 0
|
||
// CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test46Si_SitSgyF"
|
||
func test46() -> (Int, Int)? { // CHECK-NEXT: [[@LINE]]:30 -> [[@LINE+2]]:2 : 0
|
||
try? ({ throw SomeErr.Err1 }(), 0) // CHECK-NEXT: [[@LINE]]:33 -> [[@LINE]]:37 : (0 - 1)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test47yyKF"
|
||
func test47() throws { // CHECK-NEXT: [[@LINE]]:22 -> [[@LINE+2]]:2 : 0
|
||
try throwingFn() // CHECK-NEXT: [[@LINE]]:19 -> [[@LINE+1]]:2 : (0 - 1)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test48SiyKF"
|
||
func test48() throws -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+5]]:2 : 0
|
||
try throwingBool() // CHECK-NEXT: [[@LINE]]:21 -> [[@LINE+4]]:2 : (0 - 2)
|
||
? try throwingFn() // CHECK-NEXT: [[@LINE]]:7 -> [[@LINE]]:23 : 1
|
||
: 1 // CHECK-NEXT: [[@LINE-1]]:23 -> [[@LINE+2]]:2 : ((0 - 2) - 3)
|
||
// CHECK-NEXT: [[@LINE-1]]:7 -> [[@LINE-1]]:8 : ((0 - 1) - 2)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test49SiyKF"
|
||
func test49() throws -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+6]]:2 : 0
|
||
try throwingBool() // CHECK-NEXT: [[@LINE]]:21 -> [[@LINE+5]]:2 : (0 - 2)
|
||
? try throwingFn() // CHECK-NEXT: [[@LINE]]:7 -> [[@LINE]]:23 : 1
|
||
: try throwingFn() // CHECK-NEXT: [[@LINE-1]]:23 -> [[@LINE+3]]:2 : ((0 - 2) - 3)
|
||
// CHECK-NEXT: [[@LINE-1]]:7 -> [[@LINE-1]]:23 : ((0 - 1) - 2)
|
||
// CHECK-NEXT: [[@LINE-2]]:23 -> [[@LINE+1]]:2 : (((0 - 2) - 3) - 4)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test50SiyKF"
|
||
func test50() throws -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+8]]:2 : 0
|
||
let x = if try throwingBool() { // CHECK-NEXT: [[@LINE]]:14 -> [[@LINE]]:32 : 0
|
||
try throwingFn() // CHECK-NEXT: [[@LINE-1]]:32 -> [[@LINE+4]]:11 : (0 - 2)
|
||
} else { // CHECK-NEXT: [[@LINE-2]]:33 -> [[@LINE]]:4 : 1
|
||
1 // CHECK-NEXT: [[@LINE-2]]:21 -> [[@LINE-1]]:4 : (1 - 3)
|
||
} // CHECK-NEXT: [[@LINE-2]]:4 -> [[@LINE+1]]:11 : ((0 - 2) - 3)
|
||
return x // CHECK-NEXT: [[@LINE-3]]:10 -> [[@LINE-1]]:4 : ((0 - 1) - 2)
|
||
// CHECK-NEXT: [[@LINE-2]]:4 -> [[@LINE-1]]:11 : ((0 - 2) - 3)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test51SiyKF"
|
||
func test51() throws -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+9]]:2 : 0
|
||
let x = if try throwingBool() { // CHECK-NEXT: [[@LINE]]:14 -> [[@LINE]]:32 : 0
|
||
try throwingFn() // CHECK-NEXT: [[@LINE-1]]:32 -> [[@LINE+4]]:11 : (0 - 2)
|
||
} else { // CHECK-NEXT: [[@LINE-2]]:33 -> [[@LINE]]:4 : 1
|
||
try throwingFn() // CHECK-NEXT: [[@LINE-2]]:21 -> [[@LINE-1]]:4 : (1 - 3)
|
||
} // CHECK-NEXT: [[@LINE-2]]:4 -> [[@LINE+1]]:11 : ((0 - 2) - 3)
|
||
return x // CHECK-NEXT: [[@LINE-3]]:10 -> [[@LINE-1]]:4 : ((0 - 1) - 2)
|
||
// CHECK-NEXT: [[@LINE-3]]:21 -> [[@LINE-2]]:4 : (((0 - 1) - 2) - 4)
|
||
// CHECK-NEXT: [[@LINE-3]]:4 -> [[@LINE-2]]:11 : (((0 - 2) - 3) - 4)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test52SiyKF"
|
||
func test52() throws -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+10]]:2 : 0
|
||
let x = if try throwingBool(), // CHECK-NEXT: [[@LINE]]:14 -> [[@LINE]]:32 : 0
|
||
try throwingBool() { // CHECK-NEXT: [[@LINE-1]]:32 -> [[@LINE+5]]:11 : (0 - 2)
|
||
try throwingFn() // CHECK-NEXT: [[@LINE-1]]:32 -> [[@LINE+4]]:11 : ((0 - 2) - 3)
|
||
} else { // CHECK-NEXT: [[@LINE-2]]:33 -> [[@LINE]]:4 : 1
|
||
try throwingFn() // CHECK-NEXT: [[@LINE-2]]:21 -> [[@LINE-1]]:4 : (1 - 4)
|
||
} // CHECK-NEXT: [[@LINE-2]]:4 -> [[@LINE+1]]:11 : (((0 - 2) - 3) - 4)
|
||
return x // CHECK-NEXT: [[@LINE-3]]:10 -> [[@LINE-1]]:4 : (((0 - 1) - 2) - 3)
|
||
// CHECK-NEXT: [[@LINE-3]]:21 -> [[@LINE-2]]:4 : ((((0 - 1) - 2) - 3) - 5)
|
||
// CHECK-NEXT: [[@LINE-3]]:4 -> [[@LINE-2]]:11 : ((((0 - 2) - 3) - 4) - 5)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test53yyKF"
|
||
func test53() throws { // CHECK-NEXT: [[@LINE]]:22 -> [[@LINE+10]]:2 : 0
|
||
if try throwingBool(), // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE]]:24 : 0
|
||
try throwingBool() { // CHECK-NEXT: [[@LINE-1]]:24 -> [[@LINE+8]]:2 : (0 - 2)
|
||
try throwingFn() // CHECK-NEXT: [[@LINE-1]]:25 -> [[@LINE+7]]:2 : ((0 - 2) - 3)
|
||
} else { // CHECK-NEXT: [[@LINE-2]]:26 -> [[@LINE]]:4 : 1
|
||
try throwingFn() // CHECK-NEXT: [[@LINE-2]]:21 -> [[@LINE-1]]:4 : (1 - 4)
|
||
} // CHECK-NEXT: [[@LINE-2]]:4 -> [[@LINE+4]]:2 : (((0 - 2) - 3) - 4)
|
||
// CHECK-NEXT: [[@LINE-3]]:10 -> [[@LINE-1]]:4 : (((0 - 1) - 2) - 3)
|
||
// CHECK-NEXT: [[@LINE-3]]:21 -> [[@LINE-2]]:4 : ((((0 - 1) - 2) - 3) - 5)
|
||
// CHECK-NEXT: [[@LINE-3]]:4 -> [[@LINE+1]]:2 : ((((0 - 2) - 3) - 4) - 5)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test54SiSgyF"
|
||
func test54()-> Int? { // CHECK-NEXT: [[@LINE]]:22 -> [[@LINE+7]]:2 : 0
|
||
if let x = try? throwingFn(),
|
||
let y = try? throwingFn() { // CHECK-NEXT: [[@LINE]]:33 -> [[@LINE+2]]:4 : 1
|
||
x + y // FIXME: This region is redundant, and not really accurate since we have implicit returns (rdar://118653218)
|
||
} else { // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+3]]:2 : 0
|
||
try? throwingFn() // CHECK-NEXT: [[@LINE-1]]:10 -> [[@LINE+1]]:4 : (0 - 1)
|
||
} // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+1]]:2 : 0
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test55yyKF"
|
||
func test55() throws { // CHECK-NEXT: [[@LINE]]:22 -> [[@LINE+5]]:2 : 0
|
||
while try throwingBool() { // CHECK-NEXT: [[@LINE]]:9 -> [[@LINE]]:27 : (0 + 1)
|
||
// CHECK-NEXT: [[@LINE-1]]:27 -> [[@LINE+3]]:2 : (0 - 2)
|
||
// CHECK-NEXT: [[@LINE-2]]:28 -> [[@LINE+1]]:4 : 1
|
||
} // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+1]]:2 : (0 - 2)
|
||
} // CHECK-NEXT: }
|
||
|
||
// FIXME: The second condition ought to get a region too (rdar://118649481)
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test56yyKF"
|
||
func test56() throws { // CHECK-NEXT: [[@LINE]]:22 -> [[@LINE+6]]:2 : 0
|
||
while try throwingBool(), // CHECK-NEXT: [[@LINE]]:9 -> [[@LINE]]:27 : (0 + 1)
|
||
try throwingBool() { // CHECK-NEXT: [[@LINE-1]]:27 -> [[@LINE+4]]:2 : (0 - 2)
|
||
// CHECK-NEXT: [[@LINE-1]]:27 -> [[@LINE+3]]:2 : ((0 - 2) - 3)
|
||
// CHECK-NEXT: [[@LINE-2]]:28 -> [[@LINE+1]]:4 : 1
|
||
} // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+1]]:2 : ((0 - 2) - 3)
|
||
} // CHECK-NEXT: }
|
||
|
||
// FIXME: We ought to be giving both conditions a region here...
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test57yyF"
|
||
func test57() { // CHECK-NEXT: [[@LINE]]:15 -> [[@LINE+4]]:2 : 0
|
||
while let _ = try? throwingFn(),
|
||
let _ = try? throwingFn() { // CHECK-NEXT: [[@LINE]]:35 -> [[@LINE+1]]:4 : 1
|
||
} // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+1]]:2 : 0
|
||
} // CHECK-NEXT: }
|
||
|
||
// We generate the same regions for `try!` as `try`. We could handle it
|
||
// specially, but the error branches are effectively unreachable, so it
|
||
// doesn't make a difference.
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test58SiyF"
|
||
func test58() -> Int { // CHECK-NEXT: [[@LINE]]:22 -> [[@LINE+3]]:2 : 0
|
||
let x = try! throwingFn() // CHECK-NEXT: [[@LINE]]:28 -> [[@LINE+1]]:11 : (0 - 1)
|
||
return x
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test59SiyKF"
|
||
func test59() throws -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+5]]:2 : 0
|
||
guard try throwingBool() else { // CHECK-NEXT: [[@LINE]]:27 -> [[@LINE+3]]:11 : (0 - 2)
|
||
return 1 // CHECK-NEXT: [[@LINE-1]]:33 -> [[@LINE+1]]:4 : 1
|
||
} // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+1]]:11 : ((0 - 1) - 2)
|
||
return 0
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test60SiyKF"
|
||
func test60() throws -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+7]]:2 : 0
|
||
switch try throwingBool() { // CHECK-NEXT: [[@LINE]]:10 -> [[@LINE]]:28 : 0
|
||
case true: // CHECK-NEXT: [[@LINE-1]]:28 -> [[@LINE+5]]:2 : (0 - 1)
|
||
return 0 // CHECK-NEXT: [[@LINE-1]]:3 -> [[@LINE]]:13 : 2
|
||
case false: // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE+1]]:13 : 3
|
||
return 1
|
||
}
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test61SiyKF"
|
||
func test61() throws -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+7]]:2 : 0
|
||
switch try throwingBool() { // CHECK-NEXT: [[@LINE]]:10 -> [[@LINE]]:28 : 0
|
||
case true: // CHECK-NEXT: [[@LINE-1]]:28 -> [[@LINE+5]]:2 : (0 - 1)
|
||
0 // CHECK-NEXT: [[@LINE-1]]:3 -> [[@LINE]]:6 : 2
|
||
case false: // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE+1]]:6 : 3
|
||
1 // FIXME: This next region shouldn't be needed, we should know it's unrechabale (rdar://118653218).
|
||
} // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+1]]:2 : (2 + 3)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test62SiyKF"
|
||
func test62() throws -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+8]]:2 : 0
|
||
let x = switch try throwingBool() { // CHECK-NEXT: [[@LINE]]:18 -> [[@LINE]]:36 : 0
|
||
case true: // CHECK-NEXT: [[@LINE-1]]:36 -> [[@LINE+5]]:11 : (0 - 1)
|
||
0 // CHECK-NEXT: [[@LINE-1]]:3 -> [[@LINE]]:6 : 2
|
||
case false: // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE+1]]:6 : 3
|
||
1
|
||
} // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+1]]:11 : (2 + 3)
|
||
return x
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test63yyKF"
|
||
func test63() throws { // CHECK-NEXT: [[@LINE]]:22 -> [[@LINE+4]]:2 : 0
|
||
for _ in [try throwingFn()] { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+3]]:2 : (0 - 2)
|
||
// CHECK-NEXT: [[@LINE-1]]:31 -> [[@LINE+1]]:4 : 1
|
||
} // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+1]]:2 : (0 - 2)
|
||
} // CHECK-NEXT: }
|
||
|
||
// FIXME: We don't currently assign a separate region for the where clause, but
|
||
// we ought to (rdar://118653191).
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test64yyKF"
|
||
func test64() throws { // CHECK-NEXT: [[@LINE]]:22 -> [[@LINE+5]]:2 : 0
|
||
for _ in [0]
|
||
where try throwingBool() { // CHECK-NEXT: [[@LINE]]:27 -> [[@LINE+3]]:2 : (0 - 2)
|
||
// CHECK-NEXT: [[@LINE-1]]:28 -> [[@LINE+1]]:4 : 1
|
||
} // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+1]]:2 : (0 - 2)
|
||
} // CHECK-NEXT: }
|
||
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors6test65yyKF"
|
||
func test65() throws { // CHECK-NEXT: [[@LINE]]:22 -> [[@LINE+5]]:2 : 0
|
||
repeat { // CHECK-NEXT: [[@LINE]]:10 -> [[@LINE+2]]:4 : 1
|
||
// CHECK-NEXT: [[@LINE+1]]:4 -> [[@LINE+3]]:2 : 0
|
||
} while try throwingBool() // CHECK-NEXT: [[@LINE]]:11 -> [[@LINE]]:29 : 1
|
||
// CHECK-NEXT: [[@LINE-1]]:29 -> [[@LINE+1]]:2 : (0 - 2)
|
||
} // CHECK-NEXT: }
|
||
|
||
struct TestInit {
|
||
// CHECK-LABEL: sil_coverage_map {{.*}}// coverage_errors.TestInit.init() -> coverage_errors.TestInit
|
||
init() { // CHECK-NEXT: [[@LINE]]:10 -> [[@LINE+5]]:4 : 0
|
||
do { // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE+2]]:6 : 0
|
||
throw SomeErr.Err1
|
||
} catch { // CHECK-NEXT: [[@LINE]]:13 -> [[@LINE+1]]:6 : 1
|
||
} // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE+1]]:4 : 1
|
||
} // CHECK-NEXT: }
|
||
}
|
||
|
||
struct TestProp {
|
||
let a = try? throwingFn()
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors8TestPropV1aSiSgvpfi"
|
||
// CHECK-NEXT: [[@LINE-2]]:11 -> [[@LINE-2]]:28 : 0
|
||
// CHECK-NEXT: }
|
||
|
||
let b = try? (throwingFn(), 0)
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors8TestPropV1bSi_SitSgvpfi"
|
||
// CHECK-NEXT: [[@LINE-2]]:11 -> [[@LINE-2]]:33 : 0
|
||
// CHECK-NEXT: [[@LINE-3]]:29 -> [[@LINE-3]]:33 : (0 - 1)
|
||
// CHECK-NEXT: }
|
||
|
||
let c = try? (throwingFn(), .random() ? 0 : 1)
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors8TestPropV1cSi_SitSgvpfi"
|
||
// CHECK-NEXT: [[@LINE-2]]:11 -> [[@LINE-2]]:49 : 0
|
||
// CHECK-NEXT: [[@LINE-3]]:29 -> [[@LINE-3]]:49 : (0 - 1)
|
||
// CHECK-NEXT: [[@LINE-4]]:43 -> [[@LINE-4]]:44 : 2
|
||
// CHECK-NEXT: [[@LINE-5]]:47 -> [[@LINE-5]]:48 : ((0 - 1) - 2)
|
||
// CHECK-NEXT: }
|
||
|
||
let d = (try? (throwingFn(), .random() ? 0 : 1), 0)
|
||
// CHECK-LABEL: sil_coverage_map {{.*}} "$s15coverage_errors8TestPropV1dSi_SitSg_Sitvpfi"
|
||
// CHECK-NEXT: [[@LINE-2]]:11 -> [[@LINE-2]]:54 : 0
|
||
// CHECK-NEXT: [[@LINE-3]]:30 -> [[@LINE-3]]:50 : (0 - 1)
|
||
// CHECK-NEXT: [[@LINE-4]]:44 -> [[@LINE-4]]:45 : 2
|
||
// CHECK-NEXT: [[@LINE-5]]:48 -> [[@LINE-5]]:49 : ((0 - 1) - 2)
|
||
// CHECK-NEXT: }
|
||
}
|