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;
get8()128 int get8() { ++counter; return 8; }
129 
test()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