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