1 | // RUN: %clang_cc1 -fsyntax-only -verify -triple x86_64-unknown-unknown %s |
2 | |
3 | int complete_array_from_init[] = { 1, 2, [10] = 5, 1, 2, [5] = 2, 6 }; |
4 | |
5 | int complete_array_from_init_check[((sizeof(complete_array_from_init) / sizeof(int)) == 13)? 1 : -1]; |
6 | |
7 | int iarray[10] = { |
8 | [0] = 1, |
9 | [1 ... 5] = 2, |
10 | [ 6 ... 6 ] = 3, |
11 | [ 8 ... 7 ] = 4, // expected-error{{array designator range [8, 7] is empty}} |
12 | [10] = 5, |
13 | [-1] = 6 // expected-error{{array designator value '-1' is negative}} |
14 | }; |
15 | |
16 | int iarray2[10] = { |
17 | [10] = 1, // expected-error{{array designator index (10) exceeds array bounds (10)}} |
18 | }; |
19 | |
20 | int iarray3[10] = { |
21 | [3] 2, // expected-warning{{use of GNU 'missing =' extension in designator}} |
22 | [5 ... 12] = 2 // expected-error{{array designator index (12) exceeds array bounds (10)}} |
23 | }; |
24 | |
25 | struct point { |
26 | double x; |
27 | double y; |
28 | }; |
29 | |
30 | struct point p1 = { |
31 | .y = 1.0, |
32 | x: 2.0, // expected-warning{{}} |
33 | .a = 4.0, // expected-error{{field designator 'a' does not refer to any field in type 'struct point'}} |
34 | }; |
35 | |
36 | struct point p2 = { |
37 | [1] = 1.0 // expected-error{{array designator cannot initialize non-array type}} |
38 | }; |
39 | |
40 | struct point array[10] = { |
41 | [0].x = 1.0, |
42 | [1].y = 2.0, |
43 | [2].z = 3.0, // expected-error{{field designator 'z' does not refer to any field in type 'struct point'}} |
44 | }; |
45 | |
46 | struct point array2[10] = { |
47 | [10].x = 2.0, // expected-error{{array designator index (10) exceeds array bounds (10)}} |
48 | [4 ... 5].y = 2.0, // expected-note 2 {{previous initialization is here}} |
49 | [4 ... 6] = { .x = 3, .y = 4.0 } // expected-warning 2 {{subobject initialization overrides initialization of other fields within its enclosing subobject}} |
50 | }; |
51 | |
52 | struct point array3[10] = { |
53 | .x = 5 // expected-error{{field designator cannot initialize a non-struct, non-union type}} |
54 | }; |
55 | |
56 | struct rect { |
57 | struct point top_left; |
58 | struct point bottom_right; |
59 | }; |
60 | |
61 | struct rect window = { .top_left.x = 1.0 }; |
62 | |
63 | struct rect windows[] = { |
64 | [2].top_left = { 1.0, 2.0 }, |
65 | [4].bottom_right = { .y = 1.0 }, |
66 | { { .y = 7.0, .x = 8.0 }, { .x = 5.0 } }, |
67 | [3] = { .top_left = { 1.1, 2.2 }, .bottom_right = { .y = 1.1 } } |
68 | }; |
69 | |
70 | int windows_size[((sizeof(windows) / sizeof(struct rect)) == 6)? 1 : -1]; |
71 | |
72 | struct rect windows_bad[3] = { |
73 | [2].top_left = { { .x = 1.1 } }, // expected-error{{designator in initializer for scalar type}} |
74 | [1].top_left = { .x = 1.1 } |
75 | }; |
76 | |
77 | struct gui { |
78 | struct rect windows[10]; |
79 | }; |
80 | |
81 | struct gui gui[] = { |
82 | [5].windows[3].top_left.x = { 7.0 } // expected-warning{{braces around scalar initializer}} |
83 | }; |
84 | |
85 | struct translator { |
86 | struct wonky { int * ptr; } wonky ; |
87 | struct rect window; |
88 | struct point offset; |
89 | } tran = { |
90 | .window = { .top_left = { 1.0, 2.0 } }, |
91 | { .x = 5.0, .y = 6.0 }, |
92 | .wonky = { 0 } |
93 | }; |
94 | |
95 | int anint; |
96 | struct {int x,*y;} z[] = {[0].x = 2, &z[0].x}; |
97 | |
98 | struct outer { struct inner { int x, *y; } in, *inp; } zz[] = { |
99 | [0].in.x = 2, &zz[0].in.x, &zz[0].in, |
100 | 0, &anint, &zz[1].in, |
101 | [3].in = { .y = &anint, .x = 17 }, |
102 | [7].in.y = &anint, &zz[0].in, |
103 | [4].in.y = &anint, [5].in.x = 12 |
104 | }; |
105 | |
106 | int zz_sizecheck[sizeof(zz) / sizeof(struct outer) == 8? 1 : -1 ]; |
107 | |
108 | struct disklabel_ops { |
109 | struct {} type; |
110 | int labelsize; |
111 | }; |
112 | |
113 | struct disklabel_ops disklabel64_ops = { |
114 | .labelsize = sizeof(struct disklabel_ops) |
115 | }; |
116 | |
117 | // PR clang/3378 |
118 | int bitwidth[] = { [(long long int)1] = 5, [(short int)2] = 2 }; |
119 | int a[]= { [sizeof(int)] = 0 }; |
120 | int a2[]= { [0 ... sizeof(int)] = 0 }; |
121 | |
122 | // Test warnings about initializers overriding previous initializers |
123 | struct X { |
124 | int a, b, c; |
125 | }; |
126 | |
127 | int counter = 0; |
128 | int get8() { ++counter; return 8; } |
129 | |
130 | void test() { |
131 | struct X xs[] = { |
132 | [0] = (struct X){1, 2}, // expected-note 2 {{previous initialization is here}} |
133 | [0].c = 3, // expected-warning{{subobject initialization overrides initialization of other fields within its enclosing subobject}} |
134 | (struct X) {4, 5, 6}, // expected-note{{previous initialization is here}} |
135 | [1].b = get8(), // expected-warning{{subobject initialization overrides initialization of other fields within its enclosing subobject}} |
136 | [0].b = 8 // expected-warning{{subobject initialization overrides initialization of other fields within its enclosing subobject}} |
137 | }; |
138 | } |
139 | |
140 | union { char c; long l; } u1 = { .l = 0xFFFF }; |
141 | |
142 | extern float global_float; |
143 | |
144 | struct XX { int a, *b; }; |
145 | struct XY { int before; struct XX xx, *xp; float* after; } xy[] = { |
146 | 0, 0, &xy[0].xx.a, &xy[0].xx, &global_float, |
147 | [1].xx = 0, &xy[1].xx.a, &xy[1].xx, &global_float, |
148 | 0, // expected-note{{previous initialization is here}} |
149 | 0, // expected-note{{previous initialization is here}} |
150 | [2].before = 0, // expected-warning{{initializer overrides prior initialization of this subobject}} |
151 | 0, // expected-warning{{initializer overrides prior initialization of this subobject}} |
152 | &xy[2].xx.a, &xy[2].xx, &global_float |
153 | }; |
154 | |
155 | // PR3519 |
156 | struct foo { |
157 | int arr[10]; |
158 | }; |
159 | |
160 | struct foo Y[10] = { |
161 | [1] .arr [1] = 2, |
162 | [4] .arr [2] = 4 |
163 | }; |
164 | |
165 | struct bar { |
166 | struct foo f; |
167 | float *arr[10]; |
168 | }; |
169 | |
170 | extern float f; |
171 | struct bar saloon = { |
172 | .f.arr[3] = 1, |
173 | .arr = { &f } |
174 | }; |
175 | |
176 | typedef unsigned char u_char; |
177 | typedef unsigned short u_short; |
178 | |
179 | union wibble { |
180 | u_char arr1[6]; |
181 | u_short arr2[3]; |
182 | }; |
183 | |
184 | const union wibble wobble = { .arr2[0] = 0xffff, |
185 | .arr2[1] = 0xffff, |
186 | .arr2[2] = 0xffff }; |
187 | |
188 | const union wibble wobble2 = { .arr2 = {4, 5, 6}, 7 }; // expected-warning{{excess elements in union initializer}} |
189 | |
190 | // PR3778 |
191 | struct s { |
192 | union { int i; }; |
193 | }; |
194 | struct s si = { |
195 | { .i = 1 } |
196 | }; |
197 | |
198 | double d0; |
199 | char c0; |
200 | float f0; |
201 | int i0; |
202 | |
203 | struct Enigma { |
204 | union { |
205 | struct { |
206 | struct { |
207 | double *double_ptr; |
208 | char *string; |
209 | }; |
210 | float *float_ptr; |
211 | }; |
212 | int *int_ptr; |
213 | }; |
214 | char *string2; |
215 | }; |
216 | |
217 | struct Enigma enigma = { |
218 | .double_ptr = &d0, &c0, |
219 | &f0, // expected-note{{previous}} |
220 | &c0, |
221 | .float_ptr = &f0 // expected-warning{{overrides}} |
222 | }; |
223 | |
224 | |
225 | /// PR16644 |
226 | typedef union { |
227 | struct { |
228 | int zero; |
229 | int one; |
230 | int two; |
231 | int three; |
232 | } a; |
233 | int b[4]; |
234 | } union_16644_t; |
235 | |
236 | union_16644_t union_16644_instance_0 = |
237 | { |
238 | .b[0] = 0, // expected-note{{previous}} |
239 | .a.one = 1, // expected-warning{{overrides}} expected-note{{previous}} |
240 | .b[2] = 2, // expected-warning{{overrides}} expected-note{{previous}} |
241 | .a.three = 3, // expected-warning{{overrides}} |
242 | }; |
243 | |
244 | union_16644_t union_16644_instance_1 = |
245 | { |
246 | .a.three = 13, // expected-note{{previous}} |
247 | .b[2] = 12, // expected-warning{{overrides}} expected-note{{previous}} |
248 | .a.one = 11, // expected-warning{{overrides}} expected-note{{previous}} |
249 | .b[0] = 10, // expected-warning{{overrides}} |
250 | }; |
251 | |
252 | union_16644_t union_16644_instance_2 = |
253 | { |
254 | .a.one = 21, // expected-note{{previous}} |
255 | .b[1] = 20, // expected-warning{{overrides}} |
256 | }; |
257 | |
258 | union_16644_t union_16644_instance_3 = |
259 | { |
260 | .b[1] = 30, // expected-note{{previous}} |
261 | .a = { // expected-warning{{overrides}} |
262 | .one = 31 |
263 | } |
264 | }; |
265 | |
266 | union_16644_t union_16644_instance_4[2] = |
267 | { |
268 | [0].a.one = 2, |
269 | [1].a.zero = 3,// expected-note{{previous}} |
270 | [0].a.zero = 5, |
271 | [1].b[1] = 4 // expected-warning{{overrides}} |
272 | }; |
273 | |
274 | /// PR4073 |
275 | /// Should use evaluate to fold aggressively and emit a warning if not an ice. |
276 | extern int crazy_x; |
277 | |
278 | int crazy_Y[] = { |
279 | [ 0 ? crazy_x : 4] = 1 |
280 | }; |
281 | |
282 | // PR5843 |
283 | struct expr { |
284 | int nargs; |
285 | union { |
286 | unsigned long int num; |
287 | struct expr *args[3]; |
288 | } val; |
289 | }; |
290 | |
291 | struct expr expr0 = { |
292 | .nargs = 2, |
293 | .val = { |
294 | .args = { |
295 | [0] = (struct expr *)0, |
296 | [1] = (struct expr *)0 |
297 | } |
298 | } |
299 | }; |
300 | |
301 | // PR6955 |
302 | |
303 | struct ds { |
304 | struct { |
305 | struct { |
306 | unsigned int a; |
307 | }; |
308 | unsigned int b; |
309 | struct { |
310 | unsigned int c; |
311 | }; |
312 | }; |
313 | }; |
314 | |
315 | // C1X lookup-based anonymous member init cases |
316 | struct ds ds0 = { |
317 | { { |
318 | .a = 1 // expected-note{{previous initialization is here}} |
319 | } }, |
320 | .a = 2, // expected-warning{{initializer overrides prior initialization of this subobject}} |
321 | .b = 3 |
322 | }; |
323 | struct ds ds1 = { .c = 0 }; |
324 | struct ds ds2 = { { { |
325 | .a = 0, |
326 | .b = 1 // expected-error{{field designator 'b' does not refer to any field}} |
327 | } } }; |
328 | |
329 | // Check initializer override warnings overriding a character in a string |
330 | struct overwrite_string_struct { |
331 | char L[6]; |
332 | int M; |
333 | } overwrite_string[] = { |
334 | { { "foo" }, 1 }, // expected-note {{previous initialization is here}} |
335 | [0].L[2] = 'x' // expected-warning{{subobject initialization overrides initialization of other fields}} |
336 | }; |
337 | struct overwrite_string_struct2 { |
338 | char L[6]; |
339 | int M; |
340 | } overwrite_string2[] = { |
341 | { { "foo" }, 1 }, // expected-note{{previous initialization is here}} |
342 | [0].L[4] = 'x' // expected-warning{{subobject initialization overrides initialization of other fields}} |
343 | }; |
344 | struct overwrite_string_struct |
345 | overwrite_string3[] = { |
346 | "foo", 1, // expected-note{{previous initialization is here}} |
347 | [0].L[4] = 'x' // expected-warning{{subobject initialization overrides initialization of other fields}} |
348 | }; |
349 | struct overwrite_string_struct |
350 | overwrite_string4[] = { |
351 | { { 'f', 'o', 'o' }, 1 }, |
352 | [0].L[4] = 'x' // no-warning |
353 | }; |
354 | |
355 | struct { |
356 | struct { } s1; |
357 | union { |
358 | int a; |
359 | int b; |
360 | } u1; |
361 | } s = { |
362 | .s1 = { |
363 | .x = 0, // expected-error{{field designator}} |
364 | }, |
365 | |
366 | .u1 = { |
367 | .a = 0, |
368 | .b = 0, |
369 | }, |
370 | }; |
371 | |