diff options
Diffstat (limited to 'include/clang/Lex/Preprocessor.h')
| -rw-r--r-- | include/clang/Lex/Preprocessor.h | 79 | 
1 files changed, 58 insertions, 21 deletions
diff --git a/include/clang/Lex/Preprocessor.h b/include/clang/Lex/Preprocessor.h index c5981777cd291..223fd470eca1d 100644 --- a/include/clang/Lex/Preprocessor.h +++ b/include/clang/Lex/Preprocessor.h @@ -20,6 +20,7 @@  #include "clang/Basic/SourceLocation.h"  #include "clang/Lex/Lexer.h"  #include "clang/Lex/MacroInfo.h" +#include "clang/Lex/ModuleMap.h"  #include "clang/Lex/PPCallbacks.h"  #include "clang/Lex/PTHLexer.h"  #include "clang/Lex/PTHManager.h" @@ -221,7 +222,10 @@ class Preprocessor : public RefCountedBase<Preprocessor> {    /// \brief The module import path that we're currently processing.    SmallVector<std::pair<IdentifierInfo *, SourceLocation>, 2> ModuleImportPath; -   + +  /// \brief Whether the last token we lexed was an '@'. +  bool LastTokenWasAt; +    /// \brief Whether the module import expectes an identifier next. Otherwise,    /// it expects a '.' or ';'.    bool ModuleImportExpectsIdentifier; @@ -457,6 +461,10 @@ public:    /// \brief Retrieve the module loader associated with this preprocessor.    ModuleLoader &getModuleLoader() const { return TheModuleLoader; } +  bool hadModuleLoaderFatalFailure() const { +    return TheModuleLoader.HadFatalFailure; +  } +    /// \brief True if we are currently preprocessing a #if or #elif directive    bool isParsingIfOrElifDirective() const {       return ParsingIfOrElifDirective; @@ -711,17 +719,8 @@ public:    /// caching of tokens is on.    bool isBacktrackEnabled() const { return !BacktrackPositions.empty(); } -  /// Lex - To lex a token from the preprocessor, just pull a token from the -  /// current lexer or macro object. -  void Lex(Token &Result) { -    switch (CurLexerKind) { -    case CLK_Lexer: CurLexer->Lex(Result); break; -    case CLK_PTHLexer: CurPTHLexer->Lex(Result); break; -    case CLK_TokenLexer: CurTokenLexer->Lex(Result); break; -    case CLK_CachingLexer: CachingLex(Result); break; -    case CLK_LexAfterModuleImport: LexAfterModuleImport(Result); break; -    } -  } +  /// Lex - Lex the next token for this preprocessor. +  void Lex(Token &Result);    void LexAfterModuleImport(Token &Result); @@ -828,6 +827,13 @@ public:        AnnotatePreviousCachedTokens(Tok);    } +  /// Get the location of the last cached token, suitable for setting the end +  /// location of an annotation token. +  SourceLocation getLastCachedTokenLocation() const { +    assert(CachedLexPos != 0); +    return CachedTokens[CachedLexPos-1].getLocation(); +  } +    /// \brief Replace the last token with an annotation token.    ///    /// Like AnnotateCachedTokens(), this routine replaces an @@ -989,8 +995,9 @@ public:    /// \brief Relex the token at the specified location.    /// \returns true if there was a failure, false on success. -  bool getRawToken(SourceLocation Loc, Token &Result) { -    return Lexer::getRawToken(Loc, Result, SourceMgr, LangOpts); +  bool getRawToken(SourceLocation Loc, Token &Result, +                   bool IgnoreWhiteSpace = false) { +    return Lexer::getRawToken(Loc, Result, SourceMgr, LangOpts, IgnoreWhiteSpace);    }    /// getSpellingOfSingleCharacterNumericConstant - Tok is a numeric constant @@ -1155,7 +1162,10 @@ public:    /// identifier and has filled in the tokens IdentifierInfo member.  This    /// callback potentially macro expands it or turns it into a named token (like    /// 'for'). -  void HandleIdentifier(Token &Identifier); +  /// +  /// \returns true if we actually computed a token, false if we need to +  /// lex again. +  bool HandleIdentifier(Token &Identifier);    /// HandleEndOfFile - This callback is invoked when the lexer hits the end of @@ -1216,12 +1226,12 @@ public:    ///    /// Returns null on failure.  \p isAngled indicates whether the file    /// reference is for system \#include's or not (i.e. using <> instead of ""). -  const FileEntry *LookupFile(StringRef Filename, +  const FileEntry *LookupFile(SourceLocation FilenameLoc, StringRef Filename,                                bool isAngled, const DirectoryLookup *FromDir,                                const DirectoryLookup *&CurDir,                                SmallVectorImpl<char> *SearchPath,                                SmallVectorImpl<char> *RelativePath, -                              Module **SuggestedModule, +                              ModuleMap::KnownHeader *SuggestedModule,                                bool SkipCache = false);    /// GetCurLookup - The DirectoryLookup structure used to find the current @@ -1273,6 +1283,8 @@ private:      IncludeMacroStack.pop_back();    } +  void PropagateLineStartLeadingSpaceInfo(Token &Result); +    /// \brief Allocate a new MacroInfo object.    MacroInfo *AllocateMacroInfo(); @@ -1329,7 +1341,7 @@ private:    /// HandleMacroExpandedIdentifier - If an identifier token is read that is to    /// be expanded as a macro, handle it and return the next token as 'Tok'.  If -  /// the macro should not be expanded return true, otherwise return false. +  /// we lexed a token, return true; otherwise the caller should lex again.    bool HandleMacroExpandedIdentifier(Token &Tok, MacroDirective *MD);    /// \brief Cache macro expanded tokens for TokenLexers. @@ -1400,7 +1412,7 @@ private:    bool InCachingLexMode() const {      // If the Lexer pointers are 0 and IncludeMacroStack is empty, it means      // that we are past EOF, not that we are in CachingLex mode. -    return CurPPLexer == 0 && CurTokenLexer == 0 && CurPTHLexer == 0 && +    return !CurPPLexer && !CurTokenLexer && !CurPTHLexer &&             !IncludeMacroStack.empty();    }    void EnterCachingLexMode(); @@ -1432,8 +1444,32 @@ private:    void HandleImportDirective(SourceLocation HashLoc, Token &Tok);    void HandleMicrosoftImportDirective(Token &Tok); +  // Module inclusion testing. +  /// \brief Find the module for the source or header file that \p FilenameLoc +  /// points to. +  Module *getModuleForLocation(SourceLocation FilenameLoc); + +  /// \brief Verify that a private header is included only from within its +  /// module. +  bool violatesPrivateInclude(Module *RequestingModule, +                              const FileEntry *IncFileEnt, +                              ModuleMap::ModuleHeaderRole Role, +                              Module *RequestedModule); + +  /// \brief Verify that a module includes headers only from modules that it +  /// has declared that it uses. +  bool violatesUseDeclarations(Module *RequestingModule, +                               Module *RequestedModule); + +  /// \brief Verify that it is legal for the source file that \p FilenameLoc +  /// points to to include the file \p Filename. +  /// +  /// Tries to reuse \p IncFileEnt. +  void verifyModuleInclude(SourceLocation FilenameLoc, StringRef Filename, +                           const FileEntry *IncFileEnt); +    // Macro handling. -  void HandleDefineDirective(Token &Tok); +  void HandleDefineDirective(Token &Tok, bool ImmediatelyAfterTopLevelIfndef);    void HandleUndefDirective(Token &Tok);    // Conditional Inclusion. @@ -1445,7 +1481,8 @@ private:    void HandleElifDirective(Token &Tok);    // Pragmas. -  void HandlePragmaDirective(unsigned Introducer); +  void HandlePragmaDirective(SourceLocation IntroducerLoc, +                             PragmaIntroducerKind Introducer);  public:    void HandlePragmaOnce(Token &OnceTok);    void HandlePragmaMark();  | 
