diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2013-01-18 20:59:01 +0000 |
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2013-01-18 20:59:01 +0000 |
| commit | 8bee90d5f33f49d4ebcb89aac780916fe3bfc65d (patch) | |
| tree | fb2fe9e216a337412b0679ec3462aac9ab82d938 /clang/lib/Lex | |
| parent | 86c2c564ff88e4877ef0c0d89a5dc04fccbc6ace (diff) | |
| download | bcm5719-llvm-8bee90d5f33f49d4ebcb89aac780916fe3bfc65d.tar.gz bcm5719-llvm-8bee90d5f33f49d4ebcb89aac780916fe3bfc65d.zip | |
[PCH/Modules] Re-apply r172620 and r172629, now with 100% less infinite loops!
Makes sure that a deserialized macro is only added to the preprocessor macro definitions only once.
Unfortunately I couldn't get a reduced test case.
rdar://13016031
llvm-svn: 172843
Diffstat (limited to 'clang/lib/Lex')
| -rw-r--r-- | clang/lib/Lex/PPMacroExpansion.cpp | 14 |
1 files changed, 5 insertions, 9 deletions
diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp index 7901705fec3..ba2b8efe7f1 100644 --- a/clang/lib/Lex/PPMacroExpansion.cpp +++ b/clang/lib/Lex/PPMacroExpansion.cpp @@ -55,11 +55,9 @@ void Preprocessor::setMacroInfo(IdentifierInfo *II, MacroInfo *MI) { II->setChangedSinceDeserialization(); } -void Preprocessor::addLoadedMacroInfo(IdentifierInfo *II, MacroInfo *MI, - MacroInfo *Hint) { +void Preprocessor::addLoadedMacroInfo(IdentifierInfo *II, MacroInfo *MI) { assert(MI && "Missing macro?"); assert(MI->isFromAST() && "Macro is not from an AST?"); - assert(!MI->getPreviousDefinition() && "Macro already in chain?"); MacroInfo *&StoredMI = Macros[II]; @@ -79,7 +77,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->setPreviousDefinition(StoredMI); + MI->getFirstDefinition()->setPreviousDefinition(StoredMI); StoredMI = MI; II->setHasMacroDefinition(true); @@ -112,16 +110,14 @@ void Preprocessor::addLoadedMacroInfo(IdentifierInfo *II, MacroInfo *MI, MI->setAmbiguous(true); // Wire this macro information into the chain. - MI->setPreviousDefinition(Prev->getPreviousDefinition()); + MI->getFirstDefinition()->setPreviousDefinition( + Prev->getPreviousDefinition()); Prev->setPreviousDefinition(MI); return; } // The macro is not a definition; put it at the end of the list. - MacroInfo *Prev = Hint? Hint : StoredMI; - while (Prev->getPreviousDefinition()) - Prev = Prev->getPreviousDefinition(); - Prev->setPreviousDefinition(MI); + StoredMI->getFirstDefinition()->setPreviousDefinition(MI); } void Preprocessor::makeLoadedMacroInfoVisible(IdentifierInfo *II, |

