#include extern void abort (void); int foo_arg, bar_arg; long x; double d; va_list gap; va_list *pap; void foo (int v, va_list ap) { switch (v) { case 5: foo_arg = va_arg (ap, int); break; default: abort (); } } void bar (int v) { if (v == 0x4006) { if (va_arg (gap, double) != 17.0 || va_arg (gap, long) != 129L) abort (); } else if (v == 0x4008) { if (va_arg (*pap, long long) != 14LL || va_arg (*pap, long double) != 131.0L || va_arg (*pap, int) != 17) abort (); } bar_arg = v; } void f0 (int i, ...) { } void f1 (int i, ...) { va_list ap; va_start (ap, i); va_end (ap); } void f2 (int i, ...) { va_list ap; va_start (ap, i); bar (d); x = va_arg (ap, long); bar (x); va_end (ap); } void f3 (int i, ...) { va_list ap; va_start (ap, i); d = va_arg (ap, double); va_end (ap); } void f4 (int i, ...) { va_list ap; va_start (ap, i); x = va_arg (ap, double); foo (i, ap); va_end (ap); } void f5 (int i, ...) { va_list ap; va_start (ap, i); va_copy (gap, ap); bar (i); va_end (ap); va_end (gap); } void f6 (int i, ...) { va_list ap; va_start (ap, i); bar (d); va_arg (ap, long); va_arg (ap, long); x = va_arg (ap, long); bar (x); va_end (ap); } void f7 (int i, ...) { va_list ap; va_start (ap, i); pap = ≈ bar (i); va_end (ap); } void f8 (int i, ...) { va_list ap; va_start (ap, i); pap = ≈ bar (i); d = va_arg (ap, double); va_end (ap); } int main (void) { f0 (1); f1 (2); d = 31.0; f2 (3, 28L); if (bar_arg != 28 || x != 28) abort (); f3 (4, 131.0); if (d != 131.0) abort (); f4 (5, 16.0, 128); if (x != 16 || foo_arg != 128) abort (); f5 (0x4006, 17.0, 129L); if (bar_arg != 0x4006) abort (); f6 (7, 12L, 14L, -31L); if (bar_arg != -31) abort (); f7 (0x4008, 14LL, 131.0L, 17, 26.0); if (bar_arg != 0x4008) abort (); f8 (0x4008, 14LL, 131.0L, 17, 27.0); if (bar_arg != 0x4008 || d != 27.0) abort (); return 0; }