1#include <stdarg.h>
2
3extern void abort (void);
4
5int foo_arg, bar_arg;
6long x;
7double d;
8va_list gap;
9va_list *pap;
10
11void
12foo (int v, va_list ap)
13{
14  switch (v)
15    {
16    case 5: foo_arg = va_arg (ap, int); break;
17    default: abort ();
18    }
19}
20
21void
22bar (int v)
23{
24  if (v == 0x4006)
25    {
26      if (va_arg (gap, double) != 17.0
27	  || va_arg (gap, long) != 129L)
28	abort ();
29    }
30  else if (v == 0x4008)
31    {
32      if (va_arg (*pap, long long) != 14LL
33	  || va_arg (*pap, long double) != 131.0L
34	  || va_arg (*pap, int) != 17)
35	abort ();
36    }
37  bar_arg = v;
38}
39
40void
41f0 (int i, ...)
42{
43}
44
45void
46f1 (int i, ...)
47{
48  va_list ap;
49  va_start (ap, i);
50  va_end (ap);
51}
52
53void
54f2 (int i, ...)
55{
56  va_list ap;
57  va_start (ap, i);
58  bar (d);
59  x = va_arg (ap, long);
60  bar (x);
61  va_end (ap);
62}
63
64void
65f3 (int i, ...)
66{
67  va_list ap;
68  va_start (ap, i);
69  d = va_arg (ap, double);
70  va_end (ap);
71}
72
73void
74f4 (int i, ...)
75{
76  va_list ap;
77  va_start (ap, i);
78  x = va_arg (ap, double);
79  foo (i, ap);
80  va_end (ap);
81}
82
83void
84f5 (int i, ...)
85{
86  va_list ap;
87  va_start (ap, i);
88  va_copy (gap, ap);
89  bar (i);
90  va_end (ap);
91  va_end (gap);
92}
93
94void
95f6 (int i, ...)
96{
97  va_list ap;
98  va_start (ap, i);
99  bar (d);
100  va_arg (ap, long);
101  va_arg (ap, long);
102  x = va_arg (ap, long);
103  bar (x);
104  va_end (ap);
105}
106
107void
108f7 (int i, ...)
109{
110  va_list ap;
111  va_start (ap, i);
112  pap = &ap;
113  bar (i);
114  va_end (ap);
115}
116
117void
118f8 (int i, ...)
119{
120  va_list ap;
121  va_start (ap, i);
122  pap = &ap;
123  bar (i);
124  d = va_arg (ap, double);
125  va_end (ap);
126}
127
128int
129main (void)
130{
131  f0 (1);
132  f1 (2);
133  d = 31.0;
134  f2 (3, 28L);
135  if (bar_arg != 28 || x != 28)
136    abort ();
137  f3 (4, 131.0);
138  if (d != 131.0)
139    abort ();
140  f4 (5, 16.0, 128);
141  if (x != 16 || foo_arg != 128)
142    abort ();
143  f5 (0x4006, 17.0, 129L);
144  if (bar_arg != 0x4006)
145    abort ();
146  f6 (7, 12L, 14L, -31L);
147  if (bar_arg != -31)
148    abort ();
149  f7 (0x4008, 14LL, 131.0L, 17, 26.0);
150  if (bar_arg != 0x4008)
151    abort ();
152  f8 (0x4008, 14LL, 131.0L, 17, 27.0);
153  if (bar_arg != 0x4008 || d != 27.0)
154    abort ();
155  return 0;
156}
157