diff --git a/clang/include/clang/Lex/Lexer.h b/clang/include/clang/Lex/Lexer.h index 3542ff4bc721..47a73fbd23e5 100644 --- a/clang/include/clang/Lex/Lexer.h +++ b/clang/include/clang/Lex/Lexer.h @@ -113,6 +113,9 @@ public: // file is reached. LexTokenInternal(Result); } + + /// isPragmaLexer - Returns true if this Lexer is being used to lex a pragma. + bool isPragmaLexer() const { return Is_PragmaLexer; } /// IndirectLex - An indirect call to 'Lex' that can be invoked via /// the PreprocessorLexer interface. diff --git a/clang/lib/Lex/PPLexerChange.cpp b/clang/lib/Lex/PPLexerChange.cpp index 3b63c9bb094c..87330983d658 100644 --- a/clang/lib/Lex/PPLexerChange.cpp +++ b/clang/lib/Lex/PPLexerChange.cpp @@ -19,27 +19,33 @@ #include "clang/Basic/SourceManager.h" using namespace clang; -PPCallbacks::~PPCallbacks() { -} - +PPCallbacks::~PPCallbacks() {} //===----------------------------------------------------------------------===// // Miscellaneous Methods. //===----------------------------------------------------------------------===// +static inline bool IsNonPragmaNonMacroLexer(const Lexer* L, + const PreprocessorLexer* P) { + if (L) + return !L->isPragmaLexer(); + else + return P != 0; +} + /// isInPrimaryFile - Return true if we're in the top-level file, not in a /// #include. This looks through macro expansions and active _Pragma lexers. bool Preprocessor::isInPrimaryFile() const { - if (CurLexer && !CurLexer->Is_PragmaLexer) + if (IsNonPragmaNonMacroLexer(CurLexer.get(), CurPPLexer)) return IncludeMacroStack.empty(); // If there are any stacked lexers, we're in a #include. - assert(IncludeMacroStack[0].TheLexer && - !IncludeMacroStack[0].TheLexer->Is_PragmaLexer && + assert(IsNonPragmaNonMacroLexer(IncludeMacroStack[0].TheLexer, + IncludeMacroStack[0].ThePPLexer) && "Top level include stack isn't our primary lexer?"); for (unsigned i = 1, e = IncludeMacroStack.size(); i != e; ++i) - if (IncludeMacroStack[i].TheLexer && - !IncludeMacroStack[i].TheLexer->Is_PragmaLexer) + if (IsNonPragmaNonMacroLexer(IncludeMacroStack[i].TheLexer, + IncludeMacroStack[i].ThePPLexer)) return false; return true; }