diff options
Diffstat (limited to 'clang/lib/Serialization/ASTReader.cpp')
-rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index da5a0e68e93..2ee4975a468 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -826,7 +826,7 @@ IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k, uint32_t LocalMacroID = endian::readNext<uint32_t, little, unaligned>(d); DataLen -= 4; - if (LocalMacroID == 0xdeadbeef) break; + if (LocalMacroID == (uint32_t)-1) break; LocalMacroIDs.push_back(LocalMacroID); } } @@ -1807,7 +1807,7 @@ struct ASTReader::ModuleMacroInfo { }; ASTReader::ModuleMacroInfo * -ASTReader::getModuleMacro(const PendingMacroInfo &PMInfo) { +ASTReader::getModuleMacro(IdentifierInfo *II, const PendingMacroInfo &PMInfo) { ModuleMacroInfo Info; uint32_t ID = PMInfo.ModuleMacroData.MacID; @@ -1815,6 +1815,11 @@ ASTReader::getModuleMacro(const PendingMacroInfo &PMInfo) { // Macro undefinition. Info.SubModID = getGlobalSubmoduleID(*PMInfo.M, ID >> 1); Info.MI = nullptr; + + // If we've already loaded the #undef of this macro from this module, + // don't do so again. + if (!LoadedUndefs.insert(std::make_pair(II, Info.SubModID)).second) + return nullptr; } else { // Macro definition. GlobalMacroID GMacID = getGlobalMacroID(*PMInfo.M, ID >> 1); @@ -1848,7 +1853,7 @@ void ASTReader::resolvePendingMacro(IdentifierInfo *II, // Module Macro. - ModuleMacroInfo *MMI = getModuleMacro(PMInfo); + ModuleMacroInfo *MMI = getModuleMacro(II, PMInfo); if (!MMI) return; |