modula2: M2MetaError.{def,mod} and P2SymBuild.mod further cleanup
[official-gcc.git] / gcc / testsuite / gcc.dg / c23-stdarg-6.c
blobd5f08d0f5c2cd3c6628aed5b277c9d5ddc9802b8
1 /* Test C23 variadic functions with no named parameters, or last named
2 parameter with a declaration not allowed in C17. Execution tests. */
3 /* { dg-do run } */
4 /* { dg-options "-std=c23 -pedantic-errors" } */
6 #include <stdarg.h>
8 extern void abort (void);
9 extern void exit (int);
10 struct s { char c[1000]; };
12 struct s
13 f (...)
15 va_list ap;
16 va_start (ap);
17 double r = va_arg (ap, int);
18 r += va_arg (ap, double);
19 r += va_arg (ap, int);
20 r += va_arg (ap, double);
21 va_end (ap);
22 struct s ret = {};
23 ret.c[0] = r;
24 ret.c[999] = 42;
25 return ret;
28 struct s
29 g (...)
31 va_list ap;
32 va_start (ap, random ! ignored, ignored ** text);
33 for (int i = 0; i < 10; i++)
34 if (va_arg (ap, double) != i)
35 abort ();
36 va_end (ap);
37 struct s ret = {};
38 ret.c[0] = 17;
39 ret.c[999] = 58;
40 return ret;
43 struct s
44 h1 (register int x, ...)
46 va_list ap;
47 va_start (ap);
48 for (int i = 0; i < 10; i++)
50 if (va_arg (ap, double) != i)
51 abort ();
52 i++;
53 if (va_arg (ap, int) != i)
54 abort ();
56 va_end (ap);
57 struct s ret = {};
58 ret.c[0] = 32;
59 ret.c[999] = 95;
60 return ret;
63 struct s
64 h2 (int x(), ...)
66 va_list ap;
67 va_start (ap);
68 for (int i = 0; i < 10; i++)
70 if (va_arg (ap, double) != i)
71 abort ();
72 i++;
73 if (va_arg (ap, int) != i)
74 abort ();
76 va_end (ap);
77 struct s ret = {};
78 ret.c[0] = 5;
79 ret.c[999] = 125;
80 return ret;
83 struct s
84 h3 (int x[10], ...)
86 va_list ap;
87 va_start (ap);
88 for (int i = 0; i < 10; i++)
90 if (va_arg (ap, double) != i)
91 abort ();
92 i++;
93 if (va_arg (ap, int) != i)
94 abort ();
96 va_end (ap);
97 struct s ret = {};
98 ret.c[0] = 8;
99 ret.c[999] = 12;
100 return ret;
103 struct s
104 h4 (char x, ...)
106 va_list ap;
107 va_start (ap);
108 for (int i = 0; i < 10; i++)
110 if (va_arg (ap, double) != i)
111 abort ();
112 i++;
113 if (va_arg (ap, int) != i)
114 abort ();
116 va_end (ap);
117 struct s ret = {};
118 ret.c[0] = 18;
119 ret.c[999] = 28;
120 return ret;
123 struct s
124 h5 (float x, ...)
126 va_list ap;
127 va_start (ap);
128 for (int i = 0; i < 10; i++)
130 if (va_arg (ap, double) != i)
131 abort ();
132 i++;
133 if (va_arg (ap, int) != i)
134 abort ();
136 va_end (ap);
137 struct s ret = {};
138 ret.c[0] = 38;
139 ret.c[999] = 48;
140 return ret;
143 struct s
144 h6 (volatile long x, ...)
146 va_list ap;
147 va_start (ap);
148 for (int i = 0; i < 10; i++)
150 if (va_arg (ap, double) != i)
151 abort ();
152 i++;
153 if (va_arg (ap, int) != i)
154 abort ();
156 va_end (ap);
157 struct s ret = {};
158 ret.c[0] = 58;
159 ret.c[999] = 68;
160 return ret;
163 struct s
164 h7 (volatile struct s x, ...)
166 va_list ap;
167 va_start (ap);
168 for (int i = 0; i < 10; i++)
170 if (va_arg (ap, double) != i)
171 abort ();
172 i++;
173 if (va_arg (ap, int) != i)
174 abort ();
176 va_end (ap);
177 struct s ret = {};
178 ret.c[0] = 78;
179 ret.c[999] = 88;
180 return ret;
184 main ()
186 struct s x = f (1, 2.0, 3, 4.0);
187 if (x.c[0] != 10 || x.c[999] != 42)
188 abort ();
189 x = g (0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0);
190 if (x.c[0] != 17 || x.c[999] != 58)
191 abort ();
192 x = g (0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f);
193 if (x.c[0] != 17 || x.c[999] != 58)
194 abort ();
195 x = h1 (0, 0.0, 1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9);
196 if (x.c[0] != 32 || x.c[999] != 95)
197 abort ();
198 x = h2 (0, 0.0, 1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9);
199 if (x.c[0] != 5 || x.c[999] != 125)
200 abort ();
201 x = h3 (0, 0.0, 1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9);
202 if (x.c[0] != 8 || x.c[999] != 12)
203 abort ();
204 x = h4 (0, 0.0, 1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9);
205 if (x.c[0] != 18 || x.c[999] != 28)
206 abort ();
207 x = h5 (0, 0.0, 1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9);
208 if (x.c[0] != 38 || x.c[999] != 48)
209 abort ();
210 x = h6 (0, 0.0, 1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9);
211 if (x.c[0] != 58 || x.c[999] != 68)
212 abort ();
213 x = h7 ((struct s) {}, 0.0, 1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9);
214 if (x.c[0] != 78 || x.c[999] != 88)
215 abort ();
216 exit (0);