]> granicus.if.org Git - clang/commitdiff
Robustify PreprocessingRecord slightly, by only creating macro
authorDouglas Gregor <dgregor@apple.com>
Fri, 19 Mar 2010 21:58:23 +0000 (21:58 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 19 Mar 2010 21:58:23 +0000 (21:58 +0000)
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

include/clang/Lex/PreprocessingRecord.h
lib/Lex/PreprocessingRecord.cpp
test/Index/c-index-getCursor-test.m

index b40bf36bc123b740ece15229a4f2813bc4736295..ef28af9b7fe0b43b54099ae8d1d1189775eb613b 100644 (file)
@@ -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
 
index 4921a7fd90183cba6025c0d963e1f13a0d65cfc2..6966c38b23d822af1fe36a2a2036ed69c3c46fb9 100644 (file)
@@ -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);
+}
+
index 52e19dffb3a7b1c19838d03b6a09c396e0b27919..3cf1b6dcfa0d403671959ee583fc93d2be5aedc3 100644 (file)
@@ -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