1#include <stdarg.h>
2
3extern void abort (void);
4long x, y;
5
6inline void __attribute__((always_inline))
7f1i (va_list ap)
8{
9  x = va_arg (ap, double);
10  x += va_arg (ap, long);
11  x += va_arg (ap, double);
12}
13
14void
15f1 (int i, ...)
16{
17  va_list ap;
18  va_start (ap, i);
19  f1i (ap);
20  va_end (ap);
21}
22
23inline void __attribute__((always_inline))
24f2i (va_list ap)
25{
26  y = va_arg (ap, int);
27  y += va_arg (ap, long);
28  y += va_arg (ap, double);
29  f1i (ap);
30}
31
32void
33f2 (int i, ...)
34{
35  va_list ap;
36  va_start (ap, i);
37  f2i (ap);
38  va_end (ap);
39}
40
41long
42f3h (int i, long arg0, long arg1, long arg2, long arg3)
43{
44  return i + arg0 + arg1 + arg2 + arg3;
45}
46
47long
48f3 (int i, ...)
49{
50  long t, arg0, arg1, arg2, arg3;
51  va_list ap;
52
53  va_start (ap, i);
54  switch (i)
55    {
56    case 0:
57      t = f3h (i, 0, 0, 0, 0);
58      break;
59    case 1:
60      arg0 = va_arg (ap, long);
61      t = f3h (i, arg0, 0, 0, 0);
62      break;
63    case 2:
64      arg0 = va_arg (ap, long);
65      arg1 = va_arg (ap, long);
66      t = f3h (i, arg0, arg1, 0, 0);
67      break;
68    case 3:
69      arg0 = va_arg (ap, long);
70      arg1 = va_arg (ap, long);
71      arg2 = va_arg (ap, long);
72      t = f3h (i, arg0, arg1, arg2, 0);
73      break;
74    case 4:
75      arg0 = va_arg (ap, long);
76      arg1 = va_arg (ap, long);
77      arg2 = va_arg (ap, long);
78      arg3 = va_arg (ap, long);
79      t = f3h (i, arg0, arg1, arg2, arg3);
80      break;
81    default:
82      abort ();
83    }
84  va_end (ap);
85
86  return t;
87}
88
89void
90f4 (int i, ...)
91{
92  va_list ap;
93
94  va_start (ap, i);
95  switch (i)
96    {
97    case 4:
98      y = va_arg (ap, double);
99      break;
100    case 5:
101      y = va_arg (ap, double);
102      y += va_arg (ap, double);
103      break;
104    default:
105      abort ();
106    }
107  f1i (ap);
108  va_end (ap);
109}
110
111int
112main (void)
113{
114  f1 (3, 16.0, 128L, 32.0);
115  if (x != 176L)
116    abort ();
117  f2 (6, 5, 7L, 18.0, 19.0, 17L, 64.0);
118  if (x != 100L || y != 30L)
119    abort ();
120  if (f3 (0) != 0)
121    abort ();
122  if (f3 (1, 18L) != 19L)
123    abort ();
124  if (f3 (2, 18L, 100L) != 120L)
125    abort ();
126  if (f3 (3, 18L, 100L, 300L) != 421L)
127    abort ();
128  if (f3 (4, 18L, 71L, 64L, 86L) != 243L)
129    abort ();
130  f4 (4, 6.0, 9.0, 16L, 18.0);
131  if (x != 43L || y != 6L)
132    abort ();
133  f4 (5, 7.0, 21.0, 1.0, 17L, 126.0);
134  if (x != 144L || y != 28L)
135    abort ();
136  return 0;
137}
138