forked from OSchip/llvm-project
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
This commit is contained in:
parent
065cabf43e
commit
06f621d349
|
@ -1378,11 +1378,6 @@ private:
|
||||||
VisibilityMacroDirective *AllocateVisibilityMacroDirective(SourceLocation Loc,
|
VisibilityMacroDirective *AllocateVisibilityMacroDirective(SourceLocation Loc,
|
||||||
bool isPublic);
|
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
|
/// \brief Lex and validate a macro name, which occurs after a
|
||||||
/// \#define or \#undef.
|
/// \#define or \#undef.
|
||||||
///
|
///
|
||||||
|
|
|
@ -90,13 +90,6 @@ Preprocessor::AllocateVisibilityMacroDirective(SourceLocation Loc,
|
||||||
return new (BP) VisibilityMacroDirective(Loc, isPublic);
|
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
|
/// \brief Read and discard all tokens remaining on the current line until
|
||||||
/// the tok::eod token is found.
|
/// the tok::eod token is found.
|
||||||
void Preprocessor::DiscardUntilEndOfDirective() {
|
void Preprocessor::DiscardUntilEndOfDirective() {
|
||||||
|
@ -1902,8 +1895,6 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok,
|
||||||
// This is a function-like macro definition. Read the argument list.
|
// This is a function-like macro definition. Read the argument list.
|
||||||
MI->setIsFunctionLike();
|
MI->setIsFunctionLike();
|
||||||
if (ReadMacroDefinitionArgList(MI, LastTok)) {
|
if (ReadMacroDefinitionArgList(MI, LastTok)) {
|
||||||
// Forget about MI.
|
|
||||||
ReleaseMacroInfo(MI);
|
|
||||||
// Throw away the rest of the line.
|
// Throw away the rest of the line.
|
||||||
if (CurPPLexer->ParsingPreprocessorDirective)
|
if (CurPPLexer->ParsingPreprocessorDirective)
|
||||||
DiscardUntilEndOfDirective();
|
DiscardUntilEndOfDirective();
|
||||||
|
@ -2028,7 +2019,6 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok,
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
Diag(Tok, diag::err_pp_stringize_not_parameter);
|
Diag(Tok, diag::err_pp_stringize_not_parameter);
|
||||||
ReleaseMacroInfo(MI);
|
|
||||||
|
|
||||||
// Disable __VA_ARGS__ again.
|
// Disable __VA_ARGS__ again.
|
||||||
Ident__VA_ARGS__->setIsPoisoned(true);
|
Ident__VA_ARGS__->setIsPoisoned(true);
|
||||||
|
@ -2056,12 +2046,10 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok,
|
||||||
if (NumTokens != 0) {
|
if (NumTokens != 0) {
|
||||||
if (MI->getReplacementToken(0).is(tok::hashhash)) {
|
if (MI->getReplacementToken(0).is(tok::hashhash)) {
|
||||||
Diag(MI->getReplacementToken(0), diag::err_paste_at_start);
|
Diag(MI->getReplacementToken(0), diag::err_paste_at_start);
|
||||||
ReleaseMacroInfo(MI);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (MI->getReplacementToken(NumTokens-1).is(tok::hashhash)) {
|
if (MI->getReplacementToken(NumTokens-1).is(tok::hashhash)) {
|
||||||
Diag(MI->getReplacementToken(NumTokens-1), diag::err_paste_at_end);
|
Diag(MI->getReplacementToken(NumTokens-1), diag::err_paste_at_end);
|
||||||
ReleaseMacroInfo(MI);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,3 +23,5 @@ void foo() {
|
||||||
// CHECK: {{^ \^~$}}
|
// CHECK: {{^ \^~$}}
|
||||||
// CHECK: {{^ \^~$}}
|
// CHECK: {{^ \^~$}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define foo() lots and lots of tokens, need at least 8 to fill up the smallvector buffer #BadThingsHappenNow
|
||||||
|
|
Loading…
Reference in New Issue