diff options
Diffstat (limited to 'test/CoverageMapping/deferred-region.cpp')
-rw-r--r-- | test/CoverageMapping/deferred-region.cpp | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/test/CoverageMapping/deferred-region.cpp b/test/CoverageMapping/deferred-region.cpp new file mode 100644 index 000000000000..5a104f778979 --- /dev/null +++ b/test/CoverageMapping/deferred-region.cpp @@ -0,0 +1,204 @@ +// RUN: %clang_cc1 -std=c++11 -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -fexceptions -fcxx-exceptions -emit-llvm-only -triple %itanium_abi_triple -main-file-name deferred-region.cpp -I %S/Inputs %s | FileCheck %s + +#define IF if +#define STMT(S) S + +// CHECK-LABEL: _Z3fooi: +void foo(int x) { + if (x == 0) { + return; + } // CHECK: Gap,File 0, [[@LINE]]:4 -> [[@LINE+2]]:2 = (#0 - #1) + +} + +// CHECK-NEXT: _Z4foooi: +void fooo(int x) { + if (x == 0) { + return; + } // CHECK: Gap,File 0, [[@LINE]]:4 -> [[@LINE+2]]:3 = (#0 - #1) + + if (x == 1) { + return; + } // CHECK: Gap,File 0, [[@LINE]]:4 -> [[@LINE+2]]:2 = ((#0 - #1) - #2) + +} + +// CHECK-LABEL: _Z3bazv: +void baz() { // CHECK: [[@LINE]]:12 -> [[@LINE+2]]:2 + return; // CHECK-NOT: File +} + +// CHECK-LABEL: _Z3mazv: +void maz() { + if (true) + return; // CHECK: Gap,File 0, [[@LINE]]:11 -> [[@LINE+2]]:3 = (#0 - #1) + + return; // CHECK-NOT: Gap +} + +// CHECK-LABEL: _Z4maazv: +void maaz() { + if (true) + return; // CHECK: Gap,File 0, [[@LINE]]:11 + else + return; // CHECK-NOT: Gap,File 0, [[@LINE]] +} + +// CHECK-LABEL: _Z5maaazv: +void maaaz() { + if (true) { + return; + } else { // CHECK: Gap,File 0, [[@LINE]]:4 -> [[@LINE]]:10 + return; // CHECK-NOT: Gap,File 0, [[@LINE]] + } +} + +// CHECK-LABEL: _Z3bari: +void bar(int x) { + IF (x) + return; // CHECK: Gap,File 0, [[@LINE]]:11 -> [[@LINE+2]]:3 = (#0 - #1) + + IF (!x) + return; // CHECK: Gap,File 0, [[@LINE]]:11 -> [[@LINE+2]]:3 = ((#0 - #1) - #2) + + foo(x); +} + +// CHECK-LABEL: _Z4quuxi: +// Deferred regions are not emitted within macro expansions. +void quux(int x) { + STMT( + if (x == 0) + return;) + + // CHECK-NOT: [[@LINE-2]]:{{.*}} -> [[@LINE+2]] + + if (x == 1) + STMT(return;) + + // CHECK-NOT: [[@LINE-2]]:{{.*}} -> [[@LINE+3]] + + STMT( + if (x == 2) + return; + + // CHECK-NOT: [[@LINE-2]]:{{.*}} -> [[@LINE+2]] + + if (x == 3) + return; + ) +} + +// CHECK-LABEL: _Z8weird_ifv: +void weird_if() { + int i = 0; + + if (false) + return; // CHECK: Gap,File 0, [[@LINE]]:11 -> [[@LINE+2]]:3 = (#0 - #1) + + if (false) + i++; + + if (i + 100 > 0) { // CHECK: [[@LINE]]:20 -> [[@LINE+6]]:4 = #3 + if (false) // CHECK: [[@LINE+1]]:7 -> [[@LINE+1]]:13 = #4 + return; // CHECK: Gap,File 0, [[@LINE]]:13 -> [[@LINE+2]]:5 = (#3 - #4) + // CHECK: [[@LINE+1]]:5 -> [[@LINE+3]]:4 = (#3 - #4) + return; // CHECK: Gap,File 0, [[@LINE]]:5 -> [[@LINE+4]]:3 = ((#0 - #1) - #3) + + } + + if (false) + return; // CHECK: Gap,File 0, [[@LINE]]:11 -> [[@LINE+1]]:2 +} + +// CHECK-LABEL: _Z8for_loopv: +void for_loop() { + if (false) + return; // CHECK: Gap,File 0, [[@LINE]]:11 -> [[@LINE+2]]:3 = (#0 - #1) + + for (int i = 0; i < 10; ++i) { + if (i % 2 == 0) + continue; // CHECK: Gap,File 0, [[@LINE]]:15 -> [[@LINE+2]]:5 = (#2 - #3) + + if (i % 5 == 0) + break; // CHECK: Gap,File 0, [[@LINE]]:12 -> [[@LINE+2]]:5 = ((#2 - #3) - #4) + + int x = i; // CHECK: [[@LINE]]:5 -> [[@LINE+3]]:4 = ((#2 - #3) - #4) + return; // CHECK-NOT: [[@LINE]]:11 -> [[@LINE+2]] + + } +} + +struct Error {}; + +// CHECK-LABEL: _Z10while_loopv: +void while_loop() { + if (false) + return; // CHECK: Gap,File 0, [[@LINE]]:11 -> [[@LINE+2]]:3 = (#0 - #1) + + int x = 0; + while (++x < 10) { + if (x == 1) + continue; // CHECK: Gap,File 0, [[@LINE]]:15 -> [[@LINE+2]]:5 = (#2 - #3) + + while (++x < 4) { + if (x == 3) + break; // CHECK: Gap,File 0, [[@LINE]]:14 -> [[@LINE+2]]:7 = (#4 - #5) + + while (++x < 5) {} + } + + if (x == 0) + throw Error(); // CHECK: Gap,File 0, [[@LINE]]:20 -> [[@LINE+2]]:5 = ((#2 - #3) - #7) + + while (++x < 9) { + if (x == 0) + break; // CHECK-NOT: [[@LINE]]:14 -> [[@LINE+2]] + + } + } +} + +// CHECK-LABEL: _Z5gotosv: +void gotos() { + if (false) + goto out; // CHECK: Gap,File 0, [[@LINE]]:13 -> [[@LINE+2]]:3 = (#0 - #1) + + return; // CHECK: [[@LINE]]:3 -> [[@LINE+4]]:2 = (#0 - #1) + +out: + return; // CHECK: Gap,File 0, [[@LINE]]:8 -> [[@LINE+1]]:2 = 0 +} + +#include "deferred-region-helper.h" +// CHECK-LABEL: _Z13included_funcv: +// CHECK: Gap,File 0, 2:13 -> 3:5 = #1 +// CHECK: Gap,File 0, 3:11 -> 4:3 = (#0 - #1) + +// CHECK-LABEL: _Z7includev: +void include() { + included_func(); +} + +int main() { + foo(0); + foo(1); + fooo(0); + fooo(1); + maz(); + maaz(); + maaaz(); + baz(); + bar(0); + bar(1); + quux(0); + quux(1); + quux(2); + quux(3); + weird_if(); + for_loop(); + while_loop(); + gotos(); + include(); + return 0; +} |