From 8f738ac6d469ce3ebefe3d1c9dadcc1eda56a61c Mon Sep 17 00:00:00 2001 From: Ilya Biryukov Date: Tue, 12 Sep 2017 08:35:57 +0000 Subject: [PATCH] Fix recording preamble's conditional stack in skipped PP branches. Summary: This fixes PR34547. `Lexer::LexEndOfFile` handles recording of ConditionalStack for preamble and reporting errors about unmatched conditionalal PP directives. However, SkipExcludedConditionalBlock contianed duplicated logic for reporting errors and clearing ConditionalStack, but not for preamble recording. This fix removes error reporting logic from `SkipExcludedConditionalBlock`, unmatched PP conditionals are now reported inside `Lexer::LexEndOfFile`. Reviewers: erikjv, klimek, bkramer Reviewed By: erikjv Subscribers: nik, cfe-commits Differential Revision: https://reviews.llvm.org/D37700 llvm-svn: 313014 --- clang/lib/Lex/PPDirectives.cpp | 11 ++--------- .../preamble-conditionals-inverted-with-error.cpp | 8 ++++++++ clang/test/Index/preamble-conditionals-inverted.cpp | 8 ++++++++ 3 files changed, 18 insertions(+), 9 deletions(-) create mode 100644 clang/test/Index/preamble-conditionals-inverted-with-error.cpp create mode 100644 clang/test/Index/preamble-conditionals-inverted.cpp diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp index 556e76356da4..eb9f11f3d4df 100644 --- a/clang/lib/Lex/PPDirectives.cpp +++ b/clang/lib/Lex/PPDirectives.cpp @@ -383,15 +383,8 @@ void Preprocessor::SkipExcludedConditionalBlock(const Token &HashToken, // If this is the end of the buffer, we have an error. if (Tok.is(tok::eof)) { - // Emit errors for each unterminated conditional on the stack, including - // the current one. - while (!CurPPLexer->ConditionalStack.empty()) { - if (CurLexer->getFileLoc() != CodeCompletionFileLoc) - Diag(CurPPLexer->ConditionalStack.back().IfLoc, - diag::err_pp_unterminated_conditional); - CurPPLexer->ConditionalStack.pop_back(); - } - + // We don't emit errors for unterminated conditionals here, + // Lexer::LexEndOfFile can do that propertly. // Just return and let the caller lex after this #include. break; } diff --git a/clang/test/Index/preamble-conditionals-inverted-with-error.cpp b/clang/test/Index/preamble-conditionals-inverted-with-error.cpp new file mode 100644 index 000000000000..95b0695b8733 --- /dev/null +++ b/clang/test/Index/preamble-conditionals-inverted-with-error.cpp @@ -0,0 +1,8 @@ +// RUN: env CINDEXTEST_EDITING=1 c-index-test -test-load-source-reparse 5 \ +// RUN: local -std=c++14 %s 2>&1 \ +// RUN: | FileCheck %s +#ifdef FOO_H + +void foo(); + +// CHECK: preamble-conditionals-inverted-with-error.cpp:4:2: error: unterminated conditional directive diff --git a/clang/test/Index/preamble-conditionals-inverted.cpp b/clang/test/Index/preamble-conditionals-inverted.cpp new file mode 100644 index 000000000000..1d67ccb61a02 --- /dev/null +++ b/clang/test/Index/preamble-conditionals-inverted.cpp @@ -0,0 +1,8 @@ +// RUN: env CINDEXTEST_EDITING=1 c-index-test -test-load-source-reparse 5 \ +// RUN: local -std=c++14 %s 2>&1 \ +// RUN: | FileCheck %s --implicit-check-not "error:" +#ifdef FOO_H + +void foo(); + +#endif