1 /* $NetBSD: init_braces.c,v 1.9 2023/07/21 06:02:07 rillig Exp $ */
2 # 3 "init_braces.c"
3
4 /*
5 * Test initialization with excess braces around expressions.
6 *
7 * See also:
8 * C99 6.7.8
9 * C11 6.7.9
10 */
11
12 /* lint1-extra-flags: -X 351 */
13
14 void
init_int(void)15 init_int(void)
16 {
17 /* gcc-expect+4: error: invalid initializer */
18 /* clang-expect+3: error: array initializer must be an initializer list */
19 /* expect+2: error: {}-enclosed or constant initializer of type 'array[unknown_size] of int' required [181] */
20 /* expect+1: error: empty array declaration for 'num0' [190] */
21 int num0[] = 0;
22 int num1[] = { 1 };
23 /* gcc-expect+2: warning: braces around scalar initializer */
24 /* clang-expect+1: warning: braces around scalar initializer */
25 int num2[] = {{ 1 }};
26 /* gcc-expect+3: warning: braces around scalar initializer */
27 /* gcc-expect+2: warning: braces around scalar initializer */
28 /* clang-expect+1: warning: too many braces around scalar initializer */
29 int num3[] = {{{ 1 }}};
30 /* gcc-expect+5: warning: braces around scalar initializer */
31 /* gcc-expect+4: warning: braces around scalar initializer */
32 /* gcc-expect+3: warning: braces around scalar initializer */
33 /* clang-expect+2: warning: too many braces around scalar initializer */
34 /* clang-expect+1: warning: too many braces around scalar initializer */
35 int num4[] = {{{{ 1 }}}};
36 }
37
38 void
init_string(void)39 init_string(void)
40 {
41 char name0[] = "";
42 char name1[] = { "" };
43 /* gcc-expect+5: warning: braces around scalar initializer */
44 /* gcc-expect+4: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast */
45 /* clang-expect+3: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [1]' */
46 /* clang-expect+2: warning: braces around scalar initializer */
47 /* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */
48 char name2[] = {{ "" }};
49 /* gcc-expect+6: warning: braces around scalar initializer */
50 /* gcc-expect+5: warning: braces around scalar initializer */
51 /* gcc-expect+4: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast */
52 /* clang-expect+3: warning: too many braces around scalar initializer */
53 /* clang-expect+2: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [1]' */
54 /* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */
55 char name3[] = {{{ "" }}};
56 /* gcc-expect+8: warning: braces around scalar initializer */
57 /* gcc-expect+7: warning: braces around scalar initializer */
58 /* gcc-expect+6: warning: braces around scalar initializer */
59 /* gcc-expect+5: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast */
60 /* clang-expect+4: warning: too many braces around scalar initializer */
61 /* clang-expect+3: warning: too many braces around scalar initializer */
62 /* clang-expect+2: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [1]' */
63 /* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */
64 char name4[] = {{{{ "" }}}};
65 }
66
67 /* C11 6.7.2.1p13 */
68 unsigned long
init_anonymous_struct_and_union(void)69 init_anonymous_struct_and_union(void)
70 {
71 struct time {
72 unsigned long ns;
73 };
74
75 struct times {
76 struct time t0;
77 struct time t1;
78 };
79
80 struct outer {
81 union {
82 struct {
83 struct times times;
84 };
85 };
86 };
87
88 struct outer var = { /* struct outer */
89 { /* anonymous union */
90 { /* anonymous struct */
91 .times = {
92 .t0 = { .ns = 0, },
93 .t1 = { .ns = 0, },
94 },
95 },
96 },
97 };
98
99 return var.times.t0.ns;
100 }
101
102 // Initializers may designate members from unnamed struct/union members.
103 // Example code adapted from jemalloc 5.1.0, jemalloc.c, init_lock.
104 unsigned char
init_unnamed_union(void)105 init_unnamed_union(void)
106 {
107 struct init_unnamed_union {
108 union {
109 struct {
110 struct padded_union {
111 unsigned char pad1[3];
112 union {
113 unsigned char u1;
114 unsigned char u2;
115 };
116 unsigned char pad2[3];
117 } padded_union;
118 };
119 };
120 };
121
122 struct init_unnamed_union var = {
123 {
124 {
125 .padded_union = {
126 .pad1 = { 0, 0, 0 },
127 .u1 = 0,
128 .pad2 = { 0, 0, 0 },
129 },
130 }
131 },
132 };
133 return var.padded_union.u1;
134 }
135