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));
#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
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
};
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;