diff options
-rw-r--r-- | clang/lib/CodeGen/CoverageMappingGen.cpp | 8 | ||||
-rw-r--r-- | clang/test/CoverageMapping/Inputs/deferred-region-helper.h | 5 | ||||
-rw-r--r-- | clang/test/CoverageMapping/deferred-region.cpp | 13 |
3 files changed, 22 insertions, 4 deletions
diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp index 26236b72ff7..6e0099bc201 100644 --- a/clang/lib/CodeGen/CoverageMappingGen.cpp +++ b/clang/lib/CodeGen/CoverageMappingGen.cpp @@ -496,12 +496,14 @@ struct CounterCoverageMappingBuilder DeferredRegion = None; // If the region ends in an expansion, find the expansion site. - if (SM.getFileID(DeferredEndLoc) != SM.getMainFileID()) { - FileID StartFile = SM.getFileID(DR.getStartLoc()); + FileID StartFile = SM.getFileID(DR.getStartLoc()); + if (SM.getFileID(DeferredEndLoc) != StartFile) { if (isNestedIn(DeferredEndLoc, StartFile)) { do { DeferredEndLoc = getIncludeOrExpansionLoc(DeferredEndLoc); } while (StartFile != SM.getFileID(DeferredEndLoc)); + } else { + return Index; } } @@ -591,7 +593,7 @@ struct CounterCoverageMappingBuilder if (!DeferredRegion.hasValue() && // File IDs aren't gathered within macro expansions, so it isn't // useful to try and create a deferred region inside of one. - (SM.getFileID(EndLoc) == SM.getMainFileID())) + !EndLoc.isMacroID()) DeferredRegion = SourceMappingRegion(Counter::getZero(), EndLoc, None); } diff --git a/clang/test/CoverageMapping/Inputs/deferred-region-helper.h b/clang/test/CoverageMapping/Inputs/deferred-region-helper.h new file mode 100644 index 00000000000..c3e5c16e32a --- /dev/null +++ b/clang/test/CoverageMapping/Inputs/deferred-region-helper.h @@ -0,0 +1,5 @@ +void included_func() { + if (false) + return; + return; +} diff --git a/clang/test/CoverageMapping/deferred-region.cpp b/clang/test/CoverageMapping/deferred-region.cpp index 3504588a6c3..5a104f77897 100644 --- a/clang/test/CoverageMapping/deferred-region.cpp +++ b/clang/test/CoverageMapping/deferred-region.cpp @@ -1,4 +1,4 @@ -// 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 %s | FileCheck %s +// 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 @@ -170,6 +170,16 @@ 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); @@ -189,5 +199,6 @@ int main() { for_loop(); while_loop(); gotos(); + include(); return 0; } |