Thanks! r311591.
On Wed, Aug 23, 2017 at 12:42 PM, Richard Smith <rich...@metafoo.co.uk> wrote: > LG for branch. > > On 23 August 2017 at 11:04, Hans Wennborg via cfe-commits > <cfe-commits@lists.llvm.org> wrote: >> >> Richard: ping? >> >> On Mon, Aug 21, 2017 at 1:00 PM, Hans Wennborg <h...@chromium.org> wrote: >> > Nikolai suggested this should be merged to 5.0. Richard, what do you >> > think? >> > >> > On Mon, Aug 21, 2017 at 5:03 AM, Ilya Biryukov via cfe-commits >> > <cfe-commits@lists.llvm.org> wrote: >> >> Author: ibiryukov >> >> Date: Mon Aug 21 05:03:08 2017 >> >> New Revision: 311330 >> >> >> >> URL: http://llvm.org/viewvc/llvm-project?rev=311330&view=rev >> >> Log: >> >> Fixed a crash on replaying Preamble's PP conditional stack. >> >> >> >> Summary: >> >> The crash occurs when the first token after a preamble is a macro >> >> expansion. >> >> Fixed by moving replayPreambleConditionalStack from Parser into >> >> Preprocessor. It is now called right after the predefines file is >> >> processed. >> >> >> >> Reviewers: erikjv, bkramer, klimek, yvvan >> >> >> >> Reviewed By: bkramer >> >> >> >> Subscribers: cfe-commits >> >> >> >> Differential Revision: https://reviews.llvm.org/D36872 >> >> >> >> Added: >> >> cfe/trunk/test/Index/preamble-conditionals-crash.cpp >> >> cfe/trunk/test/Index/preamble-conditionals.cpp >> >> Modified: >> >> cfe/trunk/include/clang/Lex/Preprocessor.h >> >> cfe/trunk/lib/Lex/PPLexerChange.cpp >> >> cfe/trunk/lib/Lex/Preprocessor.cpp >> >> cfe/trunk/lib/Parse/Parser.cpp >> >> >> >> Modified: cfe/trunk/include/clang/Lex/Preprocessor.h >> >> URL: >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/Preprocessor.h?rev=311330&r1=311329&r2=311330&view=diff >> >> >> >> ============================================================================== >> >> --- cfe/trunk/include/clang/Lex/Preprocessor.h (original) >> >> +++ cfe/trunk/include/clang/Lex/Preprocessor.h Mon Aug 21 05:03:08 2017 >> >> @@ -1049,10 +1049,6 @@ public: >> >> /// which implicitly adds the builtin defines etc. >> >> void EnterMainSourceFile(); >> >> >> >> - /// \brief After parser warm-up, initialize the conditional stack >> >> from >> >> - /// the preamble. >> >> - void replayPreambleConditionalStack(); >> >> - >> >> /// \brief Inform the preprocessor callbacks that processing is >> >> complete. >> >> void EndSourceFile(); >> >> >> >> @@ -2026,6 +2022,10 @@ public: >> >> } >> >> >> >> private: >> >> + /// \brief After processing predefined file, initialize the >> >> conditional stack from >> >> + /// the preamble. >> >> + void replayPreambleConditionalStack(); >> >> + >> >> // Macro handling. >> >> void HandleDefineDirective(Token &Tok, bool >> >> ImmediatelyAfterTopLevelIfndef); >> >> void HandleUndefDirective(); >> >> >> >> Modified: cfe/trunk/lib/Lex/PPLexerChange.cpp >> >> URL: >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPLexerChange.cpp?rev=311330&r1=311329&r2=311330&view=diff >> >> >> >> ============================================================================== >> >> --- cfe/trunk/lib/Lex/PPLexerChange.cpp (original) >> >> +++ cfe/trunk/lib/Lex/PPLexerChange.cpp Mon Aug 21 05:03:08 2017 >> >> @@ -458,10 +458,16 @@ bool Preprocessor::HandleEndOfFile(Token >> >> SourceMgr.setNumCreatedFIDsForFileID(CurPPLexer->getFileID(), >> >> NumFIDs); >> >> } >> >> >> >> + bool ExitedFromPredefinesFile = false; >> >> FileID ExitedFID; >> >> - if (Callbacks && !isEndOfMacro && CurPPLexer) >> >> + if (!isEndOfMacro && CurPPLexer) { >> >> ExitedFID = CurPPLexer->getFileID(); >> >> >> >> + assert(PredefinesFileID.isValid() && >> >> + "HandleEndOfFile is called before PredefinesFileId is >> >> set"); >> >> + ExitedFromPredefinesFile = (PredefinesFileID == ExitedFID); >> >> + } >> >> + >> >> if (LeavingSubmodule) { >> >> // We're done with this submodule. >> >> Module *M = LeaveSubmodule(/*ForPragma*/false); >> >> @@ -489,6 +495,11 @@ bool Preprocessor::HandleEndOfFile(Token >> >> PPCallbacks::ExitFile, FileType, >> >> ExitedFID); >> >> } >> >> >> >> + // Restore conditional stack from the preamble right after exiting >> >> from the >> >> + // predefines file. >> >> + if (ExitedFromPredefinesFile) >> >> + replayPreambleConditionalStack(); >> >> + >> >> // Client should lex another token unless we generated an EOM. >> >> return LeavingSubmodule; >> >> } >> >> >> >> Modified: cfe/trunk/lib/Lex/Preprocessor.cpp >> >> URL: >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Preprocessor.cpp?rev=311330&r1=311329&r2=311330&view=diff >> >> >> >> ============================================================================== >> >> --- cfe/trunk/lib/Lex/Preprocessor.cpp (original) >> >> +++ cfe/trunk/lib/Lex/Preprocessor.cpp Mon Aug 21 05:03:08 2017 >> >> @@ -540,6 +540,8 @@ void Preprocessor::EnterMainSourceFile() >> >> void Preprocessor::replayPreambleConditionalStack() { >> >> // Restore the conditional stack from the preamble, if there is one. >> >> if (PreambleConditionalStack.isReplaying()) { >> >> + assert(CurPPLexer && >> >> + "CurPPLexer is null when calling >> >> replayPreambleConditionalStack."); >> >> >> >> CurPPLexer->setConditionalLevels(PreambleConditionalStack.getStack()); >> >> PreambleConditionalStack.doneReplaying(); >> >> } >> >> >> >> Modified: cfe/trunk/lib/Parse/Parser.cpp >> >> URL: >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/Parser.cpp?rev=311330&r1=311329&r2=311330&view=diff >> >> >> >> ============================================================================== >> >> --- cfe/trunk/lib/Parse/Parser.cpp (original) >> >> +++ cfe/trunk/lib/Parse/Parser.cpp Mon Aug 21 05:03:08 2017 >> >> @@ -516,8 +516,6 @@ void Parser::Initialize() { >> >> >> >> // Prime the lexer look-ahead. >> >> ConsumeToken(); >> >> - >> >> - PP.replayPreambleConditionalStack(); >> >> } >> >> >> >> void Parser::LateTemplateParserCleanupCallback(void *P) { >> >> >> >> Added: cfe/trunk/test/Index/preamble-conditionals-crash.cpp >> >> URL: >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/preamble-conditionals-crash.cpp?rev=311330&view=auto >> >> >> >> ============================================================================== >> >> --- cfe/trunk/test/Index/preamble-conditionals-crash.cpp (added) >> >> +++ cfe/trunk/test/Index/preamble-conditionals-crash.cpp Mon Aug 21 >> >> 05:03:08 2017 >> >> @@ -0,0 +1,12 @@ >> >> +#ifndef HEADER_GUARD >> >> + >> >> +#define FOO int aba; >> >> +FOO >> >> + >> >> +#endif >> >> +// 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 "libclang: crash detected" >> >> \ >> >> +// RUN: --implicit-check-not "error:" >> >> +// CHECK: macro expansion=FOO:3:9 Extent=[4:1 - 4:4] >> >> +// CHECK: VarDecl=aba:4:1 (Definition) Extent=[4:1 - 4:4] >> >> >> >> Added: cfe/trunk/test/Index/preamble-conditionals.cpp >> >> URL: >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/preamble-conditionals.cpp?rev=311330&view=auto >> >> >> >> ============================================================================== >> >> --- cfe/trunk/test/Index/preamble-conditionals.cpp (added) >> >> +++ cfe/trunk/test/Index/preamble-conditionals.cpp Mon Aug 21 05:03:08 >> >> 2017 >> >> @@ -0,0 +1,8 @@ >> >> +// RUN: env CINDEXTEST_EDITING=1 c-index-test -test-load-source local >> >> %s 2>&1 \ >> >> +// RUN: | FileCheck %s --implicit-check-not "error:" >> >> +#ifndef FOO_H >> >> +#define FOO_H >> >> + >> >> +void foo(); >> >> + >> >> +#endif >> >> >> >> >> >> _______________________________________________ >> >> cfe-commits mailing list >> >> cfe-commits@lists.llvm.org >> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >> _______________________________________________ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > > _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits