init_braces.c revision 1.4
11.4Srillig/*	$NetBSD: init_braces.c,v 1.4 2023/06/30 09:21:52 rillig Exp $	*/
21.1Srillig# 3 "init_braces.c"
31.1Srillig
41.1Srillig/*
51.1Srillig * Test initialization with excess braces around expressions.
61.1Srillig *
71.1Srillig * See also:
81.1Srillig *	C99 6.7.8
91.1Srillig *	C11 6.7.9
101.1Srillig */
111.1Srillig
121.1Srilligvoid
131.1Srilliginit_int(void)
141.1Srillig{
151.3Srillig	/* gcc-expect+4: error: invalid initializer */
161.3Srillig	/* clang-expect+3: error: array initializer must be an initializer list */
171.1Srillig	/* expect+2: error: {}-enclosed initializer required [181] */
181.2Srillig	/* expect+1: error: empty array declaration for 'num0' [190] */
191.1Srillig	int num0[] = 0;
201.1Srillig	int num1[] = { 1 };
211.1Srillig	/* gcc-expect+2: warning: braces around scalar initializer */
221.1Srillig	/* clang-expect+1: warning: braces around scalar initializer */
231.1Srillig	int num2[] = {{ 1 }};
241.1Srillig	/* gcc-expect+3: warning: braces around scalar initializer */
251.1Srillig	/* gcc-expect+2: warning: braces around scalar initializer */
261.1Srillig	/* clang-expect+1: warning: too many braces around scalar initializer */
271.1Srillig	int num3[] = {{{ 1 }}};
281.1Srillig	/* gcc-expect+5: warning: braces around scalar initializer */
291.1Srillig	/* gcc-expect+4: warning: braces around scalar initializer */
301.1Srillig	/* gcc-expect+3: warning: braces around scalar initializer */
311.1Srillig	/* clang-expect+2: warning: too many braces around scalar initializer */
321.1Srillig	/* clang-expect+1: warning: too many braces around scalar initializer */
331.1Srillig	int num4[] = {{{{ 1 }}}};
341.1Srillig}
351.1Srillig
361.1Srilligvoid
371.1Srilliginit_string(void)
381.1Srillig{
391.1Srillig	char name0[] = "";
401.1Srillig	char name1[] = { "" };
411.1Srillig	/* gcc-expect+5: warning: braces around scalar initializer */
421.1Srillig	/* gcc-expect+4: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast */
431.1Srillig	/* clang-expect+3: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [1]' */
441.1Srillig	/* clang-expect+2: warning: braces around scalar initializer */
451.2Srillig	/* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */
461.1Srillig	char name2[] = {{ "" }};
471.1Srillig	/* gcc-expect+6: warning: braces around scalar initializer */
481.1Srillig	/* gcc-expect+5: warning: braces around scalar initializer */
491.1Srillig	/* gcc-expect+4: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast */
501.1Srillig	/* clang-expect+3: warning: too many braces around scalar initializer */
511.1Srillig	/* clang-expect+2: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [1]' */
521.2Srillig	/* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */
531.1Srillig	char name3[] = {{{ "" }}};
541.1Srillig	/* gcc-expect+8: warning: braces around scalar initializer */
551.1Srillig	/* gcc-expect+7: warning: braces around scalar initializer */
561.1Srillig	/* gcc-expect+6: warning: braces around scalar initializer */
571.1Srillig	/* gcc-expect+5: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast */
581.1Srillig	/* clang-expect+4: warning: too many braces around scalar initializer */
591.1Srillig	/* clang-expect+3: warning: too many braces around scalar initializer */
601.1Srillig	/* clang-expect+2: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [1]' */
611.2Srillig	/* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */
621.1Srillig	char name4[] = {{{{ "" }}}};
631.1Srillig}
641.3Srillig
651.4Srillig/* C11 6.7.2.1p13 */
661.3Srilligunsigned long
671.4Srilliginit_anonymous_struct_and_union(void)
681.3Srillig{
691.3Srillig	struct time {
701.3Srillig		unsigned long ns;
711.3Srillig	};
721.3Srillig
731.3Srillig	struct times {
741.3Srillig		struct time t0;
751.3Srillig		struct time t1;
761.3Srillig	};
771.3Srillig
781.3Srillig	struct outer {
791.3Srillig		union {
801.3Srillig			struct {
811.3Srillig				struct times times;
821.3Srillig			};
831.3Srillig		};
841.3Srillig	};
851.3Srillig
861.3Srillig	struct outer var = {	/* struct outer */
871.4Srillig		{		/* anonymous union */
881.4Srillig			{	/* anonymous struct */
891.3Srillig/* FIXME: GCC and Clang both compile this initializer. */
901.3Srillig/* expect+1: error: type 'struct time' does not have member 'times' [101] */
911.3Srillig				.times = {
921.3Srillig					.t0 = { .ns = 0, },
931.3Srillig					.t1 = { .ns = 0, },
941.3Srillig				},
951.3Srillig			},
961.3Srillig		},
971.3Srillig	};
981.3Srillig
991.3Srillig	return var.times.t0.ns;
1001.3Srillig}
101