Nice!
On Fri, Jul 10, 2020 at 6:05 PM Zequan Wu via cfe-commits <cfe-commits@lists.llvm.org> wrote: > > > Author: Zequan Wu > Date: 2020-07-10T09:05:20-07:00 > New Revision: dcd76c0c0716a4417110423718c7cae4b516b4d0 > > URL: > https://github.com/llvm/llvm-project/commit/dcd76c0c0716a4417110423718c7cae4b516b4d0 > DIFF: > https://github.com/llvm/llvm-project/commit/dcd76c0c0716a4417110423718c7cae4b516b4d0.diff > > LOG: [Lexer] Fix missing coverage line after #endif > > Summary: bug reported here: https://bugs.llvm.org/show_bug.cgi?id=46660 > > Reviewers: vsk, efriedma, arphaman > > Reviewed By: vsk > > Subscribers: dexonsmith, cfe-commits > > Tags: #clang > > Differential Revision: https://reviews.llvm.org/D83514 > > Added: > > > Modified: > clang-tools-extra/clangd/SemanticHighlighting.cpp > clang/lib/Lex/PPDirectives.cpp > clang/test/CoverageMapping/preprocessor.c > > Removed: > > > > ################################################################################ > diff --git a/clang-tools-extra/clangd/SemanticHighlighting.cpp > b/clang-tools-extra/clangd/SemanticHighlighting.cpp > index d2470da60140..ed75ce80999c 100644 > --- a/clang-tools-extra/clangd/SemanticHighlighting.cpp > +++ b/clang-tools-extra/clangd/SemanticHighlighting.cpp > @@ -224,7 +224,7 @@ class HighlightingsBuilder { > // Create one token for each line in the skipped range, so it works > // with line-based > diff ing. > assert(R.start.line <= R.end.line); > - for (int Line = R.start.line; Line < R.end.line; ++Line) { > + for (int Line = R.start.line; Line <= R.end.line; ++Line) { > // Don't bother computing the offset for the end of the line, just > use > // zero. The client will treat this highlighting kind specially, and > // highlight the entire line visually (i.e. not just to where the > text > > diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp > index 396ba529fc9a..053ef1d2dd18 100644 > --- a/clang/lib/Lex/PPDirectives.cpp > +++ b/clang/lib/Lex/PPDirectives.cpp > @@ -432,6 +432,7 @@ void > Preprocessor::SkipExcludedConditionalBlock(SourceLocation HashTokenLoc, > // Skip to the next '#endif' / '#else' / '#elif'. > CurLexer->skipOver(*SkipLength); > } > + SourceLocation endLoc; > while (true) { > CurLexer->Lex(Tok); > > @@ -538,7 +539,7 @@ void > Preprocessor::SkipExcludedConditionalBlock(SourceLocation HashTokenLoc, > // Restore the value of LexingRawMode so that trailing comments > // are handled correctly, if we've reached the outermost block. > CurPPLexer->LexingRawMode = false; > - CheckEndOfDirective("endif"); > + endLoc = CheckEndOfDirective("endif"); > CurPPLexer->LexingRawMode = true; > if (Callbacks) > Callbacks->Endif(Tok.getLocation(), CondInfo.IfLoc); > @@ -565,7 +566,7 @@ void > Preprocessor::SkipExcludedConditionalBlock(SourceLocation HashTokenLoc, > // Restore the value of LexingRawMode so that trailing comments > // are handled correctly. > CurPPLexer->LexingRawMode = false; > - CheckEndOfDirective("else"); > + endLoc = CheckEndOfDirective("else"); > CurPPLexer->LexingRawMode = true; > if (Callbacks) > Callbacks->Else(Tok.getLocation(), CondInfo.IfLoc); > @@ -621,7 +622,9 @@ void > Preprocessor::SkipExcludedConditionalBlock(SourceLocation HashTokenLoc, > // by the end of the preamble; we'll resume parsing after the preamble. > if (Callbacks && (Tok.isNot(tok::eof) || !isRecordingPreamble())) > Callbacks->SourceRangeSkipped( > - SourceRange(HashTokenLoc, CurPPLexer->getSourceLocation()), > + SourceRange(HashTokenLoc, endLoc.isValid() > + ? endLoc > + : CurPPLexer->getSourceLocation()), > Tok.getLocation()); > } > > > diff --git a/clang/test/CoverageMapping/preprocessor.c > b/clang/test/CoverageMapping/preprocessor.c > index b3ebc7bd4ec0..9225c9f162a2 100644 > --- a/clang/test/CoverageMapping/preprocessor.c > +++ b/clang/test/CoverageMapping/preprocessor.c > @@ -3,7 +3,7 @@ > // CHECK: func > void func() { // CHECK: File 0, [[@LINE]]:13 -> [[@LINE+5]]:2 = #0 > int i = 0; > -#ifdef MACRO // CHECK-NEXT: Skipped,File 0, [[@LINE]]:1 -> [[@LINE+3]]:1 > = 0 > +#ifdef MACRO // CHECK-NEXT: Skipped,File 0, [[@LINE]]:1 -> [[@LINE+2]]:7 > = 0 > int x = i; > #endif > } > @@ -11,7 +11,7 @@ void func() { // CHECK: File 0, [[@LINE]]:13 -> > [[@LINE+5]]:2 = #0 > // CHECK: main > int main() { // CHECK-NEXT: File 0, [[@LINE]]:12 -> {{[0-9]+}}:2 = #0 > int i = 0; > -# if 0 // CHECK-NEXT: Skipped,File 0, [[@LINE]]:1 -> > [[@LINE+5]]:1 = 0 > +# if 0 // CHECK-NEXT: Skipped,File 0, [[@LINE]]:1 -> > [[@LINE+4]]:29 = 0 > if(i == 0) { > i = 1; > } > @@ -22,44 +22,44 @@ int main() { // CHECK-NEXT: File 0, [[@LINE]]:12 -> > {{[0-9]+}}:2 = #0 > if(i == 0) { // CHECK: File 0, [[@LINE]]:14 -> [[@LINE+2]]:4 = #1 > i = 1; > } > -#else // CHECK-NEXT: Skipped,File 0, [[@LINE]]:1 -> [[@LINE+6]]:1 > = 0 > +#else // CHECK-NEXT: Skipped,File 0, [[@LINE]]:1 -> [[@LINE+5]]:7 > = 0 > if(i == 1) { > i = 0; > } > } > #endif > > - // CHECK-NEXT: Skipped,File 0, [[@LINE+1]]:1 -> [[@LINE+5]]:1 > + // CHECK-NEXT: Skipped,File 0, [[@LINE+1]]:1 -> [[@LINE+4]]:24 > #\ > if 0 > #\ > endif // also skipped > > #if 1 > - // CHECK-NEXT: Skipped,File 0, [[@LINE+1]]:1 -> [[@LINE+4]]:1 > + // CHECK-NEXT: Skipped,File 0, [[@LINE+1]]:1 -> [[@LINE+3]]:7 > #\ > elif 0 > #endif > > #if 1 > - // CHECK-NEXT: Skipped,File 0, [[@LINE+1]]:1 -> [[@LINE+4]]:1 > + // CHECK-NEXT: Skipped,File 0, [[@LINE+1]]:1 -> [[@LINE+3]]:7 > #\ > else > #endif > > - // CHECK-NEXT: Skipped,File 0, [[@LINE+1]]:1 -> [[@LINE+5]]:1 > + // CHECK-NEXT: Skipped,File 0, [[@LINE+1]]:1 -> [[@LINE+4]]:8 > #\ > ifdef NOT_DEFINED > #\ > endif > > - // CHECK-NEXT: Skipped,File 0, [[@LINE+1]]:1 -> [[@LINE+5]]:1 > + // CHECK-NEXT: Skipped,File 0, [[@LINE+1]]:1 -> [[@LINE+4]]:8 > #\ > ifndef __FILE__ > #\ > endif > > - // CHECK-NEXT: Skipped,File 0, [[@LINE+1]]:1 -> [[@LINE+7]]:1 > + // CHECK-NEXT: Skipped,File 0, [[@LINE+1]]:1 -> [[@LINE+6]]:26 > #\ > ifdef NOT_DEFINED > #\ > > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits