From 06f621d3496ed2549edcc763403a64812d35e2a0 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Sun, 3 Aug 2014 23:41:04 +0000 Subject: [PATCH] Don't destroy MacroInfos if we find the macro definition is invalid; it'll get destroyed on shutdown regardless. Fixes a double-delete. llvm-svn: 214675 --- clang/include/clang/Lex/Preprocessor.h | 5 ----- clang/lib/Lex/PPDirectives.cpp | 12 ------------ clang/test/Lexer/string-literal-errors.cpp | 2 ++ 3 files changed, 2 insertions(+), 17 deletions(-) diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h index 47a10fb..f61ba9e 100644 --- a/clang/include/clang/Lex/Preprocessor.h +++ b/clang/include/clang/Lex/Preprocessor.h @@ -1378,11 +1378,6 @@ private: VisibilityMacroDirective *AllocateVisibilityMacroDirective(SourceLocation Loc, bool isPublic); - /// \brief Release the specified MacroInfo for re-use. - /// - /// This memory will be reused for allocating new MacroInfo objects. - void ReleaseMacroInfo(MacroInfo* MI); - /// \brief Lex and validate a macro name, which occurs after a /// \#define or \#undef. /// diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp index da50bba..6b99ce6 100644 --- a/clang/lib/Lex/PPDirectives.cpp +++ b/clang/lib/Lex/PPDirectives.cpp @@ -90,13 +90,6 @@ Preprocessor::AllocateVisibilityMacroDirective(SourceLocation Loc, return new (BP) VisibilityMacroDirective(Loc, isPublic); } -/// \brief Clean up a MacroInfo that was allocated but not used due to an -/// error in the macro definition. -void Preprocessor::ReleaseMacroInfo(MacroInfo *MI) { - // Don't try to reuse the storage; this only happens on error paths. - MI->~MacroInfo(); -} - /// \brief Read and discard all tokens remaining on the current line until /// the tok::eod token is found. void Preprocessor::DiscardUntilEndOfDirective() { @@ -1902,8 +1895,6 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok, // This is a function-like macro definition. Read the argument list. MI->setIsFunctionLike(); if (ReadMacroDefinitionArgList(MI, LastTok)) { - // Forget about MI. - ReleaseMacroInfo(MI); // Throw away the rest of the line. if (CurPPLexer->ParsingPreprocessorDirective) DiscardUntilEndOfDirective(); @@ -2028,7 +2019,6 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok, continue; } else { Diag(Tok, diag::err_pp_stringize_not_parameter); - ReleaseMacroInfo(MI); // Disable __VA_ARGS__ again. Ident__VA_ARGS__->setIsPoisoned(true); @@ -2056,12 +2046,10 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok, if (NumTokens != 0) { if (MI->getReplacementToken(0).is(tok::hashhash)) { Diag(MI->getReplacementToken(0), diag::err_paste_at_start); - ReleaseMacroInfo(MI); return; } if (MI->getReplacementToken(NumTokens-1).is(tok::hashhash)) { Diag(MI->getReplacementToken(NumTokens-1), diag::err_paste_at_end); - ReleaseMacroInfo(MI); return; } } diff --git a/clang/test/Lexer/string-literal-errors.cpp b/clang/test/Lexer/string-literal-errors.cpp index d8e2993..223dca4 100644 --- a/clang/test/Lexer/string-literal-errors.cpp +++ b/clang/test/Lexer/string-literal-errors.cpp @@ -23,3 +23,5 @@ void foo() { // CHECK: {{^ \^~$}} // CHECK: {{^ \^~$}} } + +#define foo() lots and lots of tokens, need at least 8 to fill up the smallvector buffer #BadThingsHappenNow -- 2.7.4