diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp index 980f59c0a2669e6113397e03871688d0b2f18d33..0aa11f0fee7c10d29f9f27701408a8014ea8ec87 100644 --- a/src/libs/cplusplus/pp-engine.cpp +++ b/src/libs/cplusplus/pp-engine.cpp @@ -945,6 +945,8 @@ bool Preprocessor::handleIdentifier(PPToken *tk) bool hasMatchingArgs = false; if (hasArgs) { const int expectedArgCount = macro->formals().size(); + if (macro->isVariadic() && allArgTks.size() == expectedArgCount - 1) + allArgTks.push_back(QVector<PPToken>()); const int actualArgCount = allArgTks.size(); if (expectedArgCount == actualArgCount || (macro->isVariadic() && actualArgCount > expectedArgCount - 1) diff --git a/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp b/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp index 2a985f5a099a20ae49dc6372eba6ef2327eda282..61137c3788dc8ef560bf6ee24548cf9e2ed945ca 100644 --- a/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp +++ b/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp @@ -317,6 +317,7 @@ private: private slots: void va_args(); void named_va_args(); + void extra_va_args(); void defined(); void defined_data(); void empty_macro_args(); @@ -413,6 +414,23 @@ void tst_Preprocessor::named_va_args() QCOMPARE(simplified(preprocessed), QString("int f();int f(int a);int f(int a,int b);")); } +void tst_Preprocessor::extra_va_args() +{ + Client *client = 0; // no client. + Environment env; + + Preprocessor preprocess(client, &env); + QByteArray preprocessed = preprocess.run(QLatin1String("<stdin>"), + "#define foo(ret, ...) ret f(__VA_ARGS__);\n" + "\nfoo(int)\n" + "\nfoo(float,int b)\n" + "\nfoo(long,int b,int c)\n", + true, false); + + preprocessed = preprocessed.simplified(); + QCOMPARE(simplified(preprocessed), QString("int f();float f(int b);long f(int b,int c);")); +} + void tst_Preprocessor::empty_macro_args() { Client *client = 0; // no client.