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