annotate gcc/testsuite/g++.dg/ext/flexary4.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // PR c++/42121 - g++ should warn or error on internal 0 size array in struct
kono
parents:
diff changeset
2 // { dg-do compile }
kono
parents:
diff changeset
3 // { dg-options "-Wno-error=pedantic" }
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 // Flexible array members are a feature of C99 (and newer) not provided
kono
parents:
diff changeset
6 // by C++ 2014 and prior. G++ supports both the C99/C11 kind of flexible
kono
parents:
diff changeset
7 // array members and pre-C99 zero-size arrays (defining an array of size
kono
parents:
diff changeset
8 // zero). Since both features are provided for compatibility with C,
kono
parents:
diff changeset
9 // G++ allows them in the same contexts as in C.
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 #include "flexary.h"
kono
parents:
diff changeset
12
kono
parents:
diff changeset
13 struct Sx {
kono
parents:
diff changeset
14 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
15 };
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 // Verify that non-data members or static data members either before
kono
parents:
diff changeset
18 // or after a flexible array member in an otherwise empty struct don't
kono
parents:
diff changeset
19 // suppress the diagnostic.
kono
parents:
diff changeset
20 struct Sx2 {
kono
parents:
diff changeset
21 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
22 typedef int I;
kono
parents:
diff changeset
23 };
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 struct Sx3 {
kono
parents:
diff changeset
26 typedef int I;
kono
parents:
diff changeset
27 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
28 };
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 struct Sx4 {
kono
parents:
diff changeset
31 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
32 enum E { e };
kono
parents:
diff changeset
33 };
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 struct Sx5 {
kono
parents:
diff changeset
36 enum E { e };
kono
parents:
diff changeset
37 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
38 };
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 struct Sx6 {
kono
parents:
diff changeset
41 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
42 static int i;
kono
parents:
diff changeset
43 };
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 struct Sx7 {
kono
parents:
diff changeset
46 static int i;
kono
parents:
diff changeset
47 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
48 };
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 struct Sx8 {
kono
parents:
diff changeset
51 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
52 Sx8 () { }
kono
parents:
diff changeset
53 };
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 struct Sx9 {
kono
parents:
diff changeset
56 Sx9 () { }
kono
parents:
diff changeset
57 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
58 };
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 struct Sx10 {
kono
parents:
diff changeset
61 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
62 virtual ~Sx10 () { }
kono
parents:
diff changeset
63 };
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 struct Sx11 {
kono
parents:
diff changeset
66 virtual ~Sx11 () { }
kono
parents:
diff changeset
67 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
68 };
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 struct Sx12 {
kono
parents:
diff changeset
71 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
72 virtual void foo () = 0;
kono
parents:
diff changeset
73 };
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 struct Sx13 {
kono
parents:
diff changeset
76 virtual void foo () = 0;
kono
parents:
diff changeset
77 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
78 };
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 struct Sx14 {
kono
parents:
diff changeset
81 int a[][1]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
82 };
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 struct Sx15 {
kono
parents:
diff changeset
85 typedef int A[];
kono
parents:
diff changeset
86 A a; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
87 };
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 // Verify also that a zero-size array doesn't suppress the diagnostic.
kono
parents:
diff changeset
90 struct Sx16 {
kono
parents:
diff changeset
91 // a_0 below is diagnosed with -Wpedantic only and emits
kono
parents:
diff changeset
92 // warning: ISO C++ forbids zero-size arrays
kono
parents:
diff changeset
93 int a_0 [0];
kono
parents:
diff changeset
94 int a_x []; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
95 };
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 struct Sx17 {
kono
parents:
diff changeset
98 int a_x []; // { dg-error "flexible array member" }
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 // a_0 below is diagnosed with -Wpedantic only and emits
kono
parents:
diff changeset
101 // warning: ISO C++ forbids zero-size arrays
kono
parents:
diff changeset
102 int a_0 [0];
kono
parents:
diff changeset
103 };
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 // An empty struct is treated as if it had a single member of type
kono
parents:
diff changeset
106 // char but the member cannot be accessed. Therefore, a struct
kono
parents:
diff changeset
107 // containing a flexible array member followed by an empty struct
kono
parents:
diff changeset
108 // is diagnosed to prevent the former subobject from sharing space
kono
parents:
diff changeset
109 // with the latter.
kono
parents:
diff changeset
110 struct Sx18 {
kono
parents:
diff changeset
111 int a_x []; // { dg-error "flexible array member" }
kono
parents:
diff changeset
112 struct { /* empty */ } s;
kono
parents:
diff changeset
113 };
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 // Anonymous structs are a G++ extension. Members of anonymous structs
kono
parents:
diff changeset
116 // are treated as if they were declared in the enclosing class.
kono
parents:
diff changeset
117 struct Sx19 {
kono
parents:
diff changeset
118 struct { int i; }; // anonymous struct
kono
parents:
diff changeset
119 int a_x [];
kono
parents:
diff changeset
120 };
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 // Unlike in the case above, a named struct is not anonymous and
kono
parents:
diff changeset
123 // so doesn't contribute its member to that of the enclosing struct.
kono
parents:
diff changeset
124 struct Sx20 {
kono
parents:
diff changeset
125 struct S { int i; };
kono
parents:
diff changeset
126 int a_x []; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
127 };
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 struct Sx21 {
kono
parents:
diff changeset
130 int a_x []; // { dg-error "not at end" }
kono
parents:
diff changeset
131 struct S { } s;
kono
parents:
diff changeset
132 };
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 struct Sx22 {
kono
parents:
diff changeset
135 int a_x []; // { dg-error "not at end" }
kono
parents:
diff changeset
136 union { int i; };
kono
parents:
diff changeset
137 };
kono
parents:
diff changeset
138
kono
parents:
diff changeset
139 struct Sx23 {
kono
parents:
diff changeset
140 union { int i; };
kono
parents:
diff changeset
141 int a_x [];
kono
parents:
diff changeset
142 };
kono
parents:
diff changeset
143
kono
parents:
diff changeset
144 struct Sx24 {
kono
parents:
diff changeset
145 struct S;
kono
parents:
diff changeset
146 S a_x []; // { dg-error "incomplete type" }
kono
parents:
diff changeset
147 };
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 struct Sx25 {
kono
parents:
diff changeset
150 struct S { };
kono
parents:
diff changeset
151 S a_x []; // { dg-error "flexible array member" }
kono
parents:
diff changeset
152 };
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 struct Sx26 {
kono
parents:
diff changeset
155 struct { }
kono
parents:
diff changeset
156 a_x []; // { dg-error "flexible array member" }
kono
parents:
diff changeset
157 };
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 struct Sx27 {
kono
parents:
diff changeset
160 int i;
kono
parents:
diff changeset
161 struct { }
kono
parents:
diff changeset
162 a_x [];
kono
parents:
diff changeset
163 };
kono
parents:
diff changeset
164
kono
parents:
diff changeset
165 ASSERT_AT_END (Sx27, a_x);
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167 struct Sx28 {
kono
parents:
diff changeset
168 struct { }
kono
parents:
diff changeset
169 a_x []; // { dg-error "not at end" }
kono
parents:
diff changeset
170 int i;
kono
parents:
diff changeset
171 };
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 struct Sx29 {
kono
parents:
diff changeset
174 // Pointer to an array of unknown size.
kono
parents:
diff changeset
175 int (*a_x)[];
kono
parents:
diff changeset
176 };
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 struct Sx30 {
kono
parents:
diff changeset
179 // Reference to an array of unknown size.
kono
parents:
diff changeset
180 int (&a_x)[];
kono
parents:
diff changeset
181 };
kono
parents:
diff changeset
182
kono
parents:
diff changeset
183 struct Sx31 {
kono
parents:
diff changeset
184 int a []; // { dg-error "not at end" }
kono
parents:
diff changeset
185 unsigned i: 1;
kono
parents:
diff changeset
186 };
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 struct Sx32 {
kono
parents:
diff changeset
189 unsigned i: 1;
kono
parents:
diff changeset
190 int a [];
kono
parents:
diff changeset
191 };
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 ASSERT_AT_END (Sx32, a);
kono
parents:
diff changeset
194
kono
parents:
diff changeset
195 struct Sx33 {
kono
parents:
diff changeset
196 int a []; // { dg-error "otherwise empty" }
kono
parents:
diff changeset
197 friend int foo ();
kono
parents:
diff changeset
198 };
kono
parents:
diff changeset
199
kono
parents:
diff changeset
200 struct Sx34 {
kono
parents:
diff changeset
201 friend int foo ();
kono
parents:
diff changeset
202 int a []; // { dg-error "otherwise empty" }
kono
parents:
diff changeset
203 };
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 // Verify that intervening non-field declarations of members other
kono
parents:
diff changeset
206 // than non-static data members don't affect the diagnostics.
kono
parents:
diff changeset
207 struct Sx35 {
kono
parents:
diff changeset
208 int a[]; // { dg-error "not at end" }
kono
parents:
diff changeset
209 typedef int I;
kono
parents:
diff changeset
210 int n;
kono
parents:
diff changeset
211 };
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 struct Sx36 {
kono
parents:
diff changeset
214 int n;
kono
parents:
diff changeset
215 typedef int I;
kono
parents:
diff changeset
216 int a[];
kono
parents:
diff changeset
217 };
kono
parents:
diff changeset
218
kono
parents:
diff changeset
219 ASSERT_AT_END (Sx36, a);
kono
parents:
diff changeset
220
kono
parents:
diff changeset
221 struct Sx37 {
kono
parents:
diff changeset
222 int a[]; // { dg-error "not at end" }
kono
parents:
diff changeset
223 enum E { };
kono
parents:
diff changeset
224 int n;
kono
parents:
diff changeset
225 };
kono
parents:
diff changeset
226
kono
parents:
diff changeset
227 struct Sx38 {
kono
parents:
diff changeset
228 int n;
kono
parents:
diff changeset
229 enum E { };
kono
parents:
diff changeset
230 int a[];
kono
parents:
diff changeset
231 };
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 ASSERT_AT_END (Sx38, a);
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 struct Sx39 {
kono
parents:
diff changeset
236 int a[]; // { dg-error "not at end" }
kono
parents:
diff changeset
237 struct S;
kono
parents:
diff changeset
238 int n;
kono
parents:
diff changeset
239 };
kono
parents:
diff changeset
240
kono
parents:
diff changeset
241 struct Sx40 {
kono
parents:
diff changeset
242 int n;
kono
parents:
diff changeset
243 struct S;
kono
parents:
diff changeset
244 int a[];
kono
parents:
diff changeset
245 };
kono
parents:
diff changeset
246
kono
parents:
diff changeset
247 ASSERT_AT_END (Sx40, a);
kono
parents:
diff changeset
248
kono
parents:
diff changeset
249 struct Sx41 {
kono
parents:
diff changeset
250 int a[]; // { dg-error "not at end" }
kono
parents:
diff changeset
251 static int i;
kono
parents:
diff changeset
252 int n;
kono
parents:
diff changeset
253 };
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 struct Sx42 {
kono
parents:
diff changeset
256 int n;
kono
parents:
diff changeset
257 static int i;
kono
parents:
diff changeset
258 int a[];
kono
parents:
diff changeset
259 };
kono
parents:
diff changeset
260
kono
parents:
diff changeset
261 ASSERT_AT_END (Sx42, a);
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 struct Sx43 {
kono
parents:
diff changeset
264 int a[]; // { dg-error "not at end" }
kono
parents:
diff changeset
265 Sx43 ();
kono
parents:
diff changeset
266 int n;
kono
parents:
diff changeset
267 };
kono
parents:
diff changeset
268
kono
parents:
diff changeset
269 struct Sx44 {
kono
parents:
diff changeset
270 int n;
kono
parents:
diff changeset
271 Sx44 ();
kono
parents:
diff changeset
272 int a[];
kono
parents:
diff changeset
273 };
kono
parents:
diff changeset
274
kono
parents:
diff changeset
275 ASSERT_AT_END (Sx44, a);
kono
parents:
diff changeset
276
kono
parents:
diff changeset
277 struct S_S_S_x {
kono
parents:
diff changeset
278 struct A {
kono
parents:
diff changeset
279 struct B {
kono
parents:
diff changeset
280 int a[]; // { dg-error "flexible array member" }
kono
parents:
diff changeset
281 } b;
kono
parents:
diff changeset
282 } a;
kono
parents:
diff changeset
283 };
kono
parents:
diff changeset
284
kono
parents:
diff changeset
285 // Since members of an anonymous struct or union are considered to be
kono
parents:
diff changeset
286 // members of the enclosing union the below defintions are valid and
kono
parents:
diff changeset
287 // must be accepted.
kono
parents:
diff changeset
288
kono
parents:
diff changeset
289 struct Anon1 {
kono
parents:
diff changeset
290 int n;
kono
parents:
diff changeset
291 struct {
kono
parents:
diff changeset
292 int good[];
kono
parents:
diff changeset
293 };
kono
parents:
diff changeset
294 };
kono
parents:
diff changeset
295
kono
parents:
diff changeset
296 ASSERT_AT_END (Anon1, good);
kono
parents:
diff changeset
297
kono
parents:
diff changeset
298 struct NotAnon1 {
kono
parents:
diff changeset
299 int n;
kono
parents:
diff changeset
300 // The following is not an anonymous struct -- the type is unnamed
kono
parents:
diff changeset
301 // but the object has a name.
kono
parents:
diff changeset
302 struct {
kono
parents:
diff changeset
303 int bad[]; // { dg-error "otherwise empty" }
kono
parents:
diff changeset
304 } name;
kono
parents:
diff changeset
305 };
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 struct Anon2 {
kono
parents:
diff changeset
308 struct {
kono
parents:
diff changeset
309 int n;
kono
parents:
diff changeset
310 struct {
kono
parents:
diff changeset
311 int good[];
kono
parents:
diff changeset
312 };
kono
parents:
diff changeset
313 };
kono
parents:
diff changeset
314 };
kono
parents:
diff changeset
315
kono
parents:
diff changeset
316 ASSERT_AT_END (Anon2, good);
kono
parents:
diff changeset
317
kono
parents:
diff changeset
318 struct Anon3 {
kono
parents:
diff changeset
319 struct {
kono
parents:
diff changeset
320 struct {
kono
parents:
diff changeset
321 int n;
kono
parents:
diff changeset
322 int good[];
kono
parents:
diff changeset
323 };
kono
parents:
diff changeset
324 };
kono
parents:
diff changeset
325 };
kono
parents:
diff changeset
326
kono
parents:
diff changeset
327 ASSERT_AT_END (Anon3, good);
kono
parents:
diff changeset
328
kono
parents:
diff changeset
329 struct Anon4 {
kono
parents:
diff changeset
330 struct {
kono
parents:
diff changeset
331 int in_empty_struct[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
332 };
kono
parents:
diff changeset
333 };
kono
parents:
diff changeset
334
kono
parents:
diff changeset
335 struct Anon5 {
kono
parents:
diff changeset
336 struct {
kono
parents:
diff changeset
337 int not_at_end[]; // { dg-error "not at end" }
kono
parents:
diff changeset
338 };
kono
parents:
diff changeset
339 int n;
kono
parents:
diff changeset
340 };
kono
parents:
diff changeset
341
kono
parents:
diff changeset
342 struct Anon6 {
kono
parents:
diff changeset
343 struct {
kono
parents:
diff changeset
344 struct {
kono
parents:
diff changeset
345 int not_at_end[]; // { dg-error "not at end" }
kono
parents:
diff changeset
346 };
kono
parents:
diff changeset
347 int n;
kono
parents:
diff changeset
348 };
kono
parents:
diff changeset
349 };
kono
parents:
diff changeset
350
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 struct Anon7 {
kono
parents:
diff changeset
353 struct {
kono
parents:
diff changeset
354 struct {
kono
parents:
diff changeset
355 int not_at_end[]; // { dg-error "not at end" }
kono
parents:
diff changeset
356 };
kono
parents:
diff changeset
357 };
kono
parents:
diff changeset
358 int n;
kono
parents:
diff changeset
359 };
kono
parents:
diff changeset
360
kono
parents:
diff changeset
361 struct Six {
kono
parents:
diff changeset
362 int i;
kono
parents:
diff changeset
363 int a[];
kono
parents:
diff changeset
364 };
kono
parents:
diff changeset
365
kono
parents:
diff changeset
366 ASSERT_AT_END (Six, a);
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 class Cx {
kono
parents:
diff changeset
369 int a[]; // { dg-error "flexible array member" }
kono
parents:
diff changeset
370 };
kono
parents:
diff changeset
371
kono
parents:
diff changeset
372 class Cix {
kono
parents:
diff changeset
373 int i;
kono
parents:
diff changeset
374 int a[];
kono
parents:
diff changeset
375 };
kono
parents:
diff changeset
376
kono
parents:
diff changeset
377 struct Sxi {
kono
parents:
diff changeset
378 int a[]; // { dg-error "not at end" }
kono
parents:
diff changeset
379 int i;
kono
parents:
diff changeset
380 };
kono
parents:
diff changeset
381
kono
parents:
diff changeset
382 struct S0 {
kono
parents:
diff changeset
383 int a[0];
kono
parents:
diff changeset
384 };
kono
parents:
diff changeset
385
kono
parents:
diff changeset
386 struct S0i {
kono
parents:
diff changeset
387 int a[0];
kono
parents:
diff changeset
388 int i;
kono
parents:
diff changeset
389 };
kono
parents:
diff changeset
390
kono
parents:
diff changeset
391 struct S_a0_ax {
kono
parents:
diff changeset
392 int a0[0];
kono
parents:
diff changeset
393 int ax[]; // { dg-error "flexible array member" }
kono
parents:
diff changeset
394 };
kono
parents:
diff changeset
395
kono
parents:
diff changeset
396 struct S_a0_i_ax {
kono
parents:
diff changeset
397 int a0[0];
kono
parents:
diff changeset
398 int i;
kono
parents:
diff changeset
399 int ax[];
kono
parents:
diff changeset
400 };
kono
parents:
diff changeset
401
kono
parents:
diff changeset
402 ASSERT_AT_END (S_a0_i_ax, ax);
kono
parents:
diff changeset
403
kono
parents:
diff changeset
404 struct Si_a0_ax {
kono
parents:
diff changeset
405 int i;
kono
parents:
diff changeset
406 int a0[0];
kono
parents:
diff changeset
407 int ax[];
kono
parents:
diff changeset
408 };
kono
parents:
diff changeset
409
kono
parents:
diff changeset
410 ASSERT_AT_END (Si_a0_ax, ax);
kono
parents:
diff changeset
411
kono
parents:
diff changeset
412 struct Si_ax_a0 {
kono
parents:
diff changeset
413 int i;
kono
parents:
diff changeset
414 int ax[]; // { dg-error "not at end" }
kono
parents:
diff changeset
415 int a0[0];
kono
parents:
diff changeset
416 };
kono
parents:
diff changeset
417
kono
parents:
diff changeset
418 struct S_u0_ax {
kono
parents:
diff changeset
419 union { } u[0];
kono
parents:
diff changeset
420 int ax[]; // { dg-error "flexible array member" }
kono
parents:
diff changeset
421 };
kono
parents:
diff changeset
422
kono
parents:
diff changeset
423 struct S_a1_s2 {
kono
parents:
diff changeset
424 int a[1];
kono
parents:
diff changeset
425 int b[2];
kono
parents:
diff changeset
426 };