1 /* { dg-do run } */
2 /* { dg-additional-options "-Wno-pedantic -Wno-long-long -fshort-enums" } */
3 
4 /* va args, promoted as regular knr args.  */
5 
chars(int i,...)6 void __attribute__ ((noinline)) chars (int i, ...)
7 {
8   __builtin_va_list args;
9   __builtin_va_start (args, i);
10 
11   if (__builtin_va_arg (args, int) != 1) __builtin_abort ();
12   if (__builtin_va_arg (args, int) != 2) __builtin_abort ();
13   __builtin_va_end (args);
14 }
15 
shorts(int i,...)16 void __attribute__ ((noinline)) shorts (int i, ...)
17 {
18   __builtin_va_list args;
19   __builtin_va_start (args, i);
20 
21   if (__builtin_va_arg (args, int) != 1) __builtin_abort ();
22   if (__builtin_va_arg (args, int) != 2) __builtin_abort ();
23   if (__builtin_va_arg (args, int) != 3) __builtin_abort ();
24   __builtin_va_end (args);
25 }
26 
ints(int i,...)27 void __attribute__ ((noinline)) ints (int i, ...)
28 {
29   __builtin_va_list args;
30   __builtin_va_start (args, i);
31 
32   if (__builtin_va_arg (args, int) != 1) __builtin_abort ();
33   if (__builtin_va_arg (args, int) != 2) __builtin_abort ();
34   if (__builtin_va_arg (args, int) != 3) __builtin_abort ();
35   __builtin_va_end (args);
36 }
37 
longlongs(int i,...)38 void __attribute__ ((noinline)) longlongs (int i, ...)
39 {
40   __builtin_va_list args;
41   __builtin_va_start (args, i);
42 
43   if (__builtin_va_arg (args, int) != 1) __builtin_abort ();
44   if (__builtin_va_arg (args, long long) != 2) __builtin_abort ();
45   if (__builtin_va_arg (args, long long) != 3) __builtin_abort ();
46   __builtin_va_end (args);
47 }
48 
49 typedef int __attribute__ ((mode(TI))) ti;
50 
tis(int i,...)51 void __attribute__ ((noinline)) tis (int i, ...)
52 {
53   __builtin_va_list args;
54   __builtin_va_start (args, i);
55 
56   if (__builtin_va_arg (args, int) != 1) __builtin_abort ();
57   if (__builtin_va_arg (args, ti) != 2) __builtin_abort ();
58   if (__builtin_va_arg (args, ti) != 3) __builtin_abort ();
59   __builtin_va_end (args);
60 }
61 
floats(int i,...)62 void __attribute__ ((noinline)) floats (int i, ...)
63 {
64   __builtin_va_list args;
65   __builtin_va_start (args, i);
66 
67   if (__builtin_va_arg (args, int) != 1) __builtin_abort ();
68   if (__builtin_va_arg (args, double) != 2) __builtin_abort ();
69   if (__builtin_va_arg (args, double) != 3) __builtin_abort ();
70   __builtin_va_end (args);
71 }
72 
doubles(int i,...)73 void __attribute__ ((noinline)) doubles (int i, ...)
74 {
75   __builtin_va_list args;
76   __builtin_va_start (args, i);
77 
78   if (__builtin_va_arg (args, int) != 1) __builtin_abort ();
79   if (__builtin_va_arg (args, double) != 2) __builtin_abort ();
80   if (__builtin_va_arg (args, double) != 3) __builtin_abort ();
81   __builtin_va_end (args);
82 }
83 
84 typedef enum {ec1, ec2, ecmax = 0xf} echar;
85 typedef enum {es1, es2, esmax = 0xfff} eshort;
86 typedef enum {ei1, ei2, eimax = 0xfffff} eint;
87 
echars(int i,...)88 void __attribute__ ((noinline)) echars (int i, ...)
89 {
90   __builtin_va_list args;
91   __builtin_va_start (args, i);
92 
93   if (__builtin_va_arg (args, int) != ec1) __builtin_abort ();
94   if (__builtin_va_arg (args, int) != ec2) __builtin_abort ();
95   if (__builtin_va_arg (args, int) != ecmax) __builtin_abort ();
96   __builtin_va_end (args);
97 }
98 
eshorts(int i,...)99 void __attribute__ ((noinline)) eshorts (int i, ...)
100 {
101   __builtin_va_list args;
102   __builtin_va_start (args, i);
103 
104   if (__builtin_va_arg (args, int) != es1) __builtin_abort ();
105   if (__builtin_va_arg (args, int) != es2) __builtin_abort ();
106   if (__builtin_va_arg (args, int) != esmax) __builtin_abort ();
107   __builtin_va_end (args);
108 }
109 
eints(int i,...)110 void __attribute__ ((noinline)) eints (int i, ...)
111 {
112   __builtin_va_list args;
113   __builtin_va_start (args, i);
114 
115   if (__builtin_va_arg (args, int) != ei1) __builtin_abort ();
116   if (__builtin_va_arg (args, int) != ei2) __builtin_abort ();
117   if (__builtin_va_arg (args, int) != eimax) __builtin_abort ();
118   __builtin_va_end (args);
119 }
120 
121 typedef struct {char a;} one;
122 typedef struct {short a;} two;
123 typedef struct {int a;} four;
124 typedef struct {long long a;} eight;
125 typedef struct {int a, b[12];} big;
126 
structs(int i,...)127 void __attribute__ ((noinline)) structs (int i, ...)
128 {
129   __builtin_va_list args;
130   __builtin_va_start (args, i);
131 
132   if (__builtin_va_arg (args, int) != 1) __builtin_abort ();
133   if (__builtin_va_arg (args, one).a != 2) __builtin_abort ();
134   if (__builtin_va_arg (args, int) != 3) __builtin_abort ();
135   if (__builtin_va_arg (args, two).a != 4) __builtin_abort ();
136   if (__builtin_va_arg (args, int) != 5) __builtin_abort ();
137   if (__builtin_va_arg (args, four).a != 6) __builtin_abort ();
138   if (__builtin_va_arg (args, int) != 7) __builtin_abort ();
139   if (__builtin_va_arg (args, eight).a != 8) __builtin_abort ();
140   if (__builtin_va_arg (args, int) != 9) __builtin_abort ();
141   if (__builtin_va_arg (args, big).a != 10) __builtin_abort ();
142   __builtin_va_end (args);
143 }
144 
main()145 int main ()
146 {
147   char vc1, vc2, vc3, vc4, vc5;
148   short vs1, vs2, vs3;
149   int vi1, vi2, vi3;
150   long long vll1, vll2;
151   ti vti1, vti2;
152   float vf1, vf2;
153   double vd1, vd2;
154 
155   one vone;
156   two vtwo;
157   four vfour;
158   eight veight;
159   big vbig;
160   echar vec1, vec2,  vec3;
161   eshort ves1, ves2,  ves3;
162   eint vei1, vei2,  vei3;
163 
164   vc1 = 1, vc2 = 2;
165   chars (1, vc1, vc2);
166 
167   vc1 = 1, vs1 = 2, vs2 = 3;
168   shorts (1, vc1, vs1, vs2);
169 
170   vc1 = 1, vi1 = 2, vi2 = 3;
171   ints (1, vc1, vi1, vi2);
172 
173   vc1 = 1,  vll1 = 2, vll2 = 3;
174   longlongs (1, vc1, vll1, vll2);
175 
176   vc1 = 1, vti1 = 2, vti2 = 3;
177   tis (1, vc1,  vti1, vti2);
178 
179   vc1 = 1,  vf1 = 2, vf2 = 3;
180   floats (1, vc1, vf1, vf2);
181   doubles (1, vc1, vf1, vf2); /* Floats are promoted, so this should work. */
182 
183   vc1 = 1, vd1 = 2, vd2 = 3;
184   floats (1, vc1, vf1, vf2); /* Floats are promoted, so this should work. */
185   doubles (1, vc1, vf1, vf2);
186 
187   vec1 = ec1, vec2 = ec2, vec3 = ecmax;
188   echars (1, vec1, vec2, vec3);
189   vc1 = ec1, vc2 = ec2, vc3 = ecmax;
190   echars (1, vc1, vc2, vc3);
191 
192   ves1 = ec1, ves2 = ec2, ves3 = esmax;
193   eshorts (1, ves1, ves2, ves3);
194   vs1 = ec1, vs2 = ec2, vs3 = esmax;
195   eshorts (1, vs1, vs2, vs3);
196 
197   vei1 = ec1, vei2 = ec2, vei3 = eimax;
198   eints (1, vei1, vei2, vei3);
199   vi1 = ec1, vi2 = ec2, vi3 = eimax;
200   eints (1, vi1, vi2, vi3);
201 
202   vc1 = 1, vone.a = 2, vc2 = 3, vtwo.a = 4,
203     vc3 = 5, vfour.a = 6, vc4 = 7, veight.a = 8,
204     vc5 = 9, vbig.a = 10;
205   structs (1, vc1,  vone, vc2, vtwo, vc3, vfour, vc4, veight, vc5, vbig);
206 
207   return 0;
208 }
209