| /* Test C23 variadic functions with no named parameters, or last named |
| parameter with a declaration not allowed in C17. Execution tests. */ |
| /* { dg-do run } */ |
| /* { dg-options "-std=c23 -pedantic-errors" } */ |
| |
| #include <stdarg.h> |
| |
| extern void abort (void); |
| extern void exit (int); |
| struct s { char c[1000]; }; |
| |
| struct s |
| f (...) |
| { |
| va_list ap; |
| va_start (ap); |
| double r = va_arg (ap, int); |
| r += va_arg (ap, double); |
| r += va_arg (ap, int); |
| r += va_arg (ap, double); |
| va_end (ap); |
| struct s ret = {}; |
| ret.c[0] = r; |
| ret.c[999] = 42; |
| return ret; |
| } |
| |
| struct s |
| g (...) |
| { |
| va_list ap; |
| va_start (ap, random ! ignored, ignored ** text); |
| for (int i = 0; i < 10; i++) |
| if (va_arg (ap, double) != i) |
| abort (); |
| va_end (ap); |
| struct s ret = {}; |
| ret.c[0] = 17; |
| ret.c[999] = 58; |
| return ret; |
| } |
| |
| struct s |
| h1 (register int x, ...) |
| { |
| va_list ap; |
| va_start (ap); |
| for (int i = 0; i < 10; i++) |
| { |
| if (va_arg (ap, double) != i) |
| abort (); |
| i++; |
| if (va_arg (ap, int) != i) |
| abort (); |
| } |
| va_end (ap); |
| struct s ret = {}; |
| ret.c[0] = 32; |
| ret.c[999] = 95; |
| return ret; |
| } |
| |
| struct s |
| h2 (int x(), ...) |
| { |
| va_list ap; |
| va_start (ap); |
| for (int i = 0; i < 10; i++) |
| { |
| if (va_arg (ap, double) != i) |
| abort (); |
| i++; |
| if (va_arg (ap, int) != i) |
| abort (); |
| } |
| va_end (ap); |
| struct s ret = {}; |
| ret.c[0] = 5; |
| ret.c[999] = 125; |
| return ret; |
| } |
| |
| struct s |
| h3 (int x[10], ...) |
| { |
| va_list ap; |
| va_start (ap); |
| for (int i = 0; i < 10; i++) |
| { |
| if (va_arg (ap, double) != i) |
| abort (); |
| i++; |
| if (va_arg (ap, int) != i) |
| abort (); |
| } |
| va_end (ap); |
| struct s ret = {}; |
| ret.c[0] = 8; |
| ret.c[999] = 12; |
| return ret; |
| } |
| |
| struct s |
| h4 (char x, ...) |
| { |
| va_list ap; |
| va_start (ap); |
| for (int i = 0; i < 10; i++) |
| { |
| if (va_arg (ap, double) != i) |
| abort (); |
| i++; |
| if (va_arg (ap, int) != i) |
| abort (); |
| } |
| va_end (ap); |
| struct s ret = {}; |
| ret.c[0] = 18; |
| ret.c[999] = 28; |
| return ret; |
| } |
| |
| struct s |
| h5 (float x, ...) |
| { |
| va_list ap; |
| va_start (ap); |
| for (int i = 0; i < 10; i++) |
| { |
| if (va_arg (ap, double) != i) |
| abort (); |
| i++; |
| if (va_arg (ap, int) != i) |
| abort (); |
| } |
| va_end (ap); |
| struct s ret = {}; |
| ret.c[0] = 38; |
| ret.c[999] = 48; |
| return ret; |
| } |
| |
| struct s |
| h6 (volatile long x, ...) |
| { |
| va_list ap; |
| va_start (ap); |
| for (int i = 0; i < 10; i++) |
| { |
| if (va_arg (ap, double) != i) |
| abort (); |
| i++; |
| if (va_arg (ap, int) != i) |
| abort (); |
| } |
| va_end (ap); |
| struct s ret = {}; |
| ret.c[0] = 58; |
| ret.c[999] = 68; |
| return ret; |
| } |
| |
| struct s |
| h7 (volatile struct s x, ...) |
| { |
| va_list ap; |
| va_start (ap); |
| for (int i = 0; i < 10; i++) |
| { |
| if (va_arg (ap, double) != i) |
| abort (); |
| i++; |
| if (va_arg (ap, int) != i) |
| abort (); |
| } |
| va_end (ap); |
| struct s ret = {}; |
| ret.c[0] = 78; |
| ret.c[999] = 88; |
| return ret; |
| } |
| |
| int |
| main () |
| { |
| struct s x = f (1, 2.0, 3, 4.0); |
| if (x.c[0] != 10 || x.c[999] != 42) |
| abort (); |
| x = g (0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0); |
| if (x.c[0] != 17 || x.c[999] != 58) |
| abort (); |
| x = g (0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f); |
| if (x.c[0] != 17 || x.c[999] != 58) |
| abort (); |
| x = h1 (0, 0.0, 1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9); |
| if (x.c[0] != 32 || x.c[999] != 95) |
| abort (); |
| x = h2 (0, 0.0, 1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9); |
| if (x.c[0] != 5 || x.c[999] != 125) |
| abort (); |
| x = h3 (0, 0.0, 1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9); |
| if (x.c[0] != 8 || x.c[999] != 12) |
| abort (); |
| x = h4 (0, 0.0, 1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9); |
| if (x.c[0] != 18 || x.c[999] != 28) |
| abort (); |
| x = h5 (0, 0.0, 1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9); |
| if (x.c[0] != 38 || x.c[999] != 48) |
| abort (); |
| x = h6 (0, 0.0, 1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9); |
| if (x.c[0] != 58 || x.c[999] != 68) |
| abort (); |
| x = h7 ((struct s) {}, 0.0, 1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9); |
| if (x.c[0] != 78 || x.c[999] != 88) |
| abort (); |
| exit (0); |
| } |