blob: ca7f64c78ee1064a87fd3994da29dca69cd081e6 [file] [log] [blame]
// RUN: %empty-directory(%t)
// RUN: %target-build-swift %s -profile-generate -profile-coverage-mapping -Xfrontend -disable-incremental-llvm-codegen -o %t/main
// This unusual use of 'sh' allows the path of the profraw file to be
// substituted by %target-run.
// 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-profdata show %t/default.profdata -function=f_internal | %FileCheck %s --check-prefix=CHECK-INTERNAL
// RUN: %llvm-profdata show %t/default.profdata -function=f_private | %FileCheck %s --check-prefix=CHECK-PRIVATE
// RUN: %llvm-profdata show %t/default.profdata -function=f_public | %FileCheck %s --check-prefix=CHECK-PUBLIC
// RUN: %llvm-profdata show %t/default.profdata -function=main | %FileCheck %s --check-prefix=CHECK-MAIN
// RUN: %llvm-cov show %t/main -instr-profile=%t/default.profdata | %FileCheck %s --check-prefix=CHECK-COV
// RUN: %llvm-cov report %t/main -instr-profile=%t/default.profdata -show-functions %s | %FileCheck %s --check-prefix=CHECK-REPORT
// RUN: rm -rf %t
// REQUIRES: profile_runtime
// REQUIRES: executable_test
// REQUIRES: OS=macosx
// CHECK-INTERNAL: Functions shown: 1
// CHECK-COV: {{ *}}[[@LINE+1]]|{{ *}}1{{.*}}func f_internal
internal func f_internal() {}
// CHECK-PRIVATE: Functions shown: 1
// CHECK-COV: {{ *}}[[@LINE+1]]|{{ *}}1{{.*}}func f_private
private func f_private() { f_internal() }
// CHECK-PUBLIC: Functions shown: 1
// CHECK-COV: {{ *}}[[@LINE+1]]|{{ *}}1{{.*}}func f_public
public func f_public() { f_private() }
class Class1 {
var Field1 = 0
// CHECK-COV: {{ *}}[[@LINE+1]]|{{ *}}1{{.*}}init
init() {}
// CHECK-COV: {{ *}}[[@LINE+1]]|{{ *}}1{{.*}}deinit
deinit {}
}
// CHECK-MAIN: Maximum function count: 4
func main() {
// CHECK-COV: {{ *}}[[@LINE+1]]|{{ *}}1{{.*}}f_public
f_public()
// CHECK-COV: {{ *}}[[@LINE+1]]|{{ *}}1{{.*}}if (true)
if (true) {}
var x : Int32 = 0
while (x < 10) {
// CHECK-COV: {{ *}}[[@LINE+1]]|{{ *}}10{{.*}}x += 1
x += 1
}
// CHECK-COV: {{ *}}[[@LINE+1]]|{{ *}}1{{.*}}Class1
let _ = Class1()
}
// rdar://problem/22761498 - enum declaration suppresses coverage
func foo() {
var x : Int32 = 0 // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
enum ETy { case A } // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
repeat { // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
x += 1 // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
} while x == 0 // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
x += 1 // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
}
// rdar://problem/27874041 - top level code decls get no coverage
var g1 : Int32 = 0 // CHECK-COV: {{ *}}[[@LINE]]|
repeat { // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
g1 += 1 // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
} while g1 == 0 // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
func call_closure() { // CHECK-COV: {{ *}}[[@LINE]]|
var x : Int32 = 0 // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
({ () -> () in // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
x += 1 // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
})() // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
}
func call_auto_closure() {
func use_auto_closure(_ x: @autoclosure () -> Bool) -> Bool {
return x() && // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
x() && // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
x() // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
}
let _ = use_auto_closure(true) // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}3
}
class Class2 {
var field: Int
init(field: Int) {
if field > 0 {
self.field = 0 // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
} else {
self.field = 1 // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}3
}
}
}
extension Class2 {
convenience init() {
self.init(field: 0) // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
}
}
class SubClass1: Class2 {
override init(field: Int) {
super.init(field: field) // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
}
}
struct Struct1 {
var field: Int
init(field: Int) {
if field > 0 {
self.field = 0 // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
} else {
self.field = 1 // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
}
}
}
extension Struct1 {
init() {
self.init(field: 0) // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
}
}
var g2: Int = 0
class Class3 {
var m1 = g2 == 0
? "false" // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
: "true"; // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
}
// rdar://34244637: Wrong coverage for do/catch sequence
enum CustomError : Error {
case Err
}
func throwError(_ b: Bool) throws {
if b {
throw CustomError.Err
}
}
func catchError(_ b: Bool) -> Int {
do {
try throwError(b) // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}2
} catch { // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}2
return 1 // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
} // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
let _ = 1 + 1 // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
return 0 // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
}
let _ = catchError(true)
let _ = catchError(false)
func catchError2(_ b: Bool) -> Int {
do {
throw CustomError.Err // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}2
} catch {
if b { // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}2
return 1 // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
}
}
return 0 // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
}
let _ = catchError2(true)
let _ = catchError2(false)
main() // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
foo() // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
call_closure()
call_auto_closure()
let _ = Class2(field: 0)
let _ = Class2(field: 1)
let _ = Class2()
let _ = SubClass1(field: 0)
let _ = Class3()
g2 = 1
let _ = Class3()
let _ = Struct1(field: 1)
let _ = Struct1()
struct Struct2 {
func visible() {
hidden()
}
private func hidden() {
var x: Int = 0 // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
func helper() {
x += 1 // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
}
helper() // CHECK-COV: {{ *}}[[@LINE]]|{{ *}}1
}
}
var s2 = Struct2()
s2.visible()
// CHECK-REPORT: TOTAL {{.*}} 100.00% {{.*}} 100.00%