/* The purpose of this code is to test argument passing of a tuple of 11 integers, with the break point between named and unnamed arguments at every possible position. */ #include #include #include static int errors = 0; static void verify (const char *tcase, int n[11]) { int i; for (i = 0; i <= 10; i++) if (n[i] != i) { printf (" %s: n[%d] = %d expected %d\n", tcase, i, n[i], i); errors++; } } #define STR(x) #x #define p(i) int q##i, #define P(i) n[i] = q##i; #define p0 p(0) #define p1 p(1) #define p2 p(2) #define p3 p(3) #define p4 p(4) #define p5 p(5) #define p6 p(6) #define p7 p(7) #define p8 p(8) #define p9 p(9) #define P0 P(0) #define P1 P(1) #define P2 P(2) #define P3 P(3) #define P4 P(4) #define P5 P(5) #define P6 P(6) #define P7 P(7) #define P8 P(8) #define P9 P(9) #define TCASE(x, params, vecinit) \ static void \ varargs##x (params ...) \ { \ va_list ap; \ int n[11]; \ int i; \ \ va_start (ap, q##x); \ vecinit \ for (i = x + 1; i <= 10; i++) \ n[i] = va_arg (ap, int); \ va_end (ap); \ \ verify (STR(varargs##x), n); \ } #define TEST(x) varargs##x (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) TCASE(0, p0 , P0 ) TCASE(1, p0 p1 , P0 P1 ) TCASE(2, p0 p1 p2 , P0 P1 P2 ) TCASE(3, p0 p1 p2 p3 , P0 P1 P2 P3 ) TCASE(4, p0 p1 p2 p3 p4 , P0 P1 P2 P3 P4 ) TCASE(5, p0 p1 p2 p3 p4 p5 , P0 P1 P2 P3 P4 P5 ) TCASE(6, p0 p1 p2 p3 p4 p5 p6 , P0 P1 P2 P3 P4 P5 P6 ) TCASE(7, p0 p1 p2 p3 p4 p5 p6 p7 , P0 P1 P2 P3 P4 P5 P6 P7 ) TCASE(8, p0 p1 p2 p3 p4 p5 p6 p7 p8 , P0 P1 P2 P3 P4 P5 P6 P7 P8 ) TCASE(9, p0 p1 p2 p3 p4 p5 p6 p7 p8 p9, P0 P1 P2 P3 P4 P5 P6 P7 P8 P9) int main(void) { TEST(0); TEST(1); TEST(2); TEST(3); TEST(4); TEST(5); TEST(6); TEST(7); TEST(8); TEST(9); if (errors) abort (); exit (0); }