summaryrefslogtreecommitdiffstats
path: root/clang/lib/Lex
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2013-01-18 20:59:01 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2013-01-18 20:59:01 +0000
commit8bee90d5f33f49d4ebcb89aac780916fe3bfc65d (patch)
treefb2fe9e216a337412b0679ec3462aac9ab82d938 /clang/lib/Lex
parent86c2c564ff88e4877ef0c0d89a5dc04fccbc6ace (diff)
downloadbcm5719-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.cpp14
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,
OpenPOWER on IntegriCloud