mirror of https://github.com/microsoft/clang.git
[Coverage] Explicitly mark the l.h.s of && and || (fixes PR33465)
This makes it possible to view sub-line region counts for the l.h.s of && and || expressions in coverage reports. It also fixes PR33465, which shows an example of incorrect coverage output for an assignment statement containing '||'. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@315979 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
185bad56b3
commit
762d1e77cb
|
@ -1083,16 +1083,18 @@ struct CounterCoverageMappingBuilder
|
|||
}
|
||||
|
||||
void VisitBinLAnd(const BinaryOperator *E) {
|
||||
extendRegion(E);
|
||||
Visit(E->getLHS());
|
||||
extendRegion(E->getLHS());
|
||||
propagateCounts(getRegion().getCounter(), E->getLHS());
|
||||
handleFileExit(getEnd(E->getLHS()));
|
||||
|
||||
extendRegion(E->getRHS());
|
||||
propagateCounts(getRegionCounter(E), E->getRHS());
|
||||
}
|
||||
|
||||
void VisitBinLOr(const BinaryOperator *E) {
|
||||
extendRegion(E);
|
||||
Visit(E->getLHS());
|
||||
extendRegion(E->getLHS());
|
||||
propagateCounts(getRegion().getCounter(), E->getLHS());
|
||||
handleFileExit(getEnd(E->getLHS()));
|
||||
|
||||
extendRegion(E->getRHS());
|
||||
propagateCounts(getRegionCounter(E), E->getRHS());
|
||||
|
|
|
@ -1,13 +1,18 @@
|
|||
// RUN: %clang_cc1 -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only -main-file-name logical.cpp %s | FileCheck %s
|
||||
|
||||
int main() { // CHECK: File 0, [[@LINE]]:12 -> [[@LINE+10]]:2 = #0
|
||||
int main() { // CHECK: File 0, [[@LINE]]:12 -> [[@LINE+15]]:2 = #0
|
||||
bool bt = true;
|
||||
bool bf = false;
|
||||
bool a = bt && bf; // CHECK-NEXT: File 0, [[@LINE]]:18 -> [[@LINE]]:20 = #1
|
||||
a = bt &&
|
||||
bool a = bt && bf; // CHECK-NEXT: File 0, [[@LINE]]:12 -> [[@LINE]]:14 = #0
|
||||
// CHECK-NEXT: File 0, [[@LINE-1]]:18 -> [[@LINE-1]]:20 = #1
|
||||
|
||||
a = bt && // CHECK-NEXT: File 0, [[@LINE]]:7 -> [[@LINE]]:9 = #0
|
||||
bf; // CHECK-NEXT: File 0, [[@LINE]]:7 -> [[@LINE]]:9 = #2
|
||||
a = bf || bt; // CHECK-NEXT: File 0, [[@LINE]]:13 -> [[@LINE]]:15 = #3
|
||||
a = bf ||
|
||||
|
||||
a = bf || bt; // CHECK-NEXT: File 0, [[@LINE]]:7 -> [[@LINE]]:9 = #0
|
||||
// CHECK-NEXT: File 0, [[@LINE-1]]:13 -> [[@LINE-1]]:15 = #3
|
||||
|
||||
a = bf || // CHECK-NEXT: File 0, [[@LINE]]:7 -> [[@LINE]]:9 = #0
|
||||
bt; // CHECK-NEXT: File 0, [[@LINE]]:7 -> [[@LINE]]:9 = #4
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -23,10 +23,12 @@
|
|||
// CHECK-NEXT: Expansion,File 4, [[@LINE+2]]:20 -> [[@LINE+2]]:22 = (#0 + #8)
|
||||
// CHECK-NEXT: File 4, [[@LINE+1]]:36 -> [[@LINE+1]]:37 = (#0 + #8)
|
||||
#define M3(x) do { M2(x); } while (0)
|
||||
// CHECK-NEXT: File 5, [[@LINE+2]]:15 -> [[@LINE+2]]:27 = #0
|
||||
// CHECK-NEXT: File 5, [[@LINE+3]]:15 -> [[@LINE+3]]:27 = #0
|
||||
// CHECK-NEXT: File 5, [[@LINE+2]]:16 -> [[@LINE+2]]:19 = #0
|
||||
// CHECK-NEXT: File 5, [[@LINE+1]]:23 -> [[@LINE+1]]:26 = #12
|
||||
#define M4(x) ((x) && (x))
|
||||
// CHECK-NEXT: File 6, [[@LINE+2]]:15 -> [[@LINE+2]]:27 = #0
|
||||
// CHECK-NEXT: File 6, [[@LINE+3]]:15 -> [[@LINE+3]]:27 = #0
|
||||
// CHECK-NEXT: File 6, [[@LINE+2]]:16 -> [[@LINE+2]]:19 = #0
|
||||
// CHECK-NEXT: File 6, [[@LINE+1]]:23 -> [[@LINE+1]]:26 = #14
|
||||
#define M5(x) ((x) || (x))
|
||||
// CHECK-NEXT: File 7, [[@LINE+1]]:15 -> [[@LINE+1]]:26 = #0
|
||||
|
|
Loading…
Reference in New Issue