]> granicus.if.org Git - clang/commitdiff
In ~Preprocessor(), also cleanup the MacroInfo objects left-over from stray "#pragma...
authorTed Kremenek <kremenek@apple.com>
Tue, 19 Oct 2010 17:40:53 +0000 (17:40 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 19 Oct 2010 17:40:53 +0000 (17:40 +0000)
fixes a potential memory leak.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@116826 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Lex/Preprocessor.cpp
test/Preprocessor/pragma-pushpop-macro.c

index 5160acf19e1f4bad27e7618ba088ee73fdeab85d..56ed7659249c0960dda89e5fd5efb82ad29d2611 100644 (file)
@@ -123,6 +123,13 @@ Preprocessor::~Preprocessor() {
     // memory alocated by MacroInfo.
     (*I)->Destroy();
   }
+  for (llvm::DenseMap<IdentifierInfo*, std::vector<MacroInfo*> >::iterator I =
+         PragmaPushMacroInfo.begin(), E = PragmaPushMacroInfo.end(); I!=E; ++I){
+    for (std::vector<MacroInfo*>::iterator I2 = I->second.begin(), E2 = I->second.end();
+         I2 != E2; ++I2) {
+      (*I2)->Destroy();
+    }
+  }
 
   // Free any cached macro expanders.
   for (unsigned i = 0, e = NumCachedTokenLexers; i != e; ++i)
index 87cceaa4193ad27afceed55454772cb72348845d..71b0e0e2600b3a3477c5d3a08b79a7164befe90a 100644 (file)
@@ -25,9 +25,17 @@ int pmx3 = X;
 #pragma pop_macro("Y")
 int pmy1 = Y;
 
+// Have a stray 'push' to show we don't crash when having inbalanced
+// push/pop
+#pragma push_macro("Y")
+#define Y 4
+int pmy2 = Y;
+
 // CHECK: int pmx0 = 1
 // CHECK: int pmy0 = 2
 // CHECK: int pmx1 = 1
 // CHECK: int pmx2 = 2
 // CHECK: int pmx3 = 1
 // CHECK: int pmy1 = 3
+// CHECK: int pmy2 = 4
+