init_c99.c revision 1.4 1 1.4 rillig /* $NetBSD: init_c99.c,v 1.4 2025/02/27 06:48:29 rillig Exp $ */
2 1.1 rillig # 3 "init_c99.c"
3 1.1 rillig
4 1.1 rillig // Tests for initialization in C99 or later, mainly for designators.
5 1.1 rillig //
6 1.1 rillig // See C99 6.7.8 "Initialization".
7 1.1 rillig
8 1.1 rillig /* lint1-flags: -Sw -X 351 */
9 1.1 rillig
10 1.1 rillig void use(const void *);
11 1.1 rillig
12 1.1 rillig typedef struct any {
13 1.1 rillig const void *value;
14 1.1 rillig } any;
15 1.1 rillig
16 1.1 rillig
17 1.1 rillig // C99 6.7.8p11 says "optionally enclosed in braces". Whether this wording
18 1.1 rillig // means "a single pair of braces" or "as many pairs of braces as you want"
19 1.1 rillig // is left for interpretation to the reader.
20 1.1 rillig int scalar_without_braces = 3;
21 1.1 rillig int scalar_with_optional_braces = { 3 };
22 1.1 rillig int scalar_with_too_many_braces = {{ 3 }};
23 1.1 rillig /* expect+1: error: too many initializers for 'int' [174] */
24 1.1 rillig int scalar_with_too_many_initializers = { 3, 5 };
25 1.1 rillig
26 1.1 rillig
27 1.1 rillig // See initialization_expr, 'handing over to INIT'.
28 1.1 rillig void
29 1.1 rillig struct_initialization_via_assignment(any arg)
30 1.1 rillig {
31 1.1 rillig any local = arg;
32 1.1 rillig use(&local);
33 1.1 rillig }
34 1.1 rillig
35 1.1 rillig
36 1.1 rillig // See initialization_expr, initialization_init_array_from_string.
37 1.1 rillig char static_duration[] = "static duration";
38 1.1 rillig signed char static_duration_signed[] = "static duration";
39 1.1 rillig unsigned char static_duration_unsigned[] = "static duration";
40 1.1 rillig int static_duration_wchar[] = L"static duration";
41 1.1 rillig
42 1.1 rillig // See init_expr.
43 1.1 rillig void
44 1.1 rillig initialization_by_braced_string(void)
45 1.1 rillig {
46 1.1 rillig any local = { "hello" };
47 1.1 rillig use(&local);
48 1.1 rillig }
49 1.1 rillig
50 1.1 rillig void
51 1.1 rillig initialization_by_redundantly_braced_string(void)
52 1.1 rillig {
53 1.1 rillig any local = {{{{ "hello" }}}};
54 1.1 rillig use(&local);
55 1.1 rillig }
56 1.1 rillig
57 1.1 rillig /*
58 1.1 rillig * Only scalar expressions and string literals may be enclosed by additional
59 1.1 rillig * braces. Since 'arg' is a struct, this is a compile-time error.
60 1.1 rillig */
61 1.1 rillig void
62 1.1 rillig initialization_with_too_many_braces(any arg)
63 1.1 rillig {
64 1.1 rillig /* expect+1: error: cannot initialize 'pointer to const void' from 'struct any' [185] */
65 1.1 rillig any local = { arg };
66 1.1 rillig use(&arg);
67 1.1 rillig }
68 1.1 rillig
69 1.1 rillig // Some of the following examples are mentioned in the introduction comment
70 1.1 rillig // in init.c.
71 1.1 rillig
72 1.1 rillig int number = 12345;
73 1.1 rillig
74 1.1 rillig int number_with_braces_and_comma = {
75 1.1 rillig 12345,
76 1.1 rillig };
77 1.1 rillig
78 1.1 rillig int array_with_fixed_size[3] = {
79 1.1 rillig 111,
80 1.1 rillig 222,
81 1.1 rillig 333,
82 1.1 rillig /* expect+1: error: too many array initializers, expected 3 [173] */
83 1.1 rillig 444,
84 1.1 rillig };
85 1.1 rillig
86 1.1 rillig // See update_type_of_array_of_unknown_size.
87 1.1 rillig int array_of_unknown_size[] = {
88 1.1 rillig 111,
89 1.1 rillig 222,
90 1.1 rillig 333,
91 1.1 rillig };
92 1.1 rillig
93 1.1 rillig int array_flat[2][2] = {
94 1.1 rillig 11,
95 1.1 rillig 12,
96 1.1 rillig 21,
97 1.1 rillig 22
98 1.1 rillig };
99 1.1 rillig
100 1.1 rillig int array_nested[2][2] = {
101 1.1 rillig {
102 1.1 rillig 11,
103 1.1 rillig 12
104 1.1 rillig },
105 1.1 rillig {
106 1.1 rillig 21,
107 1.1 rillig 22
108 1.1 rillig }
109 1.1 rillig };
110 1.1 rillig
111 1.1 rillig int array_with_designators[] = {
112 1.1 rillig ['1'] = 111,
113 1.1 rillig ['5'] = 555,
114 1.1 rillig ['9'] = 999
115 1.1 rillig };
116 1.1 rillig
117 1.1 rillig int array_with_some_designators[] = {
118 1.1 rillig ['1'] = 111,
119 1.1 rillig 222,
120 1.1 rillig ['9'] = 999
121 1.1 rillig };
122 1.1 rillig
123 1.1 rillig struct point {
124 1.1 rillig int x;
125 1.1 rillig int y;
126 1.1 rillig };
127 1.1 rillig
128 1.1 rillig struct point point = {
129 1.1 rillig 3,
130 1.1 rillig 4
131 1.1 rillig };
132 1.1 rillig
133 1.1 rillig struct point point_with_designators = {
134 1.1 rillig .y = 4,
135 1.1 rillig .x = 3,
136 1.1 rillig };
137 1.1 rillig
138 1.1 rillig struct point point_with_mixed_designators = {
139 1.1 rillig .x = 3,
140 1.1 rillig 4,
141 1.1 rillig /* expect+1: error: too many struct/union initializers [172] */
142 1.1 rillig 5,
143 1.1 rillig .x = 3,
144 1.1 rillig };
145 1.1 rillig
146 1.1 rillig /*
147 1.1 rillig * Before cgram.y 1.230 from 2021-06-20, the grammar allowed either of the
148 1.1 rillig * operators '.' or '->' to be used for the designators and had extra code
149 1.1 rillig * to ensure that only '.' was actually used.
150 1.1 rillig */
151 1.1 rillig struct point origin = {
152 1.1 rillig .x = 0,
153 1.1 rillig /* expect+1: error: syntax error '->' [249] */
154 1.1 rillig ->y = 0,
155 1.1 rillig };
156 1.1 rillig
157 1.1 rillig /* Ensure that the parser can recover from the parse error. */
158 1.1 rillig struct point pythagoras = { 3, 4 };
159 1.1 rillig
160 1.1 rillig int array_with_designator[] = {
161 1.1 rillig 111,
162 1.1 rillig /* expect+1: error: syntax error 'designator '.member' is only for struct/union' [249] */
163 1.1 rillig .member = 222,
164 1.1 rillig 333,
165 1.1 rillig };
166 1.1 rillig
167 1.1 rillig /*
168 1.1 rillig * C99 6.7.8p11 says that the initializer of a scalar can be "optionally
169 1.1 rillig * enclosed in braces". It does not explicitly set an upper limit on the
170 1.1 rillig * number of braces. It also doesn't restrict the term "initializer" to only
171 1.1 rillig * mean the "outermost initializer". 6.7.8p13 defines that a brace for a
172 1.1 rillig * structure or union always means to descend into the type. Both GCC 10 and
173 1.1 rillig * Clang 8 already warn about these extra braces, nevertheless there is
174 1.1 rillig * real-life code (the Postfix MTA) that exploits this corner case of the
175 1.1 rillig * standard.
176 1.1 rillig */
177 1.1 rillig struct point scalar_with_several_braces = {
178 1.1 rillig {{{3}}},
179 1.1 rillig {{{{4}}}},
180 1.1 rillig };
181 1.1 rillig
182 1.1 rillig struct rectangle {
183 1.1 rillig struct point top_left;
184 1.1 rillig struct point bottom_right;
185 1.1 rillig };
186 1.1 rillig
187 1.1 rillig /* C99 6.7.8p18 */
188 1.1 rillig struct rectangle screen = {
189 1.1 rillig .bottom_right = {
190 1.1 rillig 1920,
191 1.1 rillig 1080,
192 1.1 rillig }
193 1.1 rillig };
194 1.1 rillig
195 1.1 rillig /*
196 1.1 rillig * C99 6.7.8p22 says: At the _end_ of its initializer list, the array no
197 1.1 rillig * longer has incomplete type.
198 1.1 rillig */
199 1.1 rillig struct point points[] = {
200 1.1 rillig {
201 1.1 rillig /*
202 1.1 rillig * At this point, the size of the object 'points' is not known
203 1.1 rillig * yet since its type is still incomplete. Lint could warn
204 1.1 rillig * about this, but GCC and Clang already do.
205 1.1 rillig *
206 1.1 rillig * Before init.c 1.179 from 2021.03.30, the type information
207 1.1 rillig * of 'points' was set too early, resulting in a negative
208 1.1 rillig * array size below.
209 1.1 rillig */
210 1.1 rillig sizeof(int[-(int)sizeof(points)]),
211 1.1 rillig 4
212 1.1 rillig }
213 1.1 rillig };
214 1.1 rillig
215 1.1 rillig
216 1.1 rillig struct triangle {
217 1.1 rillig struct point points[3];
218 1.1 rillig };
219 1.1 rillig
220 1.1 rillig struct pentagon {
221 1.1 rillig struct point points[5];
222 1.1 rillig };
223 1.1 rillig
224 1.1 rillig struct geometry {
225 1.1 rillig struct pentagon pentagons[6];
226 1.1 rillig struct triangle triangles[10];
227 1.1 rillig struct point points[3][5][2];
228 1.1 rillig };
229 1.1 rillig
230 1.1 rillig /*
231 1.1 rillig * Initialization of a complex struct containing nested arrays and nested
232 1.1 rillig * structs.
233 1.1 rillig */
234 1.1 rillig struct geometry geometry = {
235 1.1 rillig .pentagons[0].points[4].x = 1,
236 1.1 rillig .points[0][0][0] = { 0, 0 },
237 1.1 rillig .points[2][4][1] = {301, 302 },
238 1.1 rillig /* expect+1: error: array subscript 3 cannot be > 2 [168] */
239 1.1 rillig .points[3][0][0] = {3001, 3002 },
240 1.1 rillig /* expect+1: error: array subscript 5 cannot be > 4 [168] */
241 1.1 rillig .points[0][5][0] = {501, 502 },
242 1.1 rillig /* expect+1: error: array subscript 2 cannot be > 1 [168] */
243 1.1 rillig .points[0][0][2] = {21, 22 },
244 1.1 rillig };
245 1.1 rillig
246 1.1 rillig struct ends_with_unnamed_bit_field {
247 1.1 rillig int member;
248 1.1 rillig int:0;
249 1.1 rillig } ends_with_unnamed_bit_field = {
250 1.1 rillig 12345,
251 1.1 rillig /* expect+1: error: too many struct/union initializers [172] */
252 1.1 rillig 23456,
253 1.1 rillig };
254 1.1 rillig
255 1.1 rillig char prefixed_message[] = {
256 1.1 rillig 'E', ':', ' ',
257 1.3 rillig /* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' for 'init' [183] */
258 1.1 rillig "message\n",
259 1.1 rillig };
260 1.1 rillig
261 1.1 rillig char message_with_suffix[] = {
262 1.1 rillig "message",
263 1.1 rillig /* The excess character is not detected by lint but by compilers. */
264 1.1 rillig '\n',
265 1.1 rillig };
266 1.1 rillig
267 1.1 rillig struct ten {
268 1.1 rillig int i0;
269 1.1 rillig int i1;
270 1.1 rillig int i2;
271 1.1 rillig int i3;
272 1.1 rillig int i4;
273 1.1 rillig int i5;
274 1.1 rillig int i6;
275 1.1 rillig int i7;
276 1.1 rillig int i8;
277 1.1 rillig int i9;
278 1.1 rillig };
279 1.1 rillig
280 1.1 rillig struct ten ten = {
281 1.1 rillig .i3 = 3,
282 1.1 rillig 4,
283 1.1 rillig 5,
284 1.1 rillig 6,
285 1.1 rillig };
286 1.1 rillig
287 1.1 rillig
288 1.1 rillig /*
289 1.1 rillig * ISO C99 6.7.8 provides a large list of examples for initialization,
290 1.1 rillig * covering all tricky edge cases.
291 1.1 rillig */
292 1.1 rillig
293 1.2 rillig /* expect+1: warning: lossy conversion of 3.5 to 'int' [381] */
294 1.1 rillig int c99_6_7_8_p24_example1_i = 3.5;
295 1.1 rillig double _Complex c99_6_7_8_p24_example1_c = 5 + 3 * 1.0fi;
296 1.1 rillig
297 1.1 rillig int c99_6_7_8_p25_example2[] = { 1, 3, 5 };
298 1.1 rillig
299 1.1 rillig int c99_6_7_8_p26_example3a[4][3] = {
300 1.1 rillig { 1, 3, 5 },
301 1.1 rillig { 2, 4, 6 },
302 1.1 rillig { 3, 5, 7 },
303 1.1 rillig };
304 1.1 rillig
305 1.1 rillig int c99_6_7_8_p26_example3b[4][3] = {
306 1.1 rillig 1, 3, 5, 2, 4, 6, 3, 5, 7
307 1.1 rillig };
308 1.1 rillig
309 1.1 rillig int c99_6_7_8_p27_example4[4][3] = {
310 1.1 rillig { 1 }, { 2 }, { 3 }, { 4 }
311 1.1 rillig };
312 1.1 rillig
313 1.1 rillig struct {
314 1.1 rillig int a[3], b;
315 1.1 rillig } c99_6_7_8_p28_example5[] = {
316 1.1 rillig { 1 },
317 1.1 rillig 2,
318 1.1 rillig };
319 1.1 rillig
320 1.1 rillig short c99_6_7_8_p29_example6a[4][3][2] = {
321 1.1 rillig { 1 },
322 1.1 rillig { 2, 3 },
323 1.1 rillig { 4, 5, 6 },
324 1.1 rillig };
325 1.1 rillig
326 1.1 rillig short c99_6_7_8_p29_example6b[4][3][2] = {
327 1.1 rillig 1, 0, 0, 0, 0, 0,
328 1.1 rillig 2, 3, 0, 0, 0, 0,
329 1.1 rillig 4, 5, 6, 0, 0, 0,
330 1.1 rillig };
331 1.1 rillig
332 1.1 rillig short c99_6_7_8_p29_example6c[4][3][2] = {
333 1.1 rillig {
334 1.1 rillig { 1 },
335 1.1 rillig },
336 1.1 rillig {
337 1.1 rillig { 2, 3 },
338 1.1 rillig },
339 1.1 rillig {
340 1.1 rillig { 4, 5 },
341 1.1 rillig { 6 },
342 1.1 rillig }
343 1.1 rillig };
344 1.1 rillig
345 1.1 rillig void
346 1.1 rillig c99_6_7_8_p31_example7(void)
347 1.1 rillig {
348 1.1 rillig typedef int A[];
349 1.1 rillig
350 1.1 rillig A a = { 1, 2 }, b = { 3, 4, 5 };
351 1.1 rillig
352 1.1 rillig /* expect+1: error: negative array dimension (-8) [20] */
353 1.1 rillig typedef int reveal_sizeof_a[-(int)(sizeof(a))];
354 1.1 rillig /* expect+1: error: negative array dimension (-12) [20] */
355 1.1 rillig typedef int reveal_sizeof_b[-(int)(sizeof(b))];
356 1.1 rillig }
357 1.1 rillig
358 1.1 rillig char c99_6_7_8_p32_example8_s1[] = "abc",
359 1.1 rillig c99_6_7_8_p32_example8_t1[3] = "abc";
360 1.1 rillig char c99_6_7_8_p32_example8_s2[] = { 'a', 'b', 'c', '\0' },
361 1.1 rillig c99_6_7_8_p32_example8_t2[3] = { 'a', 'b', 'c' };
362 1.1 rillig char *c99_6_7_8_p32_example8_p = "abc";
363 1.1 rillig
364 1.1 rillig enum { member_one, member_two };
365 1.1 rillig const char *c99_6_7_8_p33_example9[] = {
366 1.1 rillig [member_two] = "member two",
367 1.1 rillig [member_one] = "member one",
368 1.1 rillig };
369 1.1 rillig
370 1.1 rillig struct {
371 1.1 rillig int quot, rem;
372 1.1 rillig } c99_6_7_8_p34_example10 = { .quot = 2, .rem = -1 };
373 1.1 rillig
374 1.1 rillig struct { int a[3], b; } c99_6_7_8_p35_example11[] =
375 1.1 rillig { [0].a = {1}, [1].a[0] = 2 };
376 1.1 rillig
377 1.1 rillig int c99_6_7_8_p36_example12a[16] = {
378 1.1 rillig 1, 3, 5, 7, 9, [16-5] = 8, 6, 4, 2, 0
379 1.1 rillig };
380 1.1 rillig
381 1.1 rillig int c99_6_7_8_p36_example12b[8] = {
382 1.1 rillig 1, 3, 5, 7, 9, [8-5] = 8, 6, 4, 2, 0
383 1.1 rillig };
384 1.1 rillig
385 1.1 rillig union {
386 1.1 rillig int first_member;
387 1.1 rillig void *second_member;
388 1.1 rillig unsigned char any_member;
389 1.1 rillig } c99_6_7_8_p38_example13 = { .any_member = 42 };
390 1.1 rillig
391 1.1 rillig
392 1.1 rillig /*
393 1.1 rillig * During initialization of an object of type array of unknown size, the type
394 1.1 rillig * information on the symbol is updated in-place. Ensure that this happens on
395 1.1 rillig * a copy of the type.
396 1.1 rillig *
397 1.1 rillig * C99 6.7.8p31 example 7
398 1.1 rillig */
399 1.1 rillig void
400 1.1 rillig ensure_array_type_is_not_modified_during_initialization(void)
401 1.1 rillig {
402 1.1 rillig typedef int array_of_unknown_size[];
403 1.1 rillig
404 1.1 rillig array_of_unknown_size a1 = { 1, 2, 3};
405 1.1 rillig
406 1.1 rillig switch (4) {
407 1.1 rillig case sizeof(array_of_unknown_size):
408 1.1 rillig /* expect+1: error: duplicate case '0' in switch [199] */
409 1.1 rillig case 0:
410 1.1 rillig case 3:
411 1.1 rillig case 4:
412 1.1 rillig case 12:
413 1.1 rillig break;
414 1.1 rillig }
415 1.1 rillig
416 1.1 rillig /* expect+1: error: negative array dimension (-12) [20] */
417 1.1 rillig typedef int reveal_sizeof_a1[-(int)(sizeof(a1))];
418 1.1 rillig }
419 1.1 rillig
420 1.1 rillig struct point unknown_member_name_beginning = {
421 1.1 rillig /* expect+1: error: type 'struct point' does not have member 'r' [101] */
422 1.1 rillig .r = 5,
423 1.1 rillig .x = 4,
424 1.1 rillig .y = 3,
425 1.1 rillig };
426 1.1 rillig
427 1.1 rillig struct point unknown_member_name_middle = {
428 1.1 rillig .x = 4,
429 1.1 rillig /* expect+1: error: type 'struct point' does not have member 'r' [101] */
430 1.1 rillig .r = 5,
431 1.1 rillig .y = 3,
432 1.1 rillig };
433 1.1 rillig
434 1.1 rillig struct point unknown_member_name_end = {
435 1.1 rillig .x = 4,
436 1.1 rillig .y = 3,
437 1.1 rillig /* expect+1: error: type 'struct point' does not have member 'r' [101] */
438 1.1 rillig .r = 5,
439 1.1 rillig };
440 1.1 rillig
441 1.1 rillig union value {
442 1.1 rillig int int_value;
443 1.1 rillig void *pointer_value;
444 1.1 rillig };
445 1.1 rillig
446 1.1 rillig union value unknown_union_member_name_first = {
447 1.1 rillig /* expect+1: error: type 'union value' does not have member 'unknown_value' [101] */
448 1.1 rillig .unknown_value = 4,
449 1.1 rillig .int_value = 3,
450 1.1 rillig };
451 1.1 rillig
452 1.1 rillig union value unknown_union_member_name_second = {
453 1.1 rillig .int_value = 3,
454 1.1 rillig /* expect+1: error: type 'union value' does not have member 'unknown_value' [101] */
455 1.1 rillig .unknown_value = 4,
456 1.1 rillig };
457 1.1 rillig
458 1.1 rillig struct point subscript_designator_on_struct = {
459 1.1 rillig /* expect+1: error: syntax error 'designator '[...]' is only for arrays' [249] */
460 1.1 rillig [0] = 3,
461 1.1 rillig };
462 1.1 rillig
463 1.1 rillig struct point unknown_member_on_struct = {
464 1.1 rillig /* expect+1: error: type 'struct point' does not have member 'member' [101] */
465 1.1 rillig .member[0][0].member = 4,
466 1.1 rillig };
467 1.1 rillig
468 1.1 rillig struct point unknown_member_on_scalar = {
469 1.1 rillig /* expect+1: error: syntax error 'scalar type cannot use designator' [249] */
470 1.1 rillig .x.y.z = 5,
471 1.1 rillig };
472 1.1 rillig
473 1.1 rillig struct {
474 1.1 rillig int:16;
475 1.1 rillig /* expect+2: warning: 'struct <unnamed>' has no named members [65] */
476 1.1 rillig /* expect+1: error: cannot initialize struct/union with no named member [179] */
477 1.1 rillig } struct_with_only_unnamed_members = {
478 1.1 rillig 123,
479 1.1 rillig };
480 1.1 rillig
481 1.1 rillig union {
482 1.1 rillig int:16;
483 1.1 rillig /* expect+2: warning: 'union <unnamed>' has no named members [65] */
484 1.1 rillig /* expect+1: error: cannot initialize struct/union with no named member [179] */
485 1.1 rillig } union_with_only_unnamed_members = {
486 1.1 rillig 123,
487 1.1 rillig };
488 1.1 rillig
489 1.1 rillig int designator_for_scalar = {
490 1.1 rillig /* expect+1: error: syntax error 'scalar type cannot use designator' [249] */
491 1.1 rillig .value = 3,
492 1.1 rillig };
493 1.1 rillig
494 1.1 rillig struct point member_designator_for_scalar_in_struct = {
495 1.1 rillig /* expect+1: error: syntax error 'scalar type cannot use designator' [249] */
496 1.1 rillig { .x = 3 },
497 1.1 rillig };
498 1.1 rillig struct point subscript_designator_for_scalar_in_struct = {
499 1.1 rillig /* expect+1: error: syntax error 'designator '[...]' is only for arrays' [249] */
500 1.1 rillig { [1] = 4 },
501 1.1 rillig };
502 1.1 rillig
503 1.1 rillig
504 1.1 rillig /* Seen in pcidevs_data.h, variable 'pci_words'. */
505 1.1 rillig const char string_initialized_with_braced_literal[] = {
506 1.1 rillig "initializer",
507 1.1 rillig };
508 1.1 rillig
509 1.1 rillig // An array of unknown size containing strings.
510 1.1 rillig char weekday_names[][4] = {
511 1.1 rillig "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
512 1.1 rillig };
513 1.1 rillig
514 1.1 rillig /* nested struct/union initialization */
515 1.1 rillig struct outer {
516 1.1 rillig int i;
517 1.1 rillig char c;
518 1.1 rillig union inner {
519 1.1 rillig short us;
520 1.1 rillig char uc;
521 1.1 rillig } u;
522 1.1 rillig char *s;
523 1.1 rillig } struct_containing_union[] = {
524 1.1 rillig {
525 1.1 rillig .s = "foo",
526 1.1 rillig .c = 'b',
527 1.1 rillig .u = {
528 1.1 rillig .uc = 'c'
529 1.1 rillig }
530 1.1 rillig },
531 1.1 rillig {
532 1.1 rillig .i = 1,
533 1.1 rillig .c = 'a',
534 1.1 rillig .u = {
535 1.1 rillig .us = 2
536 1.1 rillig }
537 1.1 rillig },
538 1.1 rillig };
539 1.1 rillig
540 1.1 rillig /*
541 1.1 rillig * The expansion of the offsetof macro may dereference a null pointer.
542 1.1 rillig * Such expressions are allowed in initializers for objects with
543 1.1 rillig * static duration.
544 1.1 rillig */
545 1.1 rillig struct offset_and_data {
546 1.1 rillig unsigned long offset;
547 1.1 rillig unsigned long data;
548 1.1 rillig };
549 1.1 rillig
550 1.1 rillig struct offset_and_data offset_and_data = {
551 1.1 rillig (unsigned long)&(((struct offset_and_data *)0)->data),
552 1.1 rillig 0,
553 1.1 rillig };
554 1.1 rillig
555 1.1 rillig // The size of the array is determined by the maximum index, not by the last
556 1.1 rillig // one mentioned.
557 1.1 rillig int arr_11[] = { [10] = 10, [0] = 0 };
558 1.1 rillig /* expect+1: error: negative array dimension (-11) [20] */
559 1.1 rillig typedef int ctassert_11[-(int)(sizeof(arr_11) / sizeof(arr_11[0]))];
560 1.1 rillig
561 1.1 rillig // Without an explicit subscript designator, the subscript counts up.
562 1.1 rillig int arr_3[] = { [1] = 1, [0] = 0, 1, 2 };
563 1.1 rillig /* expect+1: error: negative array dimension (-3) [20] */
564 1.1 rillig typedef int ctassert_3[-(int)(sizeof(arr_3) / sizeof(arr_3[0]))];
565 1.1 rillig
566 1.1 rillig
567 1.1 rillig // C99 struct initialization using designators.
568 1.1 rillig struct {
569 1.1 rillig int i;
570 1.1 rillig char *s;
571 1.1 rillig } struct_array[] = {
572 1.1 rillig {
573 1.4 rillig .i = 2,
574 1.1 rillig },
575 1.1 rillig {
576 1.4 rillig .s = "foo"
577 1.1 rillig },
578 1.1 rillig {
579 1.4 rillig .i = 1,
580 1.1 rillig .s = "bar"
581 1.1 rillig },
582 1.1 rillig {
583 1.4 rillig .s = "foo",
584 1.1 rillig .i = -1
585 1.1 rillig },
586 1.1 rillig };
587 1.1 rillig
588 1.1 rillig // Ensure that deeply nested structs can be designated in an initializer.
589 1.1 rillig int
590 1.1 rillig init_deeply_nested_struct(void)
591 1.1 rillig {
592 1.1 rillig struct rgb {
593 1.1 rillig unsigned red;
594 1.1 rillig unsigned green;
595 1.1 rillig unsigned blue;
596 1.1 rillig };
597 1.1 rillig
598 1.1 rillig struct hobbies {
599 1.1 rillig unsigned dancing: 1;
600 1.1 rillig unsigned running: 1;
601 1.1 rillig unsigned swimming: 1;
602 1.1 rillig };
603 1.1 rillig
604 1.1 rillig struct person {
605 1.1 rillig struct hobbies hobbies;
606 1.1 rillig struct rgb favorite_color;
607 1.1 rillig };
608 1.1 rillig
609 1.1 rillig struct city {
610 1.1 rillig struct person mayor;
611 1.1 rillig };
612 1.1 rillig
613 1.1 rillig struct state {
614 1.1 rillig struct city capital;
615 1.1 rillig };
616 1.1 rillig
617 1.1 rillig struct state st = {
618 1.1 rillig .capital.mayor.hobbies.dancing = 1,
619 1.1 rillig .capital.mayor.favorite_color.green = 0xFF,
620 1.1 rillig .capital.mayor.favorite_color.red = 0xFF,
621 1.1 rillig };
622 1.1 rillig return st.capital.mayor.favorite_color.red;
623 1.1 rillig }
624 1.1 rillig
625 1.1 rillig struct {
626 1.1 rillig int i[10];
627 1.1 rillig char *s;
628 1.1 rillig } struct_array_with_inner_array[] = {
629 1.1 rillig {
630 1.1 rillig { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
631 1.1 rillig "foo"
632 1.1 rillig },
633 1.1 rillig };
634 1.1 rillig
635 1.1 rillig struct {
636 1.1 rillig int type;
637 1.1 rillig union {
638 1.1 rillig char b[20];
639 1.1 rillig short s[10];
640 1.1 rillig long l[5];
641 1.1 rillig } data;
642 1.1 rillig } array_in_union_in_struct = {
643 1.1 rillig .type = 3,
644 1.1 rillig .data.l[0] = 4
645 1.1 rillig };
646 1.1 rillig
647 1.1 rillig // Somewhere between 2005.12.24.20.47.56 and 2006.12.19.19.06.44, lint could
648 1.1 rillig // not initialize named members, see PR bin/20264.
649 1.1 rillig union {
650 1.1 rillig char *p;
651 1.1 rillig int a[1];
652 1.1 rillig } array_in_union = {
653 1.1 rillig .a = { 7 }
654 1.1 rillig };
655 1.1 rillig
656 1.1 rillig /*
657 1.1 rillig * Initialization of a nested struct, in which some parts are initialized
658 1.1 rillig * from non-constant expressions of the inner struct type.
659 1.1 rillig *
660 1.1 rillig * In C99, 6.7.8p13 describes exactly this case.
661 1.1 rillig */
662 1.1 rillig void
663 1.1 rillig init_nested_struct(void)
664 1.1 rillig {
665 1.1 rillig
666 1.1 rillig typedef enum O1 {
667 1.1 rillig O1C = 101
668 1.1 rillig } O1;
669 1.1 rillig typedef enum O2 {
670 1.1 rillig O2C = 102
671 1.1 rillig } O2;
672 1.1 rillig typedef enum O3 {
673 1.1 rillig O3C = 103
674 1.1 rillig } O3;
675 1.1 rillig typedef enum I1 {
676 1.1 rillig I1C = 201
677 1.1 rillig } I1;
678 1.1 rillig typedef enum I2 {
679 1.1 rillig I2C = 202
680 1.1 rillig } I2;
681 1.1 rillig
682 1.1 rillig struct Inner1 {
683 1.1 rillig I1 i1;
684 1.1 rillig };
685 1.1 rillig
686 1.1 rillig struct Outer3Inner1 {
687 1.1 rillig O1 o1;
688 1.1 rillig struct Inner1 inner;
689 1.1 rillig O3 o3;
690 1.1 rillig };
691 1.1 rillig
692 1.1 rillig struct Inner1 inner1 = {
693 1.1 rillig I1C
694 1.1 rillig };
695 1.1 rillig struct Outer3Inner1 o3i1 = {
696 1.1 rillig O1C,
697 1.1 rillig inner1,
698 1.1 rillig O3C
699 1.1 rillig };
700 1.1 rillig
701 1.1 rillig O1 o1 = o3i1.o1;
702 1.1 rillig
703 1.1 rillig struct Inner2 {
704 1.1 rillig I1 i1;
705 1.1 rillig I2 i2;
706 1.1 rillig };
707 1.1 rillig
708 1.1 rillig struct Outer3Inner2 {
709 1.1 rillig O1 o1;
710 1.1 rillig struct Inner2 inner;
711 1.1 rillig O3 o3;
712 1.1 rillig };
713 1.1 rillig
714 1.1 rillig struct Inner2 inner2 = {
715 1.1 rillig I1C,
716 1.1 rillig I2C
717 1.1 rillig };
718 1.1 rillig struct Outer3Inner2 o3i2 = {
719 1.1 rillig O1C,
720 1.1 rillig inner2,
721 1.1 rillig O3C
722 1.1 rillig };
723 1.1 rillig o1 = o3i2.o1;
724 1.1 rillig
725 1.1 rillig /*
726 1.1 rillig * For static storage duration, each initializer expression must be a
727 1.1 rillig * constant expression.
728 1.1 rillig */
729 1.1 rillig static struct Inner2 inner3_static = {
730 1.1 rillig I1C,
731 1.1 rillig I2C
732 1.1 rillig };
733 1.1 rillig static struct Outer3Inner2 o3i2_static = {
734 1.1 rillig O1C,
735 1.1 rillig /* expect+1: error: non-constant initializer [177] */
736 1.1 rillig inner3_static,
737 1.1 rillig O3C
738 1.1 rillig };
739 1.1 rillig }
740