From: Douglas Gregor Date: Fri, 19 Mar 2010 21:58:23 +0000 (+0000) Subject: Robustify PreprocessingRecord slightly, by only creating macro X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1b058e8956ea29a7fb7649fdee2b80581dcbdf39;p=clang Robustify PreprocessingRecord slightly, by only creating macro instantiations when we have the corresponding macro definition and by removing macro definition information from our table when the macro is undefined. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99004 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Lex/PreprocessingRecord.h b/include/clang/Lex/PreprocessingRecord.h index b40bf36bc1..ef28af9b7f 100644 --- a/include/clang/Lex/PreprocessingRecord.h +++ b/include/clang/Lex/PreprocessingRecord.h @@ -253,10 +253,11 @@ namespace clang { /// \brief Retrieve the macro definition that corresponds to the given /// \c MacroInfo. - MacroDefinition *findMacroDefinition(MacroInfo *MI); + MacroDefinition *findMacroDefinition(const MacroInfo *MI); virtual void MacroExpands(const Token &Id, const MacroInfo* MI); virtual void MacroDefined(const IdentifierInfo *II, const MacroInfo *MI); + virtual void MacroUndefined(const IdentifierInfo *II, const MacroInfo *MI); }; } // end namespace clang diff --git a/lib/Lex/PreprocessingRecord.cpp b/lib/Lex/PreprocessingRecord.cpp index 4921a7fd90..6966c38b23 100644 --- a/lib/Lex/PreprocessingRecord.cpp +++ b/lib/Lex/PreprocessingRecord.cpp @@ -92,7 +92,7 @@ void PreprocessingRecord::RegisterMacroDefinition(MacroInfo *Macro, MacroDefinitions[Macro] = MD; } -MacroDefinition *PreprocessingRecord::findMacroDefinition(MacroInfo *MI) { +MacroDefinition *PreprocessingRecord::findMacroDefinition(const MacroInfo *MI) { llvm::DenseMap::iterator Pos = MacroDefinitions.find(MI); if (Pos == MacroDefinitions.end()) @@ -102,10 +102,11 @@ MacroDefinition *PreprocessingRecord::findMacroDefinition(MacroInfo *MI) { } void PreprocessingRecord::MacroExpands(const Token &Id, const MacroInfo* MI) { - PreprocessedEntities.push_back( + if (MacroDefinition *Def = findMacroDefinition(MI)) + PreprocessedEntities.push_back( new (*this) MacroInstantiation(Id.getIdentifierInfo(), Id.getLocation(), - MacroDefinitions[MI])); + Def)); } void PreprocessingRecord::MacroDefined(const IdentifierInfo *II, @@ -117,3 +118,11 @@ void PreprocessingRecord::MacroDefined(const IdentifierInfo *II, PreprocessedEntities.push_back(Def); } +void PreprocessingRecord::MacroUndefined(const IdentifierInfo *II, + const MacroInfo *MI) { + llvm::DenseMap::iterator Pos + = MacroDefinitions.find(MI); + if (Pos != MacroDefinitions.end()) + MacroDefinitions.erase(Pos); +} + diff --git a/test/Index/c-index-getCursor-test.m b/test/Index/c-index-getCursor-test.m index 52e19dffb3..3cf1b6dcfa 100644 --- a/test/Index/c-index-getCursor-test.m +++ b/test/Index/c-index-getCursor-test.m @@ -57,6 +57,7 @@ int main (int argc, const char * argv[]) { void f() { int CONCAT(my,_var); } +#undef CONCAT // CHECK: [1:1 - 3:1] Invalid Cursor => NoDeclFound // CHECK: [3:1 - 7:1] ObjCInterfaceDecl=Foo:3:12