summaryrefslogtreecommitdiffstats
path: root/clang/Lex/MacroExpander.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-07-22 01:16:55 +0000
committerChris Lattner <sabre@nondot.org>2007-07-22 01:16:55 +0000
commit9c724c48ea2479bac0965e53ac4c710ed9c71aea (patch)
tree93b0b21c244019bd5186e380e60e62a5e7a26f5d /clang/Lex/MacroExpander.cpp
parentc850ad6ee122d3757d9dc1a67d4ddc9e9b219a42 (diff)
downloadbcm5719-llvm-9c724c48ea2479bac0965e53ac4c710ed9c71aea.tar.gz
bcm5719-llvm-9c724c48ea2479bac0965e53ac4c710ed9c71aea.zip
Fix a really subtle bug in the macro expander caching code, where
redefinition of a macro could cause invalid memory to be deleted. Found preprocessing 253.perlbmk. llvm-svn: 40380
Diffstat (limited to 'clang/Lex/MacroExpander.cpp')
-rw-r--r--clang/Lex/MacroExpander.cpp7
1 files changed, 6 insertions, 1 deletions
diff --git a/clang/Lex/MacroExpander.cpp b/clang/Lex/MacroExpander.cpp
index fade8546572..57bdfccc110 100644
--- a/clang/Lex/MacroExpander.cpp
+++ b/clang/Lex/MacroExpander.cpp
@@ -245,6 +245,7 @@ void MacroExpander::Init(Token &Tok, MacroArgs *Actuals) {
AtStartOfLine = Tok.isAtStartOfLine();
HasLeadingSpace = Tok.hasLeadingSpace();
MacroTokens = &*Macro->tokens_begin();
+ OwnsMacroTokens = false;
NumMacroTokens = Macro->tokens_end()-Macro->tokens_begin();
// If this is a function-like macro, expand the arguments and change
@@ -270,6 +271,7 @@ void MacroExpander::Init(const Token *TokArray, unsigned NumToks) {
Macro = 0;
ActualArgs = 0;
MacroTokens = TokArray;
+ OwnsMacroTokens = false;
NumMacroTokens = NumToks;
CurToken = 0;
InstantiateLoc = SourceLocation();
@@ -288,8 +290,10 @@ void MacroExpander::Init(const Token *TokArray, unsigned NumToks) {
void MacroExpander::destroy() {
// If this was a function-like macro that actually uses its arguments, delete
// the expanded tokens.
- if (Macro && MacroTokens != &*Macro->tokens_begin())
+ if (OwnsMacroTokens) {
delete [] MacroTokens;
+ MacroTokens = 0;
+ }
// MacroExpander owns its formal arguments.
if (ActualArgs) ActualArgs->destroy();
@@ -455,6 +459,7 @@ void MacroExpander::ExpandFunctionArguments() {
if (NumMacroTokens)
memcpy(Res, &ResultToks[0], NumMacroTokens*sizeof(Token));
MacroTokens = Res;
+ OwnsMacroTokens = true;
}
}
OpenPOWER on IntegriCloud