| #include <stdarg.h> |
| |
| extern void abort (void); |
| |
| int foo_arg, bar_arg; |
| long x; |
| double d; |
| va_list gap; |
| |
| void |
| foo (int v, va_list ap) |
| { |
| switch (v) |
| { |
| case 5: |
| foo_arg = va_arg (ap, int); |
| foo_arg += va_arg (ap, double); |
| foo_arg += va_arg (ap, long long); |
| break; |
| case 8: |
| foo_arg = va_arg (ap, long long); |
| foo_arg += va_arg (ap, double); |
| break; |
| case 11: |
| foo_arg = va_arg (ap, int); |
| foo_arg += va_arg (ap, long double); |
| break; |
| default: |
| abort (); |
| } |
| } |
| |
| void |
| bar (int v) |
| { |
| if (v == 0x4002) |
| { |
| if (va_arg (gap, int) != 13 || va_arg (gap, double) != -14.0) |
| abort (); |
| } |
| bar_arg = v; |
| } |
| |
| void |
| f1 (int i, ...) |
| { |
| va_start (gap, i); |
| x = va_arg (gap, long); |
| va_end (gap); |
| } |
| |
| void |
| f2 (int i, ...) |
| { |
| va_start (gap, i); |
| bar (i); |
| va_end (gap); |
| } |
| |
| void |
| f3 (int i, ...) |
| { |
| va_list aps[10]; |
| va_start (aps[4], i); |
| x = va_arg (aps[4], long); |
| va_end (aps[4]); |
| } |
| |
| void |
| f4 (int i, ...) |
| { |
| va_list aps[10]; |
| va_start (aps[4], i); |
| bar (i); |
| va_end (aps[4]); |
| } |
| |
| void |
| f5 (int i, ...) |
| { |
| va_list aps[10]; |
| va_start (aps[4], i); |
| foo (i, aps[4]); |
| va_end (aps[4]); |
| } |
| |
| struct A { int i; va_list g; va_list h[2]; }; |
| |
| void |
| f6 (int i, ...) |
| { |
| struct A a; |
| va_start (a.g, i); |
| x = va_arg (a.g, long); |
| va_end (a.g); |
| } |
| |
| void |
| f7 (int i, ...) |
| { |
| struct A a; |
| va_start (a.g, i); |
| bar (i); |
| va_end (a.g); |
| } |
| |
| void |
| f8 (int i, ...) |
| { |
| struct A a; |
| va_start (a.g, i); |
| foo (i, a.g); |
| va_end (a.g); |
| } |
| |
| void |
| f10 (int i, ...) |
| { |
| struct A a; |
| va_start (a.h[1], i); |
| x = va_arg (a.h[1], long); |
| va_end (a.h[1]); |
| } |
| |
| void |
| f11 (int i, ...) |
| { |
| struct A a; |
| va_start (a.h[1], i); |
| bar (i); |
| va_end (a.h[1]); |
| } |
| |
| void |
| f12 (int i, ...) |
| { |
| struct A a; |
| va_start (a.h[1], i); |
| foo (i, a.h[1]); |
| va_end (a.h[1]); |
| } |
| |
| int |
| main (void) |
| { |
| f1 (1, 79L); |
| if (x != 79L) |
| abort (); |
| f2 (0x4002, 13, -14.0); |
| if (bar_arg != 0x4002) |
| abort (); |
| f3 (3, 2031L); |
| if (x != 2031) |
| abort (); |
| f4 (4, 18); |
| if (bar_arg != 4) |
| abort (); |
| f5 (5, 1, 19.0, 18LL); |
| if (foo_arg != 38) |
| abort (); |
| f6 (6, 18L); |
| if (x != 18L) |
| abort (); |
| f7 (7); |
| if (bar_arg != 7) |
| abort (); |
| f8 (8, 2031LL, 13.0); |
| if (foo_arg != 2044) |
| abort (); |
| f10 (9, 180L); |
| if (x != 180L) |
| abort (); |
| f11 (10); |
| if (bar_arg != 10) |
| abort (); |
| f12 (11, 2030, 12.0L); |
| if (foo_arg != 2042) |
| abort (); |
| return 0; |
| } |