xref: /netbsd/tests/usr.bin/xlint/lint1/init_braces.c (revision bfd6a42b)
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