1// RUN: %clang_cc1 -fsyntax-only -verify -triple x86_64-unknown-unknown %s
2
3int complete_array_from_init[] = { 1, 2, [10] = 5, 1, 2, [5] = 2, 6 };
4
5int complete_array_from_init_check[((sizeof(complete_array_from_init) / sizeof(int)) == 13)? 1 : -1];
6
7int 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
16int iarray2[10] = {
17  [10] = 1, // expected-error{{array designator index (10) exceeds array bounds (10)}}
18};
19
20int 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
25struct point {
26  double x;
27  double y;
28};
29
30struct 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
36struct point p2 = {
37  [1] = 1.0 // expected-error{{array designator cannot initialize non-array type}}
38};
39
40struct 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
46struct point array2[10] = {
47  [10].x = 2.0, // expected-error{{array designator index (10) exceeds array bounds (10)}}
48  [4 ... 5].y = 2.0,
49  [4 ... 6] = { .x = 3, .y = 4.0 }
50};
51
52struct point array3[10] = {
53  .x = 5 // expected-error{{field designator cannot initialize a non-struct, non-union type}}
54};
55
56struct rect {
57  struct point top_left;
58  struct point bottom_right;
59};
60
61struct rect window = { .top_left.x = 1.0 };
62
63struct 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
70int windows_size[((sizeof(windows) / sizeof(struct rect)) == 6)? 1 : -1];
71
72struct 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
77struct gui {
78  struct rect windows[10];
79};
80
81struct gui gui[] = {
82  [5].windows[3].top_left.x = { 7.0 } // expected-warning{{braces around scalar initializer}}
83};
84
85struct 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
95int anint;
96struct {int x,*y;} z[] = {[0].x = 2, &z[0].x};
97
98struct 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
106int zz_sizecheck[sizeof(zz) / sizeof(struct outer) == 8? 1 : -1 ];
107
108struct disklabel_ops {
109  struct {} type;
110  int labelsize;
111};
112
113struct disklabel_ops disklabel64_ops = {
114  .labelsize = sizeof(struct disklabel_ops)
115};
116
117// PR clang/3378
118int bitwidth[] = { [(long long int)1] = 5, [(short int)2] = 2 };
119int a[]= { [sizeof(int)] = 0 };
120int a2[]= { [0 ... sizeof(int)] = 0 };
121
122// Test warnings about initializers overriding previous initializers
123struct X {
124  int a, b, c;
125};
126
127int counter = 0;
128int get8() { ++counter; return 8; }
129
130void test() {
131  struct X xs[] = {
132    [0] = (struct X){1, 2}, // expected-note{{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
137  };
138}
139
140union { char c; long l; } u1 = { .l = 0xFFFF };
141
142extern float global_float;
143
144struct XX { int a, *b; };
145struct 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
156struct foo {
157  int arr[10];
158};
159
160struct foo Y[10] = {
161  [1] .arr [1] = 2,
162  [4] .arr [2] = 4
163};
164
165struct bar {
166  struct foo f;
167  float *arr[10];
168};
169
170extern float f;
171struct bar saloon = {
172  .f.arr[3] = 1,
173  .arr = { &f }
174};
175
176typedef unsigned char u_char;
177typedef unsigned short u_short;
178
179union wibble {
180        u_char  arr1[6];
181        u_short arr2[3];
182};
183
184const union wibble wobble = { .arr2[0] = 0xffff,
185                              .arr2[1] = 0xffff,
186                              .arr2[2] = 0xffff };
187
188const union wibble wobble2 = { .arr2 = {4, 5, 6}, 7 }; // expected-warning{{excess elements in union initializer}}
189
190// PR3778
191struct s {
192    union { int i; };
193};
194struct s si = {
195    { .i = 1 }
196};
197
198double d0;
199char c0;
200float f0;
201int i0;
202
203struct 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
217struct 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
226typedef 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
236union_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
244union_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
252union_16644_t union_16644_instance_2 =
253{
254  .a.one   = 21, //                               expected-note{{previous}}
255  .b[1]    = 20, // expected-warning{{overrides}}
256};
257
258union_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
266union_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.
276extern int crazy_x;
277
278int crazy_Y[] = {
279  [ 0 ? crazy_x : 4] = 1
280};
281
282// PR5843
283struct expr {
284  int nargs;
285  union {
286    unsigned long int num;
287    struct expr *args[3];
288  } val;
289};
290
291struct 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
303struct 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
316struct 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};
323struct ds ds1 = { .c = 0 };
324struct 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
330struct 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{{initializer overrides prior initialization of this subobject}}
336};
337struct overwrite_string_struct2 {
338  char L[6];
339  int M;
340} overwrite_string2[] = {
341    { { "foo" }, 1 },
342    [0].L[4] = 'x' // no-warning
343  };
344