diff --git a/src/libs/cplusplus/pp-macro-expander.cpp b/src/libs/cplusplus/pp-macro-expander.cpp index 87c7b25e240..3aa53c7d7e4 100644 --- a/src/libs/cplusplus/pp-macro-expander.cpp +++ b/src/libs/cplusplus/pp-macro-expander.cpp @@ -369,7 +369,7 @@ const char *MacroExpander::expand(const char *__first, const char *__last, MacroExpander expand_actual (env, frame); const char *arg_end = skip_argument_variadics (actuals, macro, arg_it, __last); - if (arg_it != arg_end) + if (arg_it != arg_end || (arg_end != __last && *arg_end == ',')) { actuals_ref.append(MacroArgumentReference(start_offset + (arg_it-start), arg_end - arg_it)); const QByteArray actual (arg_it, arg_end - arg_it); diff --git a/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp b/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp index 1c5d6fd320f..06e910be639 100644 --- a/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp +++ b/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp @@ -43,6 +43,7 @@ Q_OBJECT private Q_SLOTS: void va_args(); void named_va_args(); + void first_empty_macro_arg(); void unfinished_function_like_macro_call(); void nasty_macro_expansion(); void tstst(); @@ -82,6 +83,23 @@ void tst_Preprocessor::named_va_args() QVERIFY(preprocessed.contains("int f(int a,int b);")); } +void tst_Preprocessor::first_empty_macro_arg() +{ + Client *client = 0; // no client. + Environment env; + + Preprocessor preprocess(client, &env); + QByteArray preprocessed = preprocess(QLatin1String(""), + QByteArray("\n#define foo(a,b) a int b;" + "\nfoo(const,cVal)\n" + "\nfoo(,Val)\n" + "\nfoo( ,Val2)\n")); + + QVERIFY(preprocessed.contains("const int cVal;")); + QVERIFY(preprocessed.contains("int Val;")); + QVERIFY(preprocessed.contains("int Val2;")); +} + void tst_Preprocessor::unfinished_function_like_macro_call() { Client *client = 0; // no client.