From 3e9105e40150a413b65d21588a468e7914697bcc Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Fri, 16 Mar 2012 14:10:46 +0100 Subject: [PATCH] Preprocessor: fix handling of first empty argument. First empty argument used to be dropped: e.g. MACRO(,test) would be expanded with one parameter only, with value 'test'. Change-Id: I693fbb7faf1360f62266fa04c4b39c2de0d159a7 Reviewed-by: Erik Verbruggen --- src/libs/cplusplus/pp-macro-expander.cpp | 2 +- .../preprocessor/tst_preprocessor.cpp | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) 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.