diff options
Diffstat (limited to 'clang/lib/Lex/PPMacroExpansion.cpp')
| -rw-r--r-- | clang/lib/Lex/PPMacroExpansion.cpp | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp index ba2b8efe7f1..7901705fec3 100644 --- a/clang/lib/Lex/PPMacroExpansion.cpp +++ b/clang/lib/Lex/PPMacroExpansion.cpp @@ -55,9 +55,11 @@ void Preprocessor::setMacroInfo(IdentifierInfo *II, MacroInfo *MI) { II->setChangedSinceDeserialization(); } -void Preprocessor::addLoadedMacroInfo(IdentifierInfo *II, MacroInfo *MI) { +void Preprocessor::addLoadedMacroInfo(IdentifierInfo *II, MacroInfo *MI, + MacroInfo *Hint) { assert(MI && "Missing macro?"); assert(MI->isFromAST() && "Macro is not from an AST?"); + assert(!MI->getPreviousDefinition() && "Macro already in chain?"); MacroInfo *&StoredMI = Macros[II]; @@ -77,7 +79,7 @@ void Preprocessor::addLoadedMacroInfo(IdentifierInfo *II, MacroInfo *MI) { // Simple case: if this is the first actual definition, just put it at // th beginning. if (!StoredMI->isDefined()) { - MI->getFirstDefinition()->setPreviousDefinition(StoredMI); + MI->setPreviousDefinition(StoredMI); StoredMI = MI; II->setHasMacroDefinition(true); @@ -110,14 +112,16 @@ void Preprocessor::addLoadedMacroInfo(IdentifierInfo *II, MacroInfo *MI) { MI->setAmbiguous(true); // Wire this macro information into the chain. - MI->getFirstDefinition()->setPreviousDefinition( - Prev->getPreviousDefinition()); + MI->setPreviousDefinition(Prev->getPreviousDefinition()); Prev->setPreviousDefinition(MI); return; } // The macro is not a definition; put it at the end of the list. - StoredMI->getFirstDefinition()->setPreviousDefinition(MI); + MacroInfo *Prev = Hint? Hint : StoredMI; + while (Prev->getPreviousDefinition()) + Prev = Prev->getPreviousDefinition(); + Prev->setPreviousDefinition(MI); } void Preprocessor::makeLoadedMacroInfoVisible(IdentifierInfo *II, |

