aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/cplusplus/pp-engine.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <[email protected]>2013-06-10 15:12:17 +0200
committerErik Verbruggen <[email protected]>2013-06-11 16:57:07 +0200
commit271c3f45a47e48dc903a422b3579463967696f7a (patch)
tree2f283d1c579c74d53d35a5272230f00c7d40fcca /src/libs/cplusplus/pp-engine.cpp
parentd0afdfcc2b28315d75fb8c4a32a0d748ea3f662b (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.cpp14
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;
}