From: Olivier Goffart Date: Fri, 12 Oct 2012 11:37:21 +0000 (+0200) Subject: moc: parse properly the gcc extension for variadic macro X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=21426f281e09b6043e3c1f9b5d3a48644a4965fe;p=profile%2Fivi%2Fqtbase.git moc: parse properly the gcc extension for variadic macro Task-number: QTBUG-27547 Change-Id: I983b96b09c405e5330327092e56164b9921a2d0f Reviewed-by: Lars Knoll --- diff --git a/src/tools/moc/preprocessor.cpp b/src/tools/moc/preprocessor.cpp index 40bba33..566be9c 100644 --- a/src/tools/moc/preprocessor.cpp +++ b/src/tools/moc/preprocessor.cpp @@ -1201,8 +1201,18 @@ void Preprocessor::parseDefineArguments(Macro *m) t = next(); if (t == PP_RPAREN) break; - if (t != PP_COMMA) - error("Unexpected character in macro argument list."); + if (t == PP_COMMA) + continue; + if (lexem() == "...") { + //GCC extension: #define FOO(x, y...) x(y) + // The last argument was already parsed. Just mark the macro as variadic. + m->isVariadic = true; + while (test(PP_WHITESPACE)); + if (!test(PP_RPAREN)) + error("missing ')' in macro argument list"); + break; + } + error("Unexpected character in macro argument list."); } m->arguments = arguments; while (test(PP_WHITESPACE)); diff --git a/tests/auto/tools/moc/parse-defines.h b/tests/auto/tools/moc/parse-defines.h index bc22444..eb47253 100644 --- a/tests/auto/tools/moc/parse-defines.h +++ b/tests/auto/tools/moc/parse-defines.h @@ -65,6 +65,14 @@ #if defined(Q_COMPILER_VARIADIC_MACROS) #define PD_VARARG(x, ...) x(__VA_ARGS__) + +#if defined(Q_CC_GNU) || defined(Q_MOC_RUN) +//GCC extension for variadic macros +#define PD_VARARGEXT(x, y...) x(y) +#else +#define PD_VARARGEXT(x, ...) x(__VA_ARGS__) +#endif + #endif PD_BEGIN_NAMESPACE @@ -95,6 +103,10 @@ public slots: PD_VARARG(void vararg1) {} PD_VARARG(void vararg2, int) {} PD_VARARG(void vararg3, int, int) {} + + PD_VARARGEXT(void vararg4) {} + PD_VARARGEXT(void vararg5, int) {} + PD_VARARGEXT(void vararg6, int, int) {} #endif }; diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp index 0cd6c29..d861b84 100644 --- a/tests/auto/tools/moc/tst_moc.cpp +++ b/tests/auto/tools/moc/tst_moc.cpp @@ -2744,6 +2744,12 @@ void tst_Moc::parseDefines() QVERIFY(index != -1); index = mo->indexOfSlot("vararg3(int,int)"); QVERIFY(index != -1); + index = mo->indexOfSlot("vararg4()"); + QVERIFY(index != -1); + index = mo->indexOfSlot("vararg5(int)"); + QVERIFY(index != -1); + index = mo->indexOfSlot("vararg6(int,int)"); + QVERIFY(index != -1); #endif int count = 0;