init_braces.c revision 1.9
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
14void
15init_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
38void
39init_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 */
68unsigned long
69init_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.
104unsigned char
105init_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