From 2c8028bcf40f4bb44b3c73f788d2f63d2d353d9a Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Tue, 19 Oct 2010 17:40:53 +0000 Subject: [PATCH] In ~Preprocessor(), also cleanup the MacroInfo objects left-over from stray "#pragma push_macro" uses. This fixes a potential memory leak. llvm-svn: 116826 --- clang/lib/Lex/Preprocessor.cpp | 7 +++++++ clang/test/Preprocessor/pragma-pushpop-macro.c | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/clang/lib/Lex/Preprocessor.cpp b/clang/lib/Lex/Preprocessor.cpp index 5160acf19e1f..56ed7659249c 100644 --- a/clang/lib/Lex/Preprocessor.cpp +++ b/clang/lib/Lex/Preprocessor.cpp @@ -123,6 +123,13 @@ Preprocessor::~Preprocessor() { // memory alocated by MacroInfo. (*I)->Destroy(); } + for (llvm::DenseMap >::iterator I = + PragmaPushMacroInfo.begin(), E = PragmaPushMacroInfo.end(); I!=E; ++I){ + for (std::vector::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) diff --git a/clang/test/Preprocessor/pragma-pushpop-macro.c b/clang/test/Preprocessor/pragma-pushpop-macro.c index 87cceaa4193a..71b0e0e2600b 100644 --- a/clang/test/Preprocessor/pragma-pushpop-macro.c +++ b/clang/test/Preprocessor/pragma-pushpop-macro.c @@ -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 +