diff options
-rw-r--r-- | src/libs/cplusplus/pp-engine.cpp | 14 | ||||
-rw-r--r-- | src/libs/cplusplus/pp-engine.h | 3 | ||||
-rw-r--r-- | tests/auto/cplusplus/preprocessor/data/recursive.2.cpp | 6 | ||||
-rw-r--r-- | tests/auto/cplusplus/preprocessor/data/recursive.2.out.cpp | 12 | ||||
-rw-r--r-- | tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp | 2 |
5 files changed, 26 insertions, 11 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; } diff --git a/src/libs/cplusplus/pp-engine.h b/src/libs/cplusplus/pp-engine.h index 2614c107b15..8781b7ac19b 100644 --- a/src/libs/cplusplus/pp-engine.h +++ b/src/libs/cplusplus/pp-engine.h @@ -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); diff --git a/tests/auto/cplusplus/preprocessor/data/recursive.2.cpp b/tests/auto/cplusplus/preprocessor/data/recursive.2.cpp new file mode 100644 index 00000000000..0e3a6e64a52 --- /dev/null +++ b/tests/auto/cplusplus/preprocessor/data/recursive.2.cpp @@ -0,0 +1,6 @@ +#define a(x) b(x) c(x) +#define b(x) c(x) a(x) +#define c(x) a(x) b(x) + +b(1) +a(1) diff --git a/tests/auto/cplusplus/preprocessor/data/recursive.2.out.cpp b/tests/auto/cplusplus/preprocessor/data/recursive.2.out.cpp new file mode 100644 index 00000000000..1068e6856ea --- /dev/null +++ b/tests/auto/cplusplus/preprocessor/data/recursive.2.out.cpp @@ -0,0 +1,12 @@ +# 1 "data/recursive.2.cpp" + + + + +# expansion begin 70,1 ~2 5:2 ~3 5:2 ~3 5:2 ~3 5:2 ~3 5:2 ~3 5:2 ~1 +b(1) c(1) b(1) b(1) a(1) b(1) +# expansion end +# expansion begin 75,1 ~2 6:2 ~3 6:2 ~3 6:2 ~3 6:2 ~3 6:2 ~3 6:2 ~1 +a(1) b(1) a(1) a(1) c(1) a(1) +# expansion end +# 7 "data/recursive.2.cpp" diff --git a/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp b/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp index bb08b578aea..834a5790925 100644 --- a/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp +++ b/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp @@ -822,6 +822,8 @@ void tst_Preprocessor::comparisons_data() << "reserved.1.cpp" << "reserved.1.out.cpp" << ""; QTest::newRow("recursive 1") << "recursive.1.cpp" << "recursive.1.out.cpp" << ""; + QTest::newRow("recursive 2") + << "recursive.2.cpp" << "recursive.2.out.cpp" << ""; QTest::newRow("macro_pounder_fn") << "macro_pounder_fn.c" << "" << ""; QTest::newRow("macro_expand") |