diff options
Diffstat (limited to 'lib/Lex')
-rw-r--r-- | lib/Lex/MacroInfo.cpp | 74 | ||||
-rw-r--r-- | lib/Lex/PPDirectives.cpp | 11 | ||||
-rw-r--r-- | lib/Lex/PPMacroExpansion.cpp | 23 | ||||
-rw-r--r-- | lib/Lex/Pragma.cpp | 6 |
4 files changed, 55 insertions, 59 deletions
diff --git a/lib/Lex/MacroInfo.cpp b/lib/Lex/MacroInfo.cpp index 3d0c9a1c2b..7a4964f7d2 100644 --- a/lib/Lex/MacroInfo.cpp +++ b/lib/Lex/MacroInfo.cpp @@ -15,44 +15,46 @@ #include "clang/Lex/Preprocessor.h" using namespace clang; -MacroInfo::MacroInfo(SourceLocation DefLoc) : Location(DefLoc) { - IsFunctionLike = false; - IsC99Varargs = false; - IsGNUVarargs = false; - IsBuiltinMacro = false; - IsFromAST = false; - ChangedAfterLoad = false; - IsDisabled = false; - IsUsed = false; - IsAllowRedefinitionsWithoutWarning = false; - IsWarnIfUnused = false; - IsDefinitionLengthCached = false; - IsPublic = true; - - ArgumentList = 0; - NumArguments = 0; +MacroInfo::MacroInfo(SourceLocation DefLoc) + : Location(DefLoc), + PreviousDefinition(0), + ArgumentList(0), + NumArguments(0), + IsDefinitionLengthCached(false), + IsFunctionLike(false), + IsC99Varargs(false), + IsGNUVarargs(false), + IsBuiltinMacro(false), + IsFromAST(false), + ChangedAfterLoad(false), + IsDisabled(false), + IsUsed(false), + IsAllowRedefinitionsWithoutWarning(false), + IsWarnIfUnused(false), + IsPublic(true) { } -MacroInfo::MacroInfo(const MacroInfo &MI, llvm::BumpPtrAllocator &PPAllocator) { - Location = MI.Location; - EndLocation = MI.EndLocation; - ReplacementTokens = MI.ReplacementTokens; - IsFunctionLike = MI.IsFunctionLike; - IsC99Varargs = MI.IsC99Varargs; - IsGNUVarargs = MI.IsGNUVarargs; - IsBuiltinMacro = MI.IsBuiltinMacro; - IsFromAST = MI.IsFromAST; - ChangedAfterLoad = MI.ChangedAfterLoad; - IsDisabled = MI.IsDisabled; - IsUsed = MI.IsUsed; - IsAllowRedefinitionsWithoutWarning = MI.IsAllowRedefinitionsWithoutWarning; - IsWarnIfUnused = MI.IsWarnIfUnused; - IsDefinitionLengthCached = MI.IsDefinitionLengthCached; - DefinitionLength = MI.DefinitionLength; - IsPublic = MI.IsPublic; - - ArgumentList = 0; - NumArguments = 0; +MacroInfo::MacroInfo(const MacroInfo &MI, llvm::BumpPtrAllocator &PPAllocator) + : Location(MI.Location), + EndLocation(MI.EndLocation), + UndefLocation(MI.UndefLocation), + PreviousDefinition(0), + ArgumentList(0), + NumArguments(0), + ReplacementTokens(MI.ReplacementTokens), + DefinitionLength(MI.DefinitionLength), + IsDefinitionLengthCached(MI.IsDefinitionLengthCached), + IsFunctionLike(MI.IsFunctionLike), + IsC99Varargs(MI.IsC99Varargs), + IsGNUVarargs(MI.IsGNUVarargs), + IsBuiltinMacro(MI.IsBuiltinMacro), + IsFromAST(MI.IsFromAST), + ChangedAfterLoad(MI.ChangedAfterLoad), + IsDisabled(MI.IsDisabled), + IsUsed(MI.IsUsed), + IsAllowRedefinitionsWithoutWarning(MI.IsAllowRedefinitionsWithoutWarning), + IsWarnIfUnused(MI.IsWarnIfUnused), + IsPublic(MI.IsPublic) { setArgumentList(MI.ArgumentList, MI.NumArguments, PPAllocator); } diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp index 74b9cbc881..6de0e4a9f3 100644 --- a/lib/Lex/PPDirectives.cpp +++ b/lib/Lex/PPDirectives.cpp @@ -1849,7 +1849,7 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok) { MI->setDefinitionEndLoc(LastTok.getLocation()); // Finally, if this identifier already had a macro defined for it, verify that - // the macro bodies are identical and free the old definition. + // the macro bodies are identical, and issue diagnostics if they are not. if (MacroInfo *OtherMI = getMacroInfo(MacroNameTok.getIdentifierInfo())) { // It is very common for system headers to have tons of macro redefinitions // and for warnings to be disabled in system headers. If this is the case, @@ -1870,7 +1870,6 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok) { } if (OtherMI->isWarnIfUnused()) WarnUnusedMacroLocs.erase(OtherMI->getDefinitionLoc()); - ReleaseMacroInfo(OtherMI); } setMacroInfo(MacroNameTok.getIdentifierInfo(), MI); @@ -1921,9 +1920,11 @@ void Preprocessor::HandleUndefDirective(Token &UndefTok) { if (MI->isWarnIfUnused()) WarnUnusedMacroLocs.erase(MI->getDefinitionLoc()); - // Free macro definition. - ReleaseMacroInfo(MI); - setMacroInfo(MacroNameTok.getIdentifierInfo(), 0); + MI->setUndefLoc(MacroNameTok.getLocation()); + IdentifierInfo *II = MacroNameTok.getIdentifierInfo(); + II->setHasMacroDefinition(false); + if (II->isFromAST()) + II->setChangedSinceDeserialization(); } diff --git a/lib/Lex/PPMacroExpansion.cpp b/lib/Lex/PPMacroExpansion.cpp index 96d6b2c729..936b37009c 100644 --- a/lib/Lex/PPMacroExpansion.cpp +++ b/lib/Lex/PPMacroExpansion.cpp @@ -33,15 +33,15 @@ using namespace clang; MacroInfo *Preprocessor::getInfoForMacro(IdentifierInfo *II) const { assert(II->hasMacroDefinition() && "Identifier is not a macro!"); - - llvm::DenseMap<IdentifierInfo*, MacroInfo*>::const_iterator Pos - = Macros.find(II); + + macro_iterator Pos = Macros.find(II); if (Pos == Macros.end()) { // Load this macro from the external source. getExternalSource()->LoadMacroDefinition(II); Pos = Macros.find(II); } assert(Pos != Macros.end() && "Identifier macro info is missing!"); + assert(Pos->second->getUndefLoc().isInvalid() && "Macro is undefined!"); return Pos->second; } @@ -49,17 +49,12 @@ MacroInfo *Preprocessor::getInfoForMacro(IdentifierInfo *II) const { /// void Preprocessor::setMacroInfo(IdentifierInfo *II, MacroInfo *MI, bool LoadedFromAST) { - if (MI) { - Macros[II] = MI; - II->setHasMacroDefinition(true); - if (II->isFromAST() && !LoadedFromAST) - II->setChangedSinceDeserialization(); - } else if (II->hasMacroDefinition()) { - Macros.erase(II); - II->setHasMacroDefinition(false); - if (II->isFromAST() && !LoadedFromAST) - II->setChangedSinceDeserialization(); - } + assert(MI && "MacroInfo should be non-zero!"); + MI->setPreviousDefinition(Macros[II]); + Macros[II] = MI; + II->setHasMacroDefinition(true); + if (II->isFromAST() && !LoadedFromAST) + II->setChangedSinceDeserialization(); } /// RegisterBuiltinMacro - Register the specified identifier in the identifier diff --git a/lib/Lex/Pragma.cpp b/lib/Lex/Pragma.cpp index b7f7d1d4a9..acf5c74556 100644 --- a/lib/Lex/Pragma.cpp +++ b/lib/Lex/Pragma.cpp @@ -733,12 +733,10 @@ void Preprocessor::HandlePragmaPopMacro(Token &PopMacroTok) { llvm::DenseMap<IdentifierInfo*, std::vector<MacroInfo*> >::iterator iter = PragmaPushMacroInfo.find(IdentInfo); if (iter != PragmaPushMacroInfo.end()) { - // Release the MacroInfo currently associated with IdentInfo. - MacroInfo *CurrentMI = getMacroInfo(IdentInfo); - if (CurrentMI) { + // Forget the MacroInfo currently associated with IdentInfo. + if (MacroInfo *CurrentMI = getMacroInfo(IdentInfo)) { if (CurrentMI->isWarnIfUnused()) WarnUnusedMacroLocs.erase(CurrentMI->getDefinitionLoc()); - ReleaseMacroInfo(CurrentMI); } // Get the MacroInfo we want to reinstall. |