diff --git a/include/clang/Lex/PreprocessingRecord.h b/include/clang/Lex/PreprocessingRecord.h index 535e0ca79b1d9638f668b87a9c9a082098ab6565..665d250919ebc48d948bd13080fbf6c921c5c3d2 100644 --- a/include/clang/Lex/PreprocessingRecord.h +++ b/include/clang/Lex/PreprocessingRecord.h @@ -325,7 +325,7 @@ namespace clang { } /// \brief Mapping from MacroInfo structures to their definitions. - llvm::DenseMap<const MacroInfo *, PPEntityID> MacroDefinitions; + llvm::DenseMap<const MacroInfo *, MacroDefinition *> MacroDefinitions; /// \brief External source of preprocessed entities. ExternalPreprocessingRecordSource *ExternalSource; @@ -356,7 +356,7 @@ namespace clang { unsigned allocateLoadedEntities(unsigned NumEntities); /// \brief Register a new macro definition. - void RegisterMacroDefinition(MacroInfo *Macro, PPEntityID PPID); + void RegisterMacroDefinition(MacroInfo *Macro, MacroDefinition *Def); public: /// \brief Construct a new preprocessing record. diff --git a/lib/Lex/PreprocessingRecord.cpp b/lib/Lex/PreprocessingRecord.cpp index ac0985be84612e53262688ba1cbb287b9995c167..0f3587e31c39d3b79494c88d2f254415b2cf33ae 100644 --- a/lib/Lex/PreprocessingRecord.cpp +++ b/lib/Lex/PreprocessingRecord.cpp @@ -320,8 +320,8 @@ unsigned PreprocessingRecord::allocateLoadedEntities(unsigned NumEntities) { } void PreprocessingRecord::RegisterMacroDefinition(MacroInfo *Macro, - PPEntityID PPID) { - MacroDefinitions[Macro] = PPID; + MacroDefinition *Def) { + MacroDefinitions[Macro] = Def; } /// \brief Retrieve the preprocessed entity at the given ID. @@ -358,15 +358,12 @@ PreprocessingRecord::getLoadedPreprocessedEntity(unsigned Index) { } MacroDefinition *PreprocessingRecord::findMacroDefinition(const MacroInfo *MI) { - llvm::DenseMap<const MacroInfo *, PPEntityID>::iterator Pos + llvm::DenseMap<const MacroInfo *, MacroDefinition *>::iterator Pos = MacroDefinitions.find(MI); if (Pos == MacroDefinitions.end()) return 0; - - PreprocessedEntity *Entity = getPreprocessedEntity(Pos->second); - if (Entity->isInvalid()) - return 0; - return cast<MacroDefinition>(Entity); + + return Pos->second; } void PreprocessingRecord::addMacroExpansion(const Token &Id, @@ -415,7 +412,8 @@ void PreprocessingRecord::MacroDefined(const Token &Id, SourceRange R(MI->getDefinitionLoc(), MI->getDefinitionEndLoc()); MacroDefinition *Def = new (*this) MacroDefinition(Id.getIdentifierInfo(), R); - MacroDefinitions[MI] = addPreprocessedEntity(Def); + addPreprocessedEntity(Def); + MacroDefinitions[MI] = Def; } void PreprocessingRecord::MacroUndefined(const Token &Id, diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index da3add3161f9093ab3885eb14d40644a38ff1634..4c11f383950b9a208b44a42e78435761a3a858ab 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -1249,8 +1249,12 @@ void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset, PreprocessedEntityID GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]); PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); - PPRec.RegisterMacroDefinition(Macro, - PPRec.getPPEntityID(GlobalID-1, /*isLoaded=*/true)); + PreprocessingRecord::PPEntityID + PPID = PPRec.getPPEntityID(GlobalID-1, /*isLoaded=*/true); + MacroDefinition *PPDef = + cast_or_null<MacroDefinition>(PPRec.getPreprocessedEntity(PPID)); + if (PPDef) + PPRec.RegisterMacroDefinition(Macro, PPDef); } ++NumMacrosRead; diff --git a/test/Preprocessor/pp-record.c b/test/Preprocessor/pp-record.c index 92ca366e37f536f241a1df22a4d6e2cc0a1b18fb..48000edd734b49db008782c727a20c9b5a8f50f5 100644 --- a/test/Preprocessor/pp-record.c +++ b/test/Preprocessor/pp-record.c @@ -26,3 +26,9 @@ FNM( #define M2 int #define FM2(x,y) y x FM2(M1, M2); + +#define FM3(x) x +FM3( +#define M3 int x2 +) +M3;