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.