blob: 3333122202a38795285dc05bab07e603086d8409 [file] [log] [blame]
Daniel Dunbard7d5f022009-03-24 02:24:46 +00001// RUN: clang-cc -fsyntax-only -verify -arch x86_64 %s
Douglas Gregor05c13a32009-01-22 00:58:24 +00002
Douglas Gregor87f55cf2009-01-22 23:26:18 +00003int 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
Douglas Gregor05c13a32009-01-22 00:58:24 +00007int 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)}}
Douglas Gregor87f55cf2009-01-22 23:26:18 +000018};
19
20int iarray3[10] = {
Douglas Gregoreeae8f02009-03-28 00:41:23 +000021 [3] 2, // expected-warning{{use of GNU 'missing =' extension in designator}}
Douglas Gregora9c87802009-01-29 19:42:23 +000022 [5 ... 12] = 2 // expected-error{{array designator index (12) exceeds array bounds (10)}}
Douglas Gregor05c13a32009-01-22 00:58:24 +000023};
24
25struct point {
26 double x;
27 double y;
28};
29
30struct point p1 = {
31 .y = 1.0,
Douglas Gregoreeae8f02009-03-28 00:41:23 +000032 x: 2.0, // expected-warning{{}}
Douglas Gregor05c13a32009-01-22 00:58:24 +000033 .a = 4.0, // expected-error{{field designator 'a' does not refer to any field in type 'struct point'}}
Douglas Gregor87f55cf2009-01-22 23:26:18 +000034};
Douglas Gregor05c13a32009-01-22 00:58:24 +000035
Douglas Gregor87f55cf2009-01-22 23:26:18 +000036struct point p2 = {
Douglas Gregor05c13a32009-01-22 00:58:24 +000037 [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'}}
Douglas Gregor87f55cf2009-01-22 23:26:18 +000044};
45
46struct point array2[10] = {
Douglas Gregor05c13a32009-01-22 00:58:24 +000047 [10].x = 2.0, // expected-error{{array designator index (10) exceeds array bounds (10)}}
Douglas Gregora9c87802009-01-29 19:42:23 +000048 [4 ... 5].y = 2.0,
49 [4 ... 6] = { .x = 3, .y = 4.0 }
Douglas Gregor87f55cf2009-01-22 23:26:18 +000050};
51
52struct point array3[10] = {
Douglas Gregor05c13a32009-01-22 00:58:24 +000053 .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
Douglas Gregor87f55cf2009-01-22 23:26:18 +000095int 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};
Douglas Gregorf6c717c2009-01-23 16:54:12 +0000116
Douglas Gregor53d3d8e2009-01-23 21:04:18 +0000117// PR clang/3378
Douglas Gregorf6c717c2009-01-23 16:54:12 +0000118int bitwidth[] = { [(long long int)1] = 5, [(short int)2] = 2 };
Douglas Gregore3fa2de2009-01-23 18:58:42 +0000119int a[]= { [sizeof(int)] = 0 };
Douglas Gregora9c87802009-01-29 19:42:23 +0000120int a2[]= { [0 ... sizeof(int)] = 0 };
Douglas Gregor4c678342009-01-28 21:54:33 +0000121
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
Douglas Gregor6fbdc6b2009-01-29 00:39:20 +0000140// FIXME: How do we test that this initializes the long properly?
Douglas Gregor34e79462009-01-28 23:36:17 +0000141union { char c; long l; } u1 = { .l = 0xFFFF };
Douglas Gregor6fbdc6b2009-01-29 00:39:20 +0000142
143extern float global_float;
144
145struct XX { int a, *b; };
146struct XY { int before; struct XX xx, *xp; float* after; } xy[] = {
147 0, 0, &xy[0].xx.a, &xy[0].xx, &global_float,
Douglas Gregor58e22b12009-01-29 01:10:11 +0000148 [1].xx = 0, &xy[1].xx.a, &xy[1].xx, &global_float,
149 0, // expected-note{{previous initialization is here}}
150 0, // expected-note{{previous initialization is here}}
151 [2].before = 0, // expected-warning{{initializer overrides prior initialization of this subobject}}
152 0, // expected-warning{{initializer overrides prior initialization of this subobject}}
153 &xy[2].xx.a, &xy[2].xx, &global_float
Douglas Gregor6fbdc6b2009-01-29 00:39:20 +0000154};
Douglas Gregorfdf55692009-02-09 19:45:19 +0000155
156// PR3519
157struct foo {
158 int arr[10];
159};
160
161struct foo Y[10] = {
162 [1] .arr [1] = 2,
163 [4] .arr [2] = 4
164};
165
166struct bar {
167 struct foo f;
168 float *arr[10];
169};
170
171extern float f;
172struct bar saloon = {
173 .f.arr[3] = 1,
174 .arr = { &f }
175};
Douglas Gregordfb5e592009-02-12 19:00:39 +0000176
177typedef unsigned char u_char;
178typedef unsigned short u_short;
179
180union wibble {
181 u_char arr1[6];
182 u_short arr2[3];
183};
184
185const union wibble wobble = { .arr2[0] = 0xffff,
186 .arr2[1] = 0xffff,
187 .arr2[2] = 0xffff };
188
Douglas Gregor7c53ca62009-02-18 22:23:55 +0000189const union wibble wobble2 = { .arr2 = {4, 5, 6}, 7 }; // expected-warning{{excess elements in union initializer}}
Douglas Gregorffb4b6e2009-04-15 06:41:24 +0000190
191// PR3778
192struct s {
193 union { int i; };
194};
195struct s si = {
196 { .i = 1 }
197};
198
199double d0;
200char c0;
201float f0;
202int i0;
203
204struct Enigma {
205 union {
206 struct {
207 struct {
208 double *double_ptr;
209 char *string;
210 };
211 float *float_ptr;
212 };
213 int *int_ptr;
214 };
215 char *string2;
216};
217
218struct Enigma enigma = {
219 .double_ptr = &d0, &c0,
220 &f0, // expected-note{{previous}}
221 &c0,
222 .float_ptr = &f0 // expected-warning{{overrides}}
223};
Chris Lattner3bf68932009-04-25 21:59:05 +0000224
225
226/// PR4073
227/// Should use evaluate to fold aggressively and emit a warning if not an ice.
228extern int crazy_x;
229
230int crazy_Y[] = {
231 [ 0 ? crazy_x : 4] = 1
232};
233
234