diff options
author | Erik Verbruggen <[email protected]> | 2013-06-10 15:12:17 +0200 |
---|---|---|
committer | Erik Verbruggen <[email protected]> | 2013-06-11 16:57:07 +0200 |
commit | 271c3f45a47e48dc903a422b3579463967696f7a (patch) | |
tree | 2f283d1c579c74d53d35a5272230f00c7d40fcca /src/libs/cplusplus/pp-engine.cpp | |
parent | d0afdfcc2b28315d75fb8c4a32a0d748ea3f662b (diff) |
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 <[email protected]>
Diffstat (limited to 'src/libs/cplusplus/pp-engine.cpp')
-rw-r--r-- | src/libs/cplusplus/pp-engine.cpp | 14 |
1 files changed, 5 insertions, 9 deletions
diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp index 3643601a85c..659b888327b 100644 --- a/src/libs/cplusplus/pp-engine.cpp +++ b/src/libs/cplusplus/pp-engine.cpp @@ -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; } |