Skip to content

Commit f5d9d92

Browse files
ZequanWuzahiraam
authored andcommitted
[Coverage] Add coverage for constructor member initializers. (llvm#66441)
Before, constructor member initializers are shown as not covered. This adds coverage info for them.
1 parent ed40f5c commit f5d9d92

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

clang/lib/CodeGen/CoverageMappingGen.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1036,11 +1036,20 @@ struct CounterCoverageMappingBuilder
10361036
// lexer may not be able to report back precise token end locations for
10371037
// these children nodes (llvm.org/PR39822), and moreover users will not be
10381038
// able to see coverage for them.
1039+
Counter BodyCounter = getRegionCounter(Body);
10391040
bool Defaulted = false;
10401041
if (auto *Method = dyn_cast<CXXMethodDecl>(D))
10411042
Defaulted = Method->isDefaulted();
1043+
if (auto *Ctor = dyn_cast<CXXConstructorDecl>(D)) {
1044+
for (auto *Initializer : Ctor->inits()) {
1045+
if (Initializer->isWritten()) {
1046+
auto *Init = Initializer->getInit();
1047+
propagateCounts(BodyCounter, Init);
1048+
}
1049+
}
1050+
}
10421051

1043-
propagateCounts(getRegionCounter(Body), Body,
1052+
propagateCounts(BodyCounter, Body,
10441053
/*VisitChildren=*/!Defaulted);
10451054
assert(RegionStack.empty() && "Regions entered but never exited");
10461055
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// RUN: %clang_cc1 -mllvm -emptyline-comment-coverage=false -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only -main-file-name continue.c %s | FileCheck %s
2+
3+
class A {
4+
public:
5+
int a;
6+
A(int a): a(a) {}
7+
};
8+
class B: public A {
9+
public:
10+
int b;
11+
int c;
12+
B(int x, int y)
13+
: A(x), // CHECK: File 0, [[@LINE]]:7 -> [[@LINE]]:11 = #0
14+
// CHECK-NEXT: File 0, [[@LINE+1]]:7 -> [[@LINE+1]]:13 = #0
15+
b(x == 0? 1: 2), // CHECK-NEXT: File 0, [[@LINE]]:7 -> [[@LINE]]:19 = #0
16+
// CHECK-NEXT: Branch,File 0, [[@LINE-1]]:7 -> [[@LINE-1]]:13 = #1, (#0 - #1)
17+
// CHECK-NEXT: Gap,File 0, [[@LINE-2]]:14 -> [[@LINE-2]]:15 = #1
18+
// CHECK-NEXT: File 0, [[@LINE-3]]:15 -> [[@LINE-3]]:16 = #1
19+
// CHECK-NEXT: File 0, [[@LINE-4]]:18 -> [[@LINE-4]]:19 = (#0 - #1)
20+
// CHECK-NEXT: File 0, [[@LINE+2]]:7 -> [[@LINE+8]]:8 = #0
21+
// CHECK-NEXT: File 0, [[@LINE+7]]:10 -> [[@LINE+7]]:12 = #0
22+
c([&]() {
23+
// CHECK: File 0, [[@LINE-1]]:13 -> [[@LINE+5]]:6 = #0
24+
// CHECK-NEXT: File 0, [[@LINE+1]]:13 -> [[@LINE+1]]:19 = #0
25+
if (y == 0) // CHECK-NEXT: Branch,File 0, [[@LINE]]:13 -> [[@LINE]]:19 = #1, (#0 - #1)
26+
return 1; // CHECK-NEXT: Gap,File 0, [[@LINE-1]]:20 -> [[@LINE]]:13 = #1
27+
return 2; // CHECK-NEXT: File 0, [[@LINE-1]]:13 -> [[@LINE-1]]:21 = #1
28+
}()) {} // CHECK-NEXT: Gap,File 0, [[@LINE-2]]:22 -> [[@LINE-1]]:9 = (#0 - #1)
29+
}; // CHECK-NEXT: File 0, [[@LINE-2]]:9 -> [[@LINE-2]]:17 = (#0 - #1)
30+
31+
int main() {
32+
B b(1,2);
33+
return 0;
34+
}

0 commit comments

Comments
 (0)