aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libs/cplusplus/pp-engine.cpp14
-rw-r--r--src/libs/cplusplus/pp-engine.h3
-rw-r--r--tests/auto/cplusplus/preprocessor/data/recursive.2.cpp6
-rw-r--r--tests/auto/cplusplus/preprocessor/data/recursive.2.out.cpp12
-rw-r--r--tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp2
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")