lsym_rbrace.c revision 1.7
11.7Srillig/* $NetBSD: lsym_rbrace.c,v 1.7 2023/06/08 06:47:14 rillig Exp $ */
21.1Srillig
31.1Srillig/*
41.3Srillig * Tests for the token lsym_rbrace, which represents a '}' in these contexts:
51.3Srillig *
61.3Srillig * In an initializer, '}' ends an inner group of initializers, usually to
71.3Srillig * initialize a nested struct, union or array.
81.3Srillig *
91.3Srillig * In a function body, '}' ends a block.
101.3Srillig *
111.3Srillig * In an expression like '(type){...}', '}' ends a compound literal, which is
121.3Srillig * typically used in an assignment to a struct or array.
131.3Srillig *
141.3Srillig * In macro arguments, a '}' is an ordinary character, it does not need to be
151.3Srillig * balanced.  This is in contrast to '(' and ')', which must be balanced.
161.3Srillig *
171.3Srillig * TODO: try to split this token into lsym_rbrace_block and lsym_rbrace_init.
181.1Srillig *
191.1Srillig * See also:
201.1Srillig *	lsym_lbrace.c
211.1Srillig */
221.1Srillig
231.3Srillig/* Brace level in an initializer */
241.4Srillig//indent input
251.3Srilligvoid
261.3Srilligfunction(void)
271.3Srillig{
281.3Srillig	struct person	p = {
291.3Srillig		.name = "Name",
301.3Srillig		.age = {{{35}}},	/* C11 6.7.9 allows this. */
311.3Srillig	};
321.3Srillig}
331.4Srillig//indent end
341.1Srillig
351.4Srillig//indent run-equals-input
361.3Srillig
371.3Srillig
381.3Srillig/* Begin of a block of statements */
391.4Srillig//indent input
401.3Srilligvoid function(void) {{{ body(); }}}
411.4Srillig//indent end
421.3Srillig
431.4Srillig//indent run
441.3Srilligvoid
451.3Srilligfunction(void)
461.5Srillig{
471.5Srillig	{
481.5Srillig		{
491.3Srillig			body();
501.5Srillig		}
511.5Srillig	}
521.3Srillig}
531.4Srillig//indent end
541.3Srillig
551.3Srillig
561.3Srillig/* Compound literal */
571.4Srillig//indent input
581.3Srilligstruct point
591.3Srilligorigin(void)
601.3Srillig{
611.3Srillig	return (struct point){
621.3Srillig		.x = 0,
631.3Srillig		.y = 0,
641.3Srillig	};
651.3Srillig}
661.4Srillig//indent end
671.3Srillig
681.6Srillig//indent run-equals-input
691.7Srillig
701.7Srillig
711.7Srillig//indent input
721.7Srillig{
731.7Srilligint numbers[][] = {
741.7Srillig{11},
751.7Srillig{21},
761.7Srillig{31},
771.7Srillig};
781.7Srilligint numbers[][] = {{11},
791.7Srillig{21},
801.7Srillig{31},
811.7Srillig};
821.7Srillig}
831.7Srillig//indent end
841.7Srillig
851.7Srillig//indent run -di0
861.7Srillig{
871.7Srillig	int numbers[][] = {
881.7Srillig		{11},
891.7Srillig		{21},
901.7Srillig		{31},
911.7Srillig	};
921.7Srillig	int numbers[][] = {{11},
931.7Srillig	// $ FIXME: Must be indented.
941.7Srillig	{21},
951.7Srillig	{31},
961.7Srillig	};
971.7Srillig}
981.7Srillig//indent end
99