| /* 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 "-O2 -std=c23 -pedantic-errors" } */ |
| |
| #include <stdarg.h> |
| |
| struct S { int a[1024]; }; |
| |
| int |
| f1 (...) |
| { |
| int r = 0; |
| va_list ap; |
| va_start (ap); |
| r += va_arg (ap, int); |
| va_end (ap); |
| return r; |
| } |
| |
| int |
| f2 (...) |
| { |
| int r = 0; |
| va_list ap; |
| va_start (ap); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| va_end (ap); |
| return r; |
| } |
| |
| int |
| f3 (...) |
| { |
| int r = 0; |
| va_list ap; |
| va_start (ap); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| va_end (ap); |
| return r; |
| } |
| |
| int |
| f4 (...) |
| { |
| int r = 0; |
| va_list ap; |
| va_start (ap); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| va_end (ap); |
| return r; |
| } |
| |
| int |
| f5 (...) |
| { |
| int r = 0; |
| va_list ap; |
| va_start (ap); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| va_end (ap); |
| return r; |
| } |
| |
| int |
| f6 (...) |
| { |
| int r = 0; |
| va_list ap; |
| va_start (ap); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| va_end (ap); |
| return r; |
| } |
| |
| int |
| f7 (...) |
| { |
| int r = 0; |
| va_list ap; |
| va_start (ap); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| va_end (ap); |
| return r; |
| } |
| |
| int |
| f8 (...) |
| { |
| int r = 0; |
| va_list ap; |
| va_start (ap); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| va_end (ap); |
| return r; |
| } |
| |
| struct S |
| s1 (...) |
| { |
| int r = 0; |
| va_list ap; |
| va_start (ap); |
| r += va_arg (ap, int); |
| va_end (ap); |
| struct S s = {}; |
| s.a[0] = r; |
| return s; |
| } |
| |
| struct S |
| s2 (...) |
| { |
| int r = 0; |
| va_list ap; |
| va_start (ap); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| va_end (ap); |
| struct S s = {}; |
| s.a[0] = r; |
| return s; |
| } |
| |
| struct S |
| s3 (...) |
| { |
| int r = 0; |
| va_list ap; |
| va_start (ap); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| va_end (ap); |
| struct S s = {}; |
| s.a[0] = r; |
| return s; |
| } |
| |
| struct S |
| s4 (...) |
| { |
| int r = 0; |
| va_list ap; |
| va_start (ap); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| va_end (ap); |
| struct S s = {}; |
| s.a[0] = r; |
| return s; |
| } |
| |
| struct S |
| s5 (...) |
| { |
| int r = 0; |
| va_list ap; |
| va_start (ap); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| va_end (ap); |
| struct S s = {}; |
| s.a[0] = r; |
| return s; |
| } |
| |
| struct S |
| s6 (...) |
| { |
| int r = 0; |
| va_list ap; |
| va_start (ap); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| va_end (ap); |
| struct S s = {}; |
| s.a[0] = r; |
| return s; |
| } |
| |
| struct S |
| s7 (...) |
| { |
| int r = 0; |
| va_list ap; |
| va_start (ap); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| va_end (ap); |
| struct S s = {}; |
| s.a[0] = r; |
| return s; |
| } |
| |
| struct S |
| s8 (...) |
| { |
| int r = 0; |
| va_list ap; |
| va_start (ap); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| r += va_arg (ap, int); |
| va_end (ap); |
| struct S s = {}; |
| s.a[0] = r; |
| return s; |
| } |
| |
| int |
| b1 (void) |
| { |
| return f8 (1, 2, 3, 4, 5, 6, 7, 8); |
| } |
| |
| int |
| b2 (void) |
| { |
| return s8 (1, 2, 3, 4, 5, 6, 7, 8).a[0]; |
| } |
| |
| int |
| main () |
| { |
| if (f1 (1) != 1 || f2 (1, 2) != 3 || f3 (1, 2, 3) != 6 |
| || f4 (1, 2, 3, 4) != 10 || f5 (1, 2, 3, 4, 5) != 15 |
| || f6 (1, 2, 3, 4, 5, 6) != 21 || f7 (1, 2, 3, 4, 5, 6, 7) != 28 |
| || f8 (1, 2, 3, 4, 5, 6, 7, 8) != 36) |
| __builtin_abort (); |
| if (s1 (1).a[0] != 1 || s2 (1, 2).a[0] != 3 || s3 (1, 2, 3).a[0] != 6 |
| || s4 (1, 2, 3, 4).a[0] != 10 || s5 (1, 2, 3, 4, 5).a[0] != 15 |
| || s6 (1, 2, 3, 4, 5, 6).a[0] != 21 |
| || s7 (1, 2, 3, 4, 5, 6, 7).a[0] != 28 |
| || s8 (1, 2, 3, 4, 5, 6, 7, 8).a[0] != 36) |
| __builtin_abort (); |
| } |