1 #include <stdarg.h>
2 
3 extern void abort (void);
4 
5 int foo_arg, bar_arg;
6 long x;
7 double d;
8 va_list gap;
9 
10 void
foo(int v,va_list ap)11 foo (int v, va_list ap)
12 {
13   switch (v)
14     {
15     case 5:
16       foo_arg = va_arg (ap, int);
17       foo_arg += va_arg (ap, double);
18       foo_arg += va_arg (ap, long long);
19       break;
20     case 8:
21       foo_arg = va_arg (ap, long long);
22       foo_arg += va_arg (ap, double);
23       break;
24     case 11:
25       foo_arg = va_arg (ap, int);
26       foo_arg += va_arg (ap, long double);
27       break;
28     default:
29       abort ();
30     }
31 }
32 
33 void
bar(int v)34 bar (int v)
35 {
36   if (v == 0x4002)
37     {
38       if (va_arg (gap, int) != 13 || va_arg (gap, double) != -14.0)
39 	abort ();
40     }
41   bar_arg = v;
42 }
43 
44 void
f1(int i,...)45 f1 (int i, ...)
46 {
47   va_start (gap, i);
48   x = va_arg (gap, long);
49   va_end (gap);
50 }
51 
52 void
f2(int i,...)53 f2 (int i, ...)
54 {
55   va_start (gap, i);
56   bar (i);
57   va_end (gap);
58 }
59 
60 void
f3(int i,...)61 f3 (int i, ...)
62 {
63   va_list aps[10];
64   va_start (aps[4], i);
65   x = va_arg (aps[4], long);
66   va_end (aps[4]);
67 }
68 
69 void
f4(int i,...)70 f4 (int i, ...)
71 {
72   va_list aps[10];
73   va_start (aps[4], i);
74   bar (i);
75   va_end (aps[4]);
76 }
77 
78 void
f5(int i,...)79 f5 (int i, ...)
80 {
81   va_list aps[10];
82   va_start (aps[4], i);
83   foo (i, aps[4]);
84   va_end (aps[4]);
85 }
86 
87 struct A { int i; va_list g; va_list h[2]; };
88 
89 void
f6(int i,...)90 f6 (int i, ...)
91 {
92   struct A a;
93   va_start (a.g, i);
94   x = va_arg (a.g, long);
95   va_end (a.g);
96 }
97 
98 void
f7(int i,...)99 f7 (int i, ...)
100 {
101   struct A a;
102   va_start (a.g, i);
103   bar (i);
104   va_end (a.g);
105 }
106 
107 void
f8(int i,...)108 f8 (int i, ...)
109 {
110   struct A a;
111   va_start (a.g, i);
112   foo (i, a.g);
113   va_end (a.g);
114 }
115 
116 void
f10(int i,...)117 f10 (int i, ...)
118 {
119   struct A a;
120   va_start (a.h[1], i);
121   x = va_arg (a.h[1], long);
122   va_end (a.h[1]);
123 }
124 
125 void
f11(int i,...)126 f11 (int i, ...)
127 {
128   struct A a;
129   va_start (a.h[1], i);
130   bar (i);
131   va_end (a.h[1]);
132 }
133 
134 void
f12(int i,...)135 f12 (int i, ...)
136 {
137   struct A a;
138   va_start (a.h[1], i);
139   foo (i, a.h[1]);
140   va_end (a.h[1]);
141 }
142 
143 int
main(void)144 main (void)
145 {
146   f1 (1, 79L);
147   if (x != 79L)
148     abort ();
149   f2 (0x4002, 13, -14.0);
150   if (bar_arg != 0x4002)
151     abort ();
152   f3 (3, 2031L);
153   if (x != 2031)
154     abort ();
155   f4 (4, 18);
156   if (bar_arg != 4)
157     abort ();
158   f5 (5, 1, 19.0, 18LL);
159   if (foo_arg != 38)
160     abort ();
161   f6 (6, 18L);
162   if (x != 18L)
163     abort ();
164   f7 (7);
165   if (bar_arg != 7)
166     abort ();
167   f8 (8, 2031LL, 13.0);
168   if (foo_arg != 2044)
169     abort ();
170   f10 (9, 180L);
171   if (x != 180L)
172     abort ();
173   f11 (10);
174   if (bar_arg != 10)
175     abort ();
176   f12 (11, 2030, 12.0L);
177   if (foo_arg != 2042)
178     abort ();
179   return 0;
180 }
181