1 // RUN: %clang_cc1 -fsyntax-only -verify -triple x86_64-unknown-unknown %s
3 int complete_array_from_init
[] = { 1, 2, [10] = 5, 1, 2, [5] = 2, 6 };
5 int complete_array_from_init_check
[((sizeof(complete_array_from_init
) / sizeof(int)) == 13)? 1 : -1];
11 [ 8 ... 7 ] = 4, // expected-error{{array designator range [8, 7] is empty}}
13 [-1] = 6 // expected-error{{array designator value '-1' is negative}}
17 [10] = 1, // expected-error{{array designator index (10) exceeds array bounds (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)}}
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'}}
37 [1] = 1.0 // expected-error{{array designator cannot initialize non-array type}}
40 struct point array
[10] = {
43 [2].z
= 3.0, // expected-error{{field designator 'z' does not refer to any field in type 'struct point'}}
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 {{initializer overrides prior initialization of this subobject}}
52 struct point array3
[10] = {
53 .x
= 5 // expected-error{{field designator cannot initialize a non-struct, non-union type}}
57 struct point top_left
;
58 struct point bottom_right
;
61 struct rect window
= { .top_left
.x
= 1.0 };
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 } }
70 int windows_size
[((sizeof(windows
) / sizeof(struct rect
)) == 6)? 1 : -1];
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 }
78 struct rect windows
[10];
82 [5].windows
[3].top_left
.x
= { 7.0 } // expected-warning{{braces around scalar initializer}}
86 struct wonky
{ int * ptr
; } wonky
;
90 .window
= { .top_left
= { 1.0, 2.0 } },
91 { .x
= 5.0, .y
= 6.0 },
96 struct {int x
,*y
;} z
[] = {[0].x
= 2, &z
[0].x
};
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
106 int zz_sizecheck
[sizeof(zz
) / sizeof(struct outer
) == 8? 1 : -1 ];
108 struct disklabel_ops
{
113 struct disklabel_ops disklabel64_ops
= {
114 .labelsize
= sizeof(struct disklabel_ops
)
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 };
122 // Test warnings about initializers overriding previous initializers
128 int get8(void) { ++counter
; return 8; }
132 [0] = (struct X
){1, 2}, // expected-note 2 {{previous initialization is here}}
133 [0].c
= 3, // expected-warning{{initializer partially overrides prior initialization of this subobject}}
134 (struct X
) {4, 5, 6}, // expected-note{{previous initialization is here}}
135 [1].b
= get8(), // expected-warning{{initializer partially overrides prior initialization of this subobject}}
136 [0].b
= 8 // expected-warning{{initializer partially overrides prior initialization of this subobject}}
140 union { char c
; long l
; } u1
= { .l
= 0xFFFF };
142 extern float global_float
;
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
171 struct bar saloon
= {
176 typedef unsigned char u_char
;
177 typedef unsigned short u_short
;
184 const union wibble wobble
= { .arr2
[0] = 0xffff,
188 const union wibble wobble2
= { .arr2
= {4, 5, 6}, 7 }; // expected-warning{{excess elements in union initializer}}
217 struct Enigma enigma
= {
218 .double_ptr
= &d0
, &c0
,
219 &f0
, // expected-note{{previous}}
221 .float_ptr
= &f0
// expected-warning{{overrides}}
236 union_16644_t union_16644_instance_0
=
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}}
244 union_16644_t union_16644_instance_1
=
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}}
252 union_16644_t union_16644_instance_2
=
254 .a
.one
= 21, // expected-note{{previous}}
255 .b
[1] = 20, // expected-warning{{overrides}}
258 union_16644_t union_16644_instance_3
=
260 .b
[1] = 30, // expected-note{{previous}}
261 .a
= { // expected-warning{{overrides}}
266 union_16644_t union_16644_instance_4
[2] =
269 [1].a
.zero
= 3,// expected-note{{previous}}
271 [1].b
[1] = 4 // expected-warning{{overrides}}
275 /// Should use evaluate to fold aggressively and emit a warning if not an ice.
279 [ 0 ? crazy_x
: 4] = 1
286 unsigned long int num
;
287 struct expr
*args
[3];
291 struct expr expr0
= {
295 [0] = (struct expr
*)0,
296 [1] = (struct expr
*)0
315 // C1X lookup-based anonymous member init cases
318 .a
= 1 // expected-note{{previous initialization is here}}
320 .a
= 2, // expected-warning{{initializer overrides prior initialization of this subobject}}
323 struct ds ds1
= { .c
= 0 };
324 struct ds ds2
= { { {
326 .b
= 1 // expected-error{{field designator 'b' does not refer to any field}}
329 // Check initializer override warnings overriding a character in a string
330 struct overwrite_string_struct
{
333 } overwrite_string
[] = {
334 { { "foo" }, 1 }, // expected-note{{previous initialization is here}}
335 [0].L
[2] = 'x' // expected-warning{{initializer partially overrides prior initialization of this subobject}}
337 struct overwrite_string_struct2
{
340 } overwrite_string2
[] = {
341 { { "foo" }, 1 }, // expected-note{{previous initialization is here}}
342 [0].L
[4] = 'x' // expected-warning{{initializer partially overrides prior initialization of this subobject}}
344 struct overwrite_string_struct
345 overwrite_string3
[] = {
346 "foo", 1, // expected-note{{previous initialization is here}}
347 [0].L
[4] = 'x' // expected-warning{{initializer partially overrides prior initialization of this subobject}}
349 struct overwrite_string_struct
350 overwrite_string4
[] = {
351 { { 'f', 'o', 'o' }, 1 },
352 [0].L
[4] = 'x' // no-warning
363 .x
= 0, // expected-error{{field designator}}
367 .a
= 0, // expected-note {{previous initialization is here}}
368 .b
= 0, // expected-warning {{initializer overrides prior initialization of this subobject}}