diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h index 8c7b0bce3fe2..fcaf9c6a2c64 100644 --- a/clang/include/clang/Lex/Preprocessor.h +++ b/clang/include/clang/Lex/Preprocessor.h @@ -683,6 +683,10 @@ public: CachedTokens[CachedLexPos-1] = Tok; } + /// \brief Recompute the current lexer kind based on the CurLexer/CurPTHLexer/ + /// CurTokenLexer pointers. + void recomputeCurLexerKind(); + /// \brief Specify the point at which code-completion will be performed. /// /// \param File the file in which code completion should occur. If diff --git a/clang/lib/Lex/PPCaching.cpp b/clang/lib/Lex/PPCaching.cpp index 986341b98668..0d5e34f0bfec 100644 --- a/clang/lib/Lex/PPCaching.cpp +++ b/clang/lib/Lex/PPCaching.cpp @@ -42,6 +42,7 @@ void Preprocessor::Backtrack() { && "EnableBacktrackAtThisPos was not called!"); CachedLexPos = BacktrackPositions.back(); BacktrackPositions.pop_back(); + recomputeCurLexerKind(); } void Preprocessor::CachingLex(Token &Result) { @@ -74,8 +75,7 @@ void Preprocessor::EnterCachingLexMode() { return; PushIncludeMacroStack(); - if (CurLexerKind != CLK_LexAfterModuleImport) - CurLexerKind = CLK_CachingLexer; + CurLexerKind = CLK_CachingLexer; } diff --git a/clang/lib/Lex/Preprocessor.cpp b/clang/lib/Lex/Preprocessor.cpp index 046b0dfb01ab..cfa9e23e60f8 100644 --- a/clang/lib/Lex/Preprocessor.cpp +++ b/clang/lib/Lex/Preprocessor.cpp @@ -266,6 +266,17 @@ Preprocessor::macro_end(bool IncludeExternalMacros) const { return Macros.end(); } +void Preprocessor::recomputeCurLexerKind() { + if (CurLexer) + CurLexerKind = CLK_Lexer; + else if (CurPTHLexer) + CurLexerKind = CLK_PTHLexer; + else if (CurTokenLexer) + CurLexerKind = CLK_TokenLexer; + else + CurLexerKind = CLK_CachingLexer; +} + bool Preprocessor::SetCodeCompletionPoint(const FileEntry *File, unsigned CompleteLine, unsigned CompleteColumn) { @@ -550,7 +561,12 @@ void Preprocessor::HandleIdentifier(Token &Identifier) { // If this is the 'import' contextual keyword, note that the next token // indicates a module name. - if (II.isImport() && !InMacroArgs && !DisableMacroExpansion) { + // + // Note that we do not treat 'import' as a contextual keyword when we're + // in a caching lexer, because caching lexers only get used in contexts where + // import declarations are disallowed. + if (II.isImport() && !InMacroArgs && !DisableMacroExpansion && + getLangOptions().Modules && CurLexerKind != CLK_CachingLexer) { ModuleImportLoc = Identifier.getLocation(); ModuleImportPath.clear(); ModuleImportExpectsIdentifier = true; @@ -562,14 +578,7 @@ void Preprocessor::HandleIdentifier(Token &Identifier) { /// void Preprocessor::LexAfterModuleImport(Token &Result) { // Figure out what kind of lexer we actually have. - if (CurLexer) - CurLexerKind = CLK_Lexer; - else if (CurPTHLexer) - CurLexerKind = CLK_PTHLexer; - else if (CurTokenLexer) - CurLexerKind = CLK_TokenLexer; - else - CurLexerKind = CLK_CachingLexer; + recomputeCurLexerKind(); // Lex the next token. Lex(Result); diff --git a/clang/test/Modules/lookup.cpp b/clang/test/Modules/lookup.cpp index 5e84532e60ff..fdbdfd7a5cf9 100644 --- a/clang/test/Modules/lookup.cpp +++ b/clang/test/Modules/lookup.cpp @@ -15,6 +15,12 @@ void test(int i, float f) { ::f0(&f); } +int import; + +void f() { + int import; +} + // RUN: rm -rf %t // RUN: %clang_cc1 -fmodules -x objective-c++ -emit-module -fmodule-cache-path %t -fmodule-name=lookup_left_cxx %S/Inputs/module.map -verify // RUN: %clang_cc1 -fmodules -x objective-c++ -emit-module -fmodule-cache-path %t -fmodule-name=lookup_right_cxx %S/Inputs/module.map -verify