forked from qt-creator/qt-creator
C++: Fix preprocessor blocked macro bug.
By lexing the first token after a macro call (meaning: the token after the closing parenthesis (which was passed to handleFunctionLikeMacro which in turn pushed it back into the token buffer)), a token buffer might be popped, which unblocks the macro that generated the actual param pack. The effect was that if this happens in the expansion of a recursive macro (with parameters!), the preprocessor ended up in an infinite loop. Task-number: QTCREATORBUG-9015 Task-number: QTCREATORBUG-9447 Change-Id: I0d83c59188ec15c4a948970e9fa944a17d765475 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
This commit is contained in:
committed by
Erik Verbruggen
parent
d0afdfcc2b
commit
271c3f45a4
@@ -1048,7 +1048,7 @@ bool Preprocessor::handleIdentifier(PPToken *tk)
|
||||
argRefs);
|
||||
}
|
||||
|
||||
if (!handleFunctionLikeMacro(tk, macro, body, allArgTks, baseLine)) {
|
||||
if (!handleFunctionLikeMacro(macro, body, allArgTks, baseLine)) {
|
||||
if (m_client && !idTk.expanded())
|
||||
m_client->stopExpandingMacro(idTk.offset, *macro);
|
||||
return false;
|
||||
@@ -1119,8 +1119,7 @@ bool Preprocessor::handleIdentifier(PPToken *tk)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Preprocessor::handleFunctionLikeMacro(PPToken *tk,
|
||||
const Macro *macro,
|
||||
bool Preprocessor::handleFunctionLikeMacro(const Macro *macro,
|
||||
QVector<PPToken> &body,
|
||||
const QVector<QVector<PPToken> > &actuals,
|
||||
unsigned baseLine)
|
||||
@@ -1220,9 +1219,6 @@ bool Preprocessor::handleFunctionLikeMacro(PPToken *tk,
|
||||
body = expanded;
|
||||
body.squeeze();
|
||||
|
||||
// Next token to be lexed after the expansion.
|
||||
pushToken(tk);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1479,9 +1475,9 @@ bool Preprocessor::collectActualArguments(PPToken *tk, QVector<QVector<PPToken>
|
||||
actuals->append(tokens);
|
||||
}
|
||||
|
||||
if (tk->is(T_RPAREN))
|
||||
lex(tk);
|
||||
//###TODO: else error message
|
||||
if (!tk->is(T_RPAREN)) {
|
||||
//###TODO: else error message
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -205,8 +205,7 @@ private:
|
||||
void lex(PPToken *tk);
|
||||
void skipPreprocesorDirective(PPToken *tk);
|
||||
bool handleIdentifier(PPToken *tk);
|
||||
bool handleFunctionLikeMacro(PPToken *tk,
|
||||
const Macro *macro,
|
||||
bool handleFunctionLikeMacro(const Macro *macro,
|
||||
QVector<PPToken> &body,
|
||||
const QVector<QVector<PPToken> > &actuals,
|
||||
unsigned lineRef);
|
||||
|
||||
Reference in New Issue
Block a user