diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-03-19 21:58:23 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-03-19 21:58:23 +0000 |
commit | 1b058e8956ea29a7fb7649fdee2b80581dcbdf39 (patch) | |
tree | 125e93bcc14ecd17e546ca193051d0e8d79a9c4a | |
parent | 6a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bc (diff) |
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
-rw-r--r-- | include/clang/Lex/PreprocessingRecord.h | 3 | ||||
-rw-r--r-- | lib/Lex/PreprocessingRecord.cpp | 15 | ||||
-rw-r--r-- | test/Index/c-index-getCursor-test.m | 1 |
3 files changed, 15 insertions, 4 deletions
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<const MacroInfo *, MacroDefinition *>::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<const MacroInfo *, MacroDefinition *>::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 |