diff options
Diffstat (limited to 'lib/Lex/Preprocessor.cpp')
| -rw-r--r-- | lib/Lex/Preprocessor.cpp | 95 | 
1 files changed, 51 insertions, 44 deletions
diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp index 7979be773aa1..c291a4b99d10 100644 --- a/lib/Lex/Preprocessor.cpp +++ b/lib/Lex/Preprocessor.cpp @@ -1,4 +1,4 @@ -//===--- Preprocess.cpp - C Language Family Preprocessor Implementation ---===// +//===- Preprocess.cpp - C Language Family Preprocessor Implementation -----===//  //  //                     The LLVM Compiler Infrastructure  // @@ -28,22 +28,33 @@  #include "clang/Lex/Preprocessor.h"  #include "clang/Basic/FileManager.h"  #include "clang/Basic/FileSystemStatCache.h" +#include "clang/Basic/IdentifierTable.h" +#include "clang/Basic/LLVM.h" +#include "clang/Basic/LangOptions.h" +#include "clang/Basic/Module.h" +#include "clang/Basic/SourceLocation.h"  #include "clang/Basic/SourceManager.h"  #include "clang/Basic/TargetInfo.h"  #include "clang/Lex/CodeCompletionHandler.h"  #include "clang/Lex/ExternalPreprocessorSource.h"  #include "clang/Lex/HeaderSearch.h"  #include "clang/Lex/LexDiagnostic.h" +#include "clang/Lex/Lexer.h"  #include "clang/Lex/LiteralSupport.h"  #include "clang/Lex/MacroArgs.h"  #include "clang/Lex/MacroInfo.h"  #include "clang/Lex/ModuleLoader.h" +#include "clang/Lex/PTHLexer.h"  #include "clang/Lex/PTHManager.h"  #include "clang/Lex/Pragma.h"  #include "clang/Lex/PreprocessingRecord.h" +#include "clang/Lex/PreprocessorLexer.h"  #include "clang/Lex/PreprocessorOptions.h"  #include "clang/Lex/ScratchBuffer.h" +#include "clang/Lex/Token.h" +#include "clang/Lex/TokenLexer.h"  #include "llvm/ADT/APInt.h" +#include "llvm/ADT/ArrayRef.h"  #include "llvm/ADT/DenseMap.h"  #include "llvm/ADT/SmallString.h"  #include "llvm/ADT/SmallVector.h" @@ -65,8 +76,7 @@ using namespace clang;  LLVM_INSTANTIATE_REGISTRY(PragmaHandlerRegistry) -//===----------------------------------------------------------------------===// -ExternalPreprocessorSource::~ExternalPreprocessorSource() { } +ExternalPreprocessorSource::~ExternalPreprocessorSource() = default;  Preprocessor::Preprocessor(std::shared_ptr<PreprocessorOptions> PPOpts,                             DiagnosticsEngine &diags, LangOptions &opts, @@ -74,34 +84,16 @@ Preprocessor::Preprocessor(std::shared_ptr<PreprocessorOptions> PPOpts,                             HeaderSearch &Headers, ModuleLoader &TheModuleLoader,                             IdentifierInfoLookup *IILookup, bool OwnsHeaders,                             TranslationUnitKind TUKind) -    : PPOpts(std::move(PPOpts)), Diags(&diags), LangOpts(opts), Target(nullptr), -      AuxTarget(nullptr), FileMgr(Headers.getFileMgr()), SourceMgr(SM), +    : PPOpts(std::move(PPOpts)), Diags(&diags), LangOpts(opts), +      FileMgr(Headers.getFileMgr()), SourceMgr(SM),        PCMCache(PCMCache), ScratchBuf(new ScratchBuffer(SourceMgr)),        HeaderInfo(Headers), TheModuleLoader(TheModuleLoader),        ExternalSource(nullptr), Identifiers(opts, IILookup), -      PragmaHandlers(new PragmaNamespace(StringRef())), -      IncrementalProcessing(false), TUKind(TUKind), CodeComplete(nullptr), -      CodeCompletionFile(nullptr), CodeCompletionOffset(0), -      LastTokenWasAt(false), ModuleImportExpectsIdentifier(false), -      CodeCompletionReached(false), CodeCompletionII(nullptr), -      MainFileDir(nullptr), SkipMainFilePreamble(0, true), CurPPLexer(nullptr), -      CurDirLookup(nullptr), CurLexerKind(CLK_Lexer), -      CurLexerSubmodule(nullptr), Callbacks(nullptr), -      CurSubmoduleState(&NullSubmoduleState), MacroArgCache(nullptr), -      Record(nullptr), MIChainHead(nullptr) { +      PragmaHandlers(new PragmaNamespace(StringRef())), TUKind(TUKind), +      SkipMainFilePreamble(0, true), +      CurSubmoduleState(&NullSubmoduleState) {    OwnsHeaderSearch = OwnsHeaders; -  CounterValue = 0; // __COUNTER__ starts at 0. -   -  // Clear stats. -  NumDirectives = NumDefined = NumUndefined = NumPragma = 0; -  NumIf = NumElse = NumEndif = 0; -  NumEnteredSourceFiles = 0; -  NumMacroExpanded = NumFnMacroExpanded = NumBuiltinMacroExpanded = 0; -  NumFastMacroExpanded = NumTokenPaste = NumFastTokenPaste = 0; -  MaxIncludeStackDepth = 0; -  NumSkipped = 0; -      // Default to discarding comments.    KeepComments = false;    KeepMacroComments = false; @@ -117,16 +109,20 @@ Preprocessor::Preprocessor(std::shared_ptr<PreprocessorOptions> PPOpts,    ParsingIfOrElifDirective = false;    PreprocessedOutput = false; -  CachedLexPos = 0; -    // We haven't read anything from the external source.    ReadMacrosFromExternalSource = false; -   -  // "Poison" __VA_ARGS__, which can only appear in the expansion of a macro. -  // This gets unpoisoned where it is allowed. + +  // "Poison" __VA_ARGS__, __VA_OPT__ which can only appear in the expansion of +  // a macro. They get unpoisoned where it is allowed.    (Ident__VA_ARGS__ = getIdentifierInfo("__VA_ARGS__"))->setIsPoisoned();    SetPoisonReason(Ident__VA_ARGS__,diag::ext_pp_bad_vaargs_use); -   +  if (getLangOpts().CPlusPlus2a) { +    (Ident__VA_OPT__ = getIdentifierInfo("__VA_OPT__"))->setIsPoisoned(); +    SetPoisonReason(Ident__VA_OPT__,diag::ext_pp_bad_vaopt_use); +  } else { +    Ident__VA_OPT__ = nullptr; +  } +    // Initialize the pragma handlers.    RegisterBuiltinPragmas(); @@ -516,9 +512,9 @@ void Preprocessor::EnterMainSourceFile() {      // If we've been asked to skip bytes in the main file (e.g., as part of a      // precompiled preamble), do so now.      if (SkipMainFilePreamble.first > 0) -      CurLexer->SkipBytes(SkipMainFilePreamble.first,  -                          SkipMainFilePreamble.second); -     +      CurLexer->SetByteOffset(SkipMainFilePreamble.first, +                              SkipMainFilePreamble.second); +      // Tell the header info that the main file was entered.  If the file is later      // #imported, it won't be re-entered.      if (const FileEntry *FE = SourceMgr.getFileEntryForID(MainFileID)) @@ -544,6 +540,13 @@ void Preprocessor::replayPreambleConditionalStack() {             "CurPPLexer is null when calling replayPreambleConditionalStack.");      CurPPLexer->setConditionalLevels(PreambleConditionalStack.getStack());      PreambleConditionalStack.doneReplaying(); +    if (PreambleConditionalStack.reachedEOFWhileSkipping()) +      SkipExcludedConditionalBlock( +          PreambleConditionalStack.SkipInfo->HashTokenLoc, +          PreambleConditionalStack.SkipInfo->IfTokenLoc, +          PreambleConditionalStack.SkipInfo->FoundNonSkipPortion, +          PreambleConditionalStack.SkipInfo->FoundElse, +          PreambleConditionalStack.SkipInfo->ElseLoc);    }  } @@ -586,7 +589,7 @@ IdentifierInfo *Preprocessor::LookUpIdentifierInfo(Token &Identifier) const {    Identifier.setIdentifierInfo(II);    if (getLangOpts().MSVCCompat && II->isCPlusPlusOperatorKeyword() &&        getSourceManager().isInSystemHeader(Identifier.getLocation())) -    Identifier.setKind(clang::tok::identifier); +    Identifier.setKind(tok::identifier);    else      Identifier.setKind(II->getTokenID()); @@ -632,6 +635,8 @@ static diag::kind getFutureCompatDiagKind(const IdentifierInfo &II,      return llvm::StringSwitch<diag::kind>(II.getName())  #define CXX11_KEYWORD(NAME, FLAGS)                                             \          .Case(#NAME, diag::warn_cxx11_keyword) +#define CXX2A_KEYWORD(NAME, FLAGS)                                             \ +        .Case(#NAME, diag::warn_cxx2a_keyword)  #include "clang/Basic/TokenKinds.def"          ; @@ -665,13 +670,15 @@ bool Preprocessor::HandleIdentifier(Token &Identifier) {    // unpoisoned it if we're defining a C99 macro.    if (II.isOutOfDate()) {      bool CurrentIsPoisoned = false; -    if (&II == Ident__VA_ARGS__) -      CurrentIsPoisoned = Ident__VA_ARGS__->isPoisoned(); +    const bool IsSpecialVariadicMacro = +        &II == Ident__VA_ARGS__ || &II == Ident__VA_OPT__; +    if (IsSpecialVariadicMacro) +      CurrentIsPoisoned = II.isPoisoned();      updateOutOfDateIdentifier(II);      Identifier.setKind(II.getTokenID()); -    if (&II == Ident__VA_ARGS__) +    if (IsSpecialVariadicMacro)        II.setIsPoisoned(CurrentIsPoisoned);    } @@ -924,8 +931,8 @@ void Preprocessor::addCommentHandler(CommentHandler *Handler) {  }  void Preprocessor::removeCommentHandler(CommentHandler *Handler) { -  std::vector<CommentHandler *>::iterator Pos -  = std::find(CommentHandlers.begin(), CommentHandlers.end(), Handler); +  std::vector<CommentHandler *>::iterator Pos = +      std::find(CommentHandlers.begin(), CommentHandlers.end(), Handler);    assert(Pos != CommentHandlers.end() && "Comment handler not registered");    CommentHandlers.erase(Pos);  } @@ -944,11 +951,11 @@ bool Preprocessor::HandleComment(Token &result, SourceRange Comment) {    return true;  } -ModuleLoader::~ModuleLoader() { } +ModuleLoader::~ModuleLoader() = default; -CommentHandler::~CommentHandler() { } +CommentHandler::~CommentHandler() = default; -CodeCompletionHandler::~CodeCompletionHandler() { } +CodeCompletionHandler::~CodeCompletionHandler() = default;  void Preprocessor::createPreprocessingRecord() {    if (Record)  | 
