annotate gcc/testsuite/g++.dg/ext/flexary19.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 // { dg-do compile }
kono
parents:
diff changeset
2 // { dg-additional-options "-Wpedantic -Wno-error=pedantic" }
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 // Verify that flexible array members are recognized as either valid
kono
parents:
diff changeset
5 // or invalid in anonymous structs (a G++ extension) and C++ anonymous
kono
parents:
diff changeset
6 // unions as well as in structs and unions that look anonymous but
kono
parents:
diff changeset
7 // aren't.
kono
parents:
diff changeset
8 struct S1
kono
parents:
diff changeset
9 {
kono
parents:
diff changeset
10 int i;
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 // The following declares a named data member of an unnamed struct
kono
parents:
diff changeset
13 // (i.e., it is not an anonymous struct).
kono
parents:
diff changeset
14 struct {
kono
parents:
diff changeset
15 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
16 } s;
kono
parents:
diff changeset
17 };
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19 struct S2
kono
parents:
diff changeset
20 {
kono
parents:
diff changeset
21 int i;
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23 struct {
kono
parents:
diff changeset
24 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
25 } s[1];
kono
parents:
diff changeset
26 };
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 struct S3
kono
parents:
diff changeset
29 {
kono
parents:
diff changeset
30 int i;
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 struct {
kono
parents:
diff changeset
33 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
34 } s[];
kono
parents:
diff changeset
35 };
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 struct S4
kono
parents:
diff changeset
38 {
kono
parents:
diff changeset
39 int i;
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 struct {
kono
parents:
diff changeset
42 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
43 } s[2];
kono
parents:
diff changeset
44 };
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 struct S5
kono
parents:
diff changeset
47 {
kono
parents:
diff changeset
48 int i;
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 struct {
kono
parents:
diff changeset
51 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
52 } s[1][2];
kono
parents:
diff changeset
53 };
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 struct S6
kono
parents:
diff changeset
56 {
kono
parents:
diff changeset
57 int i;
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 struct {
kono
parents:
diff changeset
60 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
61 } s[][2];
kono
parents:
diff changeset
62 };
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 struct S7
kono
parents:
diff changeset
65 {
kono
parents:
diff changeset
66 int i;
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 struct {
kono
parents:
diff changeset
69 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
70 } *s;
kono
parents:
diff changeset
71 };
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 struct S8
kono
parents:
diff changeset
74 {
kono
parents:
diff changeset
75 int i;
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 struct {
kono
parents:
diff changeset
78 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
79 } **s;
kono
parents:
diff changeset
80 };
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 struct S9
kono
parents:
diff changeset
83 {
kono
parents:
diff changeset
84 int i;
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 struct {
kono
parents:
diff changeset
87 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
88 } *s[1];
kono
parents:
diff changeset
89 };
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 struct S10
kono
parents:
diff changeset
92 {
kono
parents:
diff changeset
93 int i;
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 struct {
kono
parents:
diff changeset
96 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
97 } *s[];
kono
parents:
diff changeset
98 };
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 struct S11
kono
parents:
diff changeset
101 {
kono
parents:
diff changeset
102 int i;
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 struct {
kono
parents:
diff changeset
105 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
106 } **s[1];
kono
parents:
diff changeset
107 };
kono
parents:
diff changeset
108
kono
parents:
diff changeset
109 struct S12
kono
parents:
diff changeset
110 {
kono
parents:
diff changeset
111 int i;
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 struct {
kono
parents:
diff changeset
114 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
115 } **s[];
kono
parents:
diff changeset
116 };
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 struct S13
kono
parents:
diff changeset
119 {
kono
parents:
diff changeset
120 int i;
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 struct {
kono
parents:
diff changeset
123 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
124 } **s[2];
kono
parents:
diff changeset
125 };
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 struct S14
kono
parents:
diff changeset
128 {
kono
parents:
diff changeset
129 int i;
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 struct {
kono
parents:
diff changeset
132 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
133 } &s;
kono
parents:
diff changeset
134 };
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 struct S15
kono
parents:
diff changeset
137 {
kono
parents:
diff changeset
138 int i;
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 typedef struct {
kono
parents:
diff changeset
141 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
142 } T15;
kono
parents:
diff changeset
143 };
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 struct S16
kono
parents:
diff changeset
146 {
kono
parents:
diff changeset
147 int i;
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 struct { // { dg-warning "invalid use" }
kono
parents:
diff changeset
150 // A flexible array as a sole member of an anonymous struct is
kono
parents:
diff changeset
151 // rejected with an error in C mode but emits just a pedantic
kono
parents:
diff changeset
152 // warning in C++. Other than excessive pedantry there is no
kono
parents:
diff changeset
153 // reason to reject it.
kono
parents:
diff changeset
154 int a[];
kono
parents:
diff changeset
155 }; // { dg-warning "anonymous struct" }
kono
parents:
diff changeset
156 };
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 struct S17
kono
parents:
diff changeset
159 {
kono
parents:
diff changeset
160 int i;
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 union { // anonymous union
kono
parents:
diff changeset
163 int a[]; // { dg-error "flexible array member in union" }
kono
parents:
diff changeset
164 };
kono
parents:
diff changeset
165 };
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167 struct S18
kono
parents:
diff changeset
168 {
kono
parents:
diff changeset
169 int i;
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 struct {
kono
parents:
diff changeset
172 int j, a[]; // { dg-message "declared here" }
kono
parents:
diff changeset
173 } s; // { dg-warning "invalid use" }
kono
parents:
diff changeset
174 };
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 struct S19
kono
parents:
diff changeset
177 {
kono
parents:
diff changeset
178 int i;
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 struct { // { dg-warning "invalid use" }
kono
parents:
diff changeset
181 int j, a[]; // { dg-message "declared here" }
kono
parents:
diff changeset
182 }; // { dg-warning "anonymous struct" }
kono
parents:
diff changeset
183 };
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 struct S20
kono
parents:
diff changeset
186 {
kono
parents:
diff changeset
187 static int i;
kono
parents:
diff changeset
188 typedef int A[];
kono
parents:
diff changeset
189
kono
parents:
diff changeset
190 struct {
kono
parents:
diff changeset
191 int j;
kono
parents:
diff changeset
192 A a; // { dg-message "declared here" }
kono
parents:
diff changeset
193 } s; // { dg-warning "invalid use" }
kono
parents:
diff changeset
194 };
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 struct S21
kono
parents:
diff changeset
197 {
kono
parents:
diff changeset
198 static int i;
kono
parents:
diff changeset
199 typedef int A[];
kono
parents:
diff changeset
200
kono
parents:
diff changeset
201 struct { // { dg-warning "invalid use" }
kono
parents:
diff changeset
202 int j;
kono
parents:
diff changeset
203 A a; // { dg-message "declared here" }
kono
parents:
diff changeset
204 }; // { dg-warning "anonymous struct" }
kono
parents:
diff changeset
205 };
kono
parents:
diff changeset
206
kono
parents:
diff changeset
207 struct S22
kono
parents:
diff changeset
208 {
kono
parents:
diff changeset
209 struct S22S {
kono
parents:
diff changeset
210 static int i;
kono
parents:
diff changeset
211
kono
parents:
diff changeset
212 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
213 } s;
kono
parents:
diff changeset
214 };
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 struct S23
kono
parents:
diff changeset
217 {
kono
parents:
diff changeset
218 struct {
kono
parents:
diff changeset
219 static int i; // { dg-error "static data member" }
kono
parents:
diff changeset
220
kono
parents:
diff changeset
221 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
222 }; // { dg-warning "anonymous struct" }
kono
parents:
diff changeset
223 };
kono
parents:
diff changeset
224
kono
parents:
diff changeset
225 struct S24
kono
parents:
diff changeset
226 {
kono
parents:
diff changeset
227 static int i;
kono
parents:
diff changeset
228
kono
parents:
diff changeset
229 struct {
kono
parents:
diff changeset
230 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
231 } s;
kono
parents:
diff changeset
232 };
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 struct S25
kono
parents:
diff changeset
235 {
kono
parents:
diff changeset
236 int i;
kono
parents:
diff changeset
237
kono
parents:
diff changeset
238 struct {
kono
parents:
diff changeset
239 int j, a[]; // { dg-message "declared here" }
kono
parents:
diff changeset
240 } s; // { dg-warning "invalid use" }
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 // Verify that a static data member of the enclosing class doesn't
kono
parents:
diff changeset
243 // cause infinite recursion or some such badness.
kono
parents:
diff changeset
244 static S25 s2;
kono
parents:
diff changeset
245 };
kono
parents:
diff changeset
246
kono
parents:
diff changeset
247 struct S26
kono
parents:
diff changeset
248 {
kono
parents:
diff changeset
249 template <class>
kono
parents:
diff changeset
250 struct S26S {
kono
parents:
diff changeset
251 static int a;
kono
parents:
diff changeset
252 };
kono
parents:
diff changeset
253
kono
parents:
diff changeset
254 struct {
kono
parents:
diff changeset
255 int a[]; // { dg-error "in an otherwise empty" }
kono
parents:
diff changeset
256 } s;
kono
parents:
diff changeset
257 };
kono
parents:
diff changeset
258
kono
parents:
diff changeset
259 struct S27
kono
parents:
diff changeset
260 {
kono
parents:
diff changeset
261 S27 *p;
kono
parents:
diff changeset
262 int a[];
kono
parents:
diff changeset
263 };
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 struct S28
kono
parents:
diff changeset
266 {
kono
parents:
diff changeset
267 struct A {
kono
parents:
diff changeset
268 struct B {
kono
parents:
diff changeset
269 S28 *ps28;
kono
parents:
diff changeset
270 A *pa;
kono
parents:
diff changeset
271 B *pb;
kono
parents:
diff changeset
272 } b, *pb;
kono
parents:
diff changeset
273 A *pa;
kono
parents:
diff changeset
274 } a, *pa;
kono
parents:
diff changeset
275
kono
parents:
diff changeset
276 S28::A *pa2;
kono
parents:
diff changeset
277 S28::A::B *pb;
kono
parents:
diff changeset
278
kono
parents:
diff changeset
279 int flexarray[];
kono
parents:
diff changeset
280 };
kono
parents:
diff changeset
281
kono
parents:
diff changeset
282 // Verify that the notes printed along with the warnings point to the types
kono
parents:
diff changeset
283 // or members they should point to and mention the correct relationships
kono
parents:
diff changeset
284 // with the flexible array members.
kono
parents:
diff changeset
285 namespace Notes
kono
parents:
diff changeset
286 {
kono
parents:
diff changeset
287 union A
kono
parents:
diff changeset
288 {
kono
parents:
diff changeset
289 struct {
kono
parents:
diff changeset
290 struct {
kono
parents:
diff changeset
291 int i, a[]; // { dg-message "declared here" }
kono
parents:
diff changeset
292 } c; // { dg-warning "invalid use" }
kono
parents:
diff changeset
293 } d;
kono
parents:
diff changeset
294 int j;
kono
parents:
diff changeset
295 };
kono
parents:
diff changeset
296
kono
parents:
diff changeset
297 union B
kono
parents:
diff changeset
298 {
kono
parents:
diff changeset
299 struct {
kono
parents:
diff changeset
300 struct { // { dg-warning "invalid use" }
kono
parents:
diff changeset
301 int i, a[]; // { dg-message "declared here" }
kono
parents:
diff changeset
302 }; // { dg-warning "anonymous struct" }
kono
parents:
diff changeset
303 }; // { dg-warning "anonymous struct" }
kono
parents:
diff changeset
304 int j;
kono
parents:
diff changeset
305 };
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 }
kono
parents:
diff changeset
308
kono
parents:
diff changeset
309 typedef struct Opaque* P29;
kono
parents:
diff changeset
310 struct S30 { P29 p; };
kono
parents:
diff changeset
311 struct S31 { S30 s; };
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 typedef struct { } S32;
kono
parents:
diff changeset
314 typedef struct { S32 *ps32; } S33;
kono
parents:
diff changeset
315 typedef struct
kono
parents:
diff changeset
316 {
kono
parents:
diff changeset
317 S33 *ps33;
kono
parents:
diff changeset
318 } S34;
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320 struct S35
kono
parents:
diff changeset
321 {
kono
parents:
diff changeset
322 struct A {
kono
parents:
diff changeset
323 int i1, a1[];
kono
parents:
diff changeset
324 };
kono
parents:
diff changeset
325
kono
parents:
diff changeset
326 struct B {
kono
parents:
diff changeset
327 int i2, a2[];
kono
parents:
diff changeset
328 };
kono
parents:
diff changeset
329
kono
parents:
diff changeset
330 typedef struct {
kono
parents:
diff changeset
331 int i3, a3[];
kono
parents:
diff changeset
332 } C;
kono
parents:
diff changeset
333
kono
parents:
diff changeset
334 typedef struct {
kono
parents:
diff changeset
335 int i4, a4[];
kono
parents:
diff changeset
336 } D;
kono
parents:
diff changeset
337
kono
parents:
diff changeset
338 typedef A A2;
kono
parents:
diff changeset
339 typedef B B2;
kono
parents:
diff changeset
340 typedef C C2;
kono
parents:
diff changeset
341 typedef D D2;
kono
parents:
diff changeset
342 };
kono
parents:
diff changeset
343
kono
parents:
diff changeset
344 // { dg-prune-output "forbids flexible array member" }