1 #include <stdarg.h>
2 
3 extern void abort (void);
4 long x, y;
5 
6 inline void __attribute__((always_inline))
f1i(va_list ap)7 f1i (va_list ap)
8 {
9   x = va_arg (ap, double);
10   x += va_arg (ap, long);
11   x += va_arg (ap, double);
12 }
13 
14 void
f1(int i,...)15 f1 (int i, ...)
16 {
17   va_list ap;
18   va_start (ap, i);
19   f1i (ap);
20   va_end (ap);
21 }
22 
23 inline void __attribute__((always_inline))
f2i(va_list ap)24 f2i (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 
32 void
f2(int i,...)33 f2 (int i, ...)
34 {
35   va_list ap;
36   va_start (ap, i);
37   f2i (ap);
38   va_end (ap);
39 }
40 
41 long
f3h(int i,long arg0,long arg1,long arg2,long arg3)42 f3h (int i, long arg0, long arg1, long arg2, long arg3)
43 {
44   return i + arg0 + arg1 + arg2 + arg3;
45 }
46 
47 long
f3(int i,...)48 f3 (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 
89 void
f4(int i,...)90 f4 (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 
111 int
main(void)112 main (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