diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp --- a/clang/lib/CodeGen/CoverageMappingGen.cpp +++ b/clang/lib/CodeGen/CoverageMappingGen.cpp @@ -44,7 +44,8 @@ PP.setTokenWatcher([CoverageInfo](clang::Token Tok) { // Update previous token location. CoverageInfo->PrevTokLoc = Tok.getLocation(); - CoverageInfo->updateNextTokLoc(Tok.getLocation()); + if (Tok.getKind() != clang::tok::eod) + CoverageInfo->updateNextTokLoc(Tok.getLocation()); }); return CoverageInfo; } @@ -305,20 +306,24 @@ /// non-comment token. If shrinking the skipped range would make it empty, /// this returns None. Optional adjustSkippedRange(SourceManager &SM, - SpellingRegion SR, + SourceLocation LocStart, + SourceLocation LocEnd, SourceLocation PrevTokLoc, SourceLocation NextTokLoc) { + SpellingRegion SR{SM, LocStart, LocEnd}; // If Range begin location is invalid, it's not a comment region. if (PrevTokLoc.isInvalid()) return SR; unsigned PrevTokLine = SM.getSpellingLineNumber(PrevTokLoc); unsigned NextTokLine = SM.getSpellingLineNumber(NextTokLoc); SpellingRegion newSR(SR); - if (SR.LineStart == PrevTokLine) { + if (SM.isWrittenInSameFile(LocStart, PrevTokLoc) && + SR.LineStart == PrevTokLine) { newSR.LineStart = SR.LineStart + 1; newSR.ColumnStart = 1; } - if (SR.LineEnd == NextTokLine) { + if (SM.isWrittenInSameFile(LocEnd, NextTokLoc) && + SR.LineEnd == NextTokLine) { newSR.LineEnd = SR.LineEnd - 1; newSR.ColumnEnd = SR.ColumnStart + 1; } @@ -354,14 +359,13 @@ auto CovFileID = getCoverageFileID(LocStart); if (!CovFileID) continue; - SpellingRegion SR{SM, LocStart, LocEnd}; - if (Optional res = - adjustSkippedRange(SM, SR, I.PrevTokLoc, I.NextTokLoc)) - SR = res.getValue(); - else + Optional SR = + adjustSkippedRange(SM, LocStart, LocEnd, I.PrevTokLoc, I.NextTokLoc); + if (!SR.hasValue()) continue; auto Region = CounterMappingRegion::makeSkipped( - *CovFileID, SR.LineStart, SR.ColumnStart, SR.LineEnd, SR.ColumnEnd); + *CovFileID, SR->LineStart, SR->ColumnStart, SR->LineEnd, + SR->ColumnEnd); // Make sure that we only collect the regions that are inside // the source code of this function. if (Region.LineStart >= FileLineRanges[*CovFileID].first && diff --git a/clang/test/CoverageMapping/Inputs/comment.h b/clang/test/CoverageMapping/Inputs/comment.h new file mode 100644 --- /dev/null +++ b/clang/test/CoverageMapping/Inputs/comment.h @@ -0,0 +1,6 @@ + + + + + +x = 0; diff --git a/clang/test/CoverageMapping/comment.cpp b/clang/test/CoverageMapping/comment.cpp new file mode 100644 --- /dev/null +++ b/clang/test/CoverageMapping/comment.cpp @@ -0,0 +1,13 @@ +// RUN: %clang_cc1 -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only %s | FileCheck %s + +int f() { + int x = 0; +#include "Inputs/comment.h" /* + */ + return x; +} + +// CHECK: File 0, 3:9 -> 8:2 = #0 +// CHECK-NEXT: Expansion,File 0, 5:14 -> 5:32 = #0 +// CHECK-NEXT: Skipped,File 0, 6:1 -> 6:7 = 0 +// CHECK-NEXT: File 1, 1:1 -> 6:7 = #0