forked from OSchip/llvm-project
[Coverage] Prevent creating a redundant counter if a nested body ends with a macro.
If there were several nested statements arranged in a way that all of them end up with the same macro, then the expansion of this macro was assigned with all the corresponding counters of these statements. As a result, the wrong counter value was shown for the macro in llvm-cov. This patch fixes the issue by preventing adding a counter for an expanded source range if it already has an assigned counter, which is expected to come from the most specific statement. Differential Revision: https://reviews.llvm.org/D23160 llvm-svn: 279962
This commit is contained in:
parent
24281b4740
commit
8545dae226
|
@ -432,7 +432,8 @@ struct CounterCoverageMappingBuilder
|
||||||
SourceLocation NestedLoc = getStartOfFileOrMacro(EndLoc);
|
SourceLocation NestedLoc = getStartOfFileOrMacro(EndLoc);
|
||||||
assert(SM.isWrittenInSameFile(NestedLoc, EndLoc));
|
assert(SM.isWrittenInSameFile(NestedLoc, EndLoc));
|
||||||
|
|
||||||
SourceRegions.emplace_back(Region.getCounter(), NestedLoc, EndLoc);
|
if (!isRegionAlreadyAdded(NestedLoc, EndLoc))
|
||||||
|
SourceRegions.emplace_back(Region.getCounter(), NestedLoc, EndLoc);
|
||||||
|
|
||||||
EndLoc = getPreciseTokenLocEnd(getIncludeOrExpansionLoc(EndLoc));
|
EndLoc = getPreciseTokenLocEnd(getIncludeOrExpansionLoc(EndLoc));
|
||||||
if (EndLoc.isInvalid())
|
if (EndLoc.isInvalid())
|
||||||
|
|
|
@ -36,8 +36,20 @@ void func3() { // CHECK-NEXT: File 0, [[@LINE]]:14 -> [[@LINE+3]]:2 = #0
|
||||||
// CHECK-NEXT: File 1, 4:17 -> 4:22 = #0
|
// CHECK-NEXT: File 1, 4:17 -> 4:22 = #0
|
||||||
// CHECK-NEXT: File 2, 4:17 -> 4:22 = #0
|
// CHECK-NEXT: File 2, 4:17 -> 4:22 = #0
|
||||||
|
|
||||||
|
// CHECK-NEXT: func4
|
||||||
|
void func4() { // CHECK-NEXT: File 0, [[@LINE]]:14 -> [[@LINE+6]]:2 = #0
|
||||||
|
int i = 0;
|
||||||
|
while (i++ < 10) // CHECK-NEXT: File 0, [[@LINE]]:10 -> [[@LINE]]:18 = (#0 + #1)
|
||||||
|
if (i < 5) // CHECK-NEXT: File 0, [[@LINE]]:5 -> [[@LINE+2]]:14 = #1
|
||||||
|
// CHECK-NEXT: File 0, [[@LINE-1]]:9 -> [[@LINE-1]]:14 = #1
|
||||||
|
MACRO_2; // CHECK-NEXT: Expansion,File 0, [[@LINE]]:7 -> [[@LINE]]:14 = #2
|
||||||
|
}
|
||||||
|
// CHECK-NEXT: File 1, 4:17 -> 4:22 = #2
|
||||||
|
// CHECK-NOT: File 1
|
||||||
|
|
||||||
int main(int argc, const char *argv[]) {
|
int main(int argc, const char *argv[]) {
|
||||||
func();
|
func();
|
||||||
func2();
|
func2();
|
||||||
func3();
|
func3();
|
||||||
|
func4();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue