blob: 40246f937efe6a99119d0e8ffb631ffa08002e79 [file] [log] [blame]
#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;
}