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