Author: Ben Barham Date: 2023-09-11T17:40:43-07:00 New Revision: 4c264c26d726f594c4618e4bfeac93d403de893f
URL: https://github.com/llvm/llvm-project/commit/4c264c26d726f594c4618e4bfeac93d403de893f DIFF: https://github.com/llvm/llvm-project/commit/4c264c26d726f594c4618e4bfeac93d403de893f.diff LOG: [Parse] Split incremental-extensions (#65683) The preprocessor `IncrementalProcessing` option was being used to control whether or not to teardown the lexer or run the end of translation unit action. In D127284 this was merged with `-fincremental-extensions`, which also changes top level parsing. Split these again so that the former behavior can be achieved without the latter (ie. to allow managing lifetime without also changing parsing). Resolves rdar://113406310. Added: Modified: clang/include/clang/Lex/Preprocessor.h clang/lib/Lex/PPLexerChange.cpp clang/lib/Lex/Preprocessor.cpp clang/lib/Parse/Parser.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h index bc1d94a61508d8d..575d08b83fd3a02 100644 --- a/clang/include/clang/Lex/Preprocessor.h +++ b/clang/include/clang/Lex/Preprocessor.h @@ -277,6 +277,9 @@ class Preprocessor { /// Empty line handler. EmptylineHandler *Emptyline = nullptr; + /// True to avoid tearing down the lexer etc on EOF + bool IncrementalProcessing = false; + public: /// The kind of translation unit we are processing. const TranslationUnitKind TUKind; @@ -1910,14 +1913,11 @@ class Preprocessor { void recomputeCurLexerKind(); /// Returns true if incremental processing is enabled - bool isIncrementalProcessingEnabled() const { - return getLangOpts().IncrementalExtensions; - } + bool isIncrementalProcessingEnabled() const { return IncrementalProcessing; } /// Enables the incremental processing void enableIncrementalProcessing(bool value = true) { - // FIXME: Drop this interface. - const_cast<LangOptions &>(getLangOpts()).IncrementalExtensions = value; + IncrementalProcessing = value; } /// Specify the point at which code-completion will be performed. diff --git a/clang/lib/Lex/PPLexerChange.cpp b/clang/lib/Lex/PPLexerChange.cpp index ab005381adfaf2c..811a760420e0a2d 100644 --- a/clang/lib/Lex/PPLexerChange.cpp +++ b/clang/lib/Lex/PPLexerChange.cpp @@ -541,7 +541,7 @@ bool Preprocessor::HandleEndOfFile(Token &Result, bool isEndOfMacro) { Result.startToken(); CurLexer->BufferPtr = EndPos; - if (isIncrementalProcessingEnabled()) { + if (getLangOpts().IncrementalExtensions) { CurLexer->FormTokenWithChars(Result, EndPos, tok::annot_repl_input_end); Result.setAnnotationEndLoc(Result.getLocation()); Result.setAnnotationValue(nullptr); diff --git a/clang/lib/Lex/Preprocessor.cpp b/clang/lib/Lex/Preprocessor.cpp index 8de78a13930ed62..f0381c18a8b6f77 100644 --- a/clang/lib/Lex/Preprocessor.cpp +++ b/clang/lib/Lex/Preprocessor.cpp @@ -146,6 +146,10 @@ Preprocessor::Preprocessor(std::shared_ptr<PreprocessorOptions> PPOpts, Ident_AbnormalTermination = nullptr; } + // Default incremental processing to -fincremental-extensions, clients can + // override with `enableIncrementalProcessing` if desired. + IncrementalProcessing = LangOpts.IncrementalExtensions; + // If using a PCH where a #pragma hdrstop is expected, start skipping tokens. if (usingPCHWithPragmaHdrStop()) SkippingUntilPragmaHdrStop = true; diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp index 09215b8303ecf9c..858b6439df5122a 100644 --- a/clang/lib/Parse/Parser.cpp +++ b/clang/lib/Parse/Parser.cpp @@ -615,6 +615,11 @@ bool Parser::ParseTopLevelDecl(DeclGroupPtrTy &Result, Sema::ModuleImportState &ImportState) { DestroyTemplateIdAnnotationsRAIIObj CleanupRAII(*this); + // Skip over the EOF token, flagging end of previous input for incremental + // processing + if (PP.isIncrementalProcessingEnabled() && Tok.is(tok::eof)) + ConsumeToken(); + Result = nullptr; switch (Tok.getKind()) { case tok::annot_pragma_unused: @@ -706,7 +711,8 @@ bool Parser::ParseTopLevelDecl(DeclGroupPtrTy &Result, // Late template parsing can begin. Actions.SetLateTemplateParser(LateTemplateParserCallback, nullptr, this); - Actions.ActOnEndOfTranslationUnit(); + if (!PP.isIncrementalProcessingEnabled()) + Actions.ActOnEndOfTranslationUnit(); //else don't tell Sema that we ended parsing: more input might come. return true; @@ -1038,7 +1044,7 @@ Parser::ParseExternalDeclaration(ParsedAttributes &Attrs, ConsumeToken(); return nullptr; } - if (PP.isIncrementalProcessingEnabled() && + if (getLangOpts().IncrementalExtensions && !isDeclarationStatement(/*DisambiguatingWithExpression=*/true)) return ParseTopLevelStmtDecl(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits