diff options
author | Wentao Zhang <35722712+whentojump@users.noreply.github.com> | 2024-04-22 12:37:38 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-22 12:37:38 -0500 |
commit | c1b6cca1214e7a9c14a30b81585dd8b81baeaa77 (patch) | |
tree | ba1da3a1031aee85c1ee8fa69b2a4621d31a1e02 /clang/lib/CodeGen/CoverageMappingGen.cpp | |
parent | a6c028299cbce9885dd3c3e989b2cb3273ba6e05 (diff) | |
download | llvm-c1b6cca1214e7a9c14a30b81585dd8b81baeaa77.zip llvm-c1b6cca1214e7a9c14a30b81585dd8b81baeaa77.tar.gz llvm-c1b6cca1214e7a9c14a30b81585dd8b81baeaa77.tar.bz2 |
[clang][CoverageMapping] do not emit a gap region when either end doesn't have valid source locations (#89564)
Fixes #86998
Diffstat (limited to 'clang/lib/CodeGen/CoverageMappingGen.cpp')
-rw-r--r-- | clang/lib/CodeGen/CoverageMappingGen.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp index 64c39c5..733686d 100644 --- a/clang/lib/CodeGen/CoverageMappingGen.cpp +++ b/clang/lib/CodeGen/CoverageMappingGen.cpp @@ -1208,6 +1208,12 @@ struct CounterCoverageMappingBuilder /// Find a valid gap range between \p AfterLoc and \p BeforeLoc. std::optional<SourceRange> findGapAreaBetween(SourceLocation AfterLoc, SourceLocation BeforeLoc) { + // Some statements (like AttributedStmt and ImplicitValueInitExpr) don't + // have valid source locations. Do not emit a gap region if this is the case + // in either AfterLoc end or BeforeLoc end. + if (AfterLoc.isInvalid() || BeforeLoc.isInvalid()) + return std::nullopt; + // If AfterLoc is in function-like macro, use the right parenthesis // location. if (AfterLoc.isMacroID()) { @@ -1368,9 +1374,8 @@ struct CounterCoverageMappingBuilder for (const Stmt *Child : S->children()) if (Child) { // If last statement contains terminate statements, add a gap area - // between the two statements. Skipping attributed statements, because - // they don't have valid start location. - if (LastStmt && HasTerminateStmt && !isa<AttributedStmt>(Child)) { + // between the two statements. + if (LastStmt && HasTerminateStmt) { auto Gap = findGapAreaBetween(getEnd(LastStmt), getStart(Child)); if (Gap) fillGapAreaWithCount(Gap->getBegin(), Gap->getEnd(), |