summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-03-19 21:58:23 +0000
committerDouglas Gregor <dgregor@apple.com>2010-03-19 21:58:23 +0000
commit8aaca67b0ace63b1f87c0bcfb9054ed57ac9d206 (patch)
tree9112c2c3c91ef871c0ef34f1860ff6b65bdc5d2a /clang
parent2db7abaa446dc7412a2d3552bdbcbb78dbce398a (diff)
downloadbcm5719-llvm-8aaca67b0ace63b1f87c0bcfb9054ed57ac9d206.tar.gz
bcm5719-llvm-8aaca67b0ace63b1f87c0bcfb9054ed57ac9d206.zip
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. llvm-svn: 99004
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/Lex/PreprocessingRecord.h3
-rw-r--r--clang/lib/Lex/PreprocessingRecord.cpp15
-rw-r--r--clang/test/Index/c-index-getCursor-test.m1
3 files changed, 15 insertions, 4 deletions
diff --git a/clang/include/clang/Lex/PreprocessingRecord.h b/clang/include/clang/Lex/PreprocessingRecord.h
index b40bf36bc12..ef28af9b7fe 100644
--- a/clang/include/clang/Lex/PreprocessingRecord.h
+++ b/clang/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/clang/lib/Lex/PreprocessingRecord.cpp b/clang/lib/Lex/PreprocessingRecord.cpp
index 4921a7fd901..6966c38b23d 100644
--- a/clang/lib/Lex/PreprocessingRecord.cpp
+++ b/clang/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/clang/test/Index/c-index-getCursor-test.m b/clang/test/Index/c-index-getCursor-test.m
index 52e19dffb3a..3cf1b6dcfa0 100644
--- a/clang/test/Index/c-index-getCursor-test.m
+++ b/clang/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
OpenPOWER on IntegriCloud