[clang] dcd76c0 - [Lexer] Fix missing coverage line after #endif

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Tue Jul 14 04:52:15 PDT 2020


Nice!

On Fri, Jul 10, 2020 at 6:05 PM Zequan Wu via cfe-commits
<cfe-commits at 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 at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list