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