mirror of
https://github.com/nArnoSNES/tcc-65816.git
synced 2024-05-31 22:41:28 +00:00
181 lines
2.4 KiB
C
181 lines
2.4 KiB
C
#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;
|
|
}
|