init_braces.c revision 1.5
1/*	$NetBSD: init_braces.c,v 1.5 2023/06/30 21:06:18 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
12void
13init_int(void)
14{
15	/* gcc-expect+4: error: invalid initializer */
16	/* clang-expect+3: error: array initializer must be an initializer list */
17	/* expect+2: error: {}-enclosed initializer required [181] */
18	/* expect+1: error: empty array declaration for 'num0' [190] */
19	int num0[] = 0;
20	int num1[] = { 1 };
21	/* gcc-expect+2: warning: braces around scalar initializer */
22	/* clang-expect+1: warning: braces around scalar initializer */
23	int num2[] = {{ 1 }};
24	/* gcc-expect+3: warning: braces around scalar initializer */
25	/* gcc-expect+2: warning: braces around scalar initializer */
26	/* clang-expect+1: warning: too many braces around scalar initializer */
27	int num3[] = {{{ 1 }}};
28	/* gcc-expect+5: warning: braces around scalar initializer */
29	/* gcc-expect+4: warning: braces around scalar initializer */
30	/* gcc-expect+3: warning: braces around scalar initializer */
31	/* clang-expect+2: warning: too many braces around scalar initializer */
32	/* clang-expect+1: warning: too many braces around scalar initializer */
33	int num4[] = {{{{ 1 }}}};
34}
35
36void
37init_string(void)
38{
39	char name0[] = "";
40	char name1[] = { "" };
41	/* gcc-expect+5: warning: braces around scalar initializer */
42	/* gcc-expect+4: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast */
43	/* clang-expect+3: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [1]' */
44	/* clang-expect+2: warning: braces around scalar initializer */
45	/* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */
46	char name2[] = {{ "" }};
47	/* gcc-expect+6: warning: braces around scalar initializer */
48	/* gcc-expect+5: warning: braces around scalar initializer */
49	/* gcc-expect+4: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast */
50	/* clang-expect+3: warning: too many braces around scalar initializer */
51	/* clang-expect+2: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [1]' */
52	/* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */
53	char name3[] = {{{ "" }}};
54	/* gcc-expect+8: warning: braces around scalar initializer */
55	/* gcc-expect+7: warning: braces around scalar initializer */
56	/* gcc-expect+6: warning: braces around scalar initializer */
57	/* gcc-expect+5: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast */
58	/* clang-expect+4: warning: too many braces around scalar initializer */
59	/* clang-expect+3: warning: too many braces around scalar initializer */
60	/* clang-expect+2: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [1]' */
61	/* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */
62	char name4[] = {{{{ "" }}}};
63}
64
65/* C11 6.7.2.1p13 */
66unsigned long
67init_anonymous_struct_and_union(void)
68{
69	struct time {
70		unsigned long ns;
71	};
72
73	struct times {
74		struct time t0;
75		struct time t1;
76	};
77
78	struct outer {
79		union {
80			struct {
81				struct times times;
82			};
83		};
84	};
85
86	struct outer var = {	/* struct outer */
87		{		/* anonymous union */
88			{	/* anonymous struct */
89				.times = {
90					.t0 = { .ns = 0, },
91					.t1 = { .ns = 0, },
92				},
93			},
94		},
95	};
96
97	return var.times.t0.ns;
98}
99