lsym_rbrace.c revision 1.4
11.4Srillig/* $NetBSD: lsym_rbrace.c,v 1.4 2022/04/24 09:04:12 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.3Srillig/* $ FIXME: Each '{' must be properly indented. */
471.3Srillig{{{
481.3Srillig			body();
491.3Srillig}
501.3Srillig}
511.3Srillig}
521.4Srillig//indent end
531.3Srillig
541.3Srillig
551.3Srillig/* Compound literal */
561.4Srillig//indent input
571.3Srilligstruct point
581.3Srilligorigin(void)
591.3Srillig{
601.3Srillig	return (struct point){
611.3Srillig		.x = 0,
621.3Srillig		.y = 0,
631.3Srillig	};
641.3Srillig}
651.4Srillig//indent end
661.3Srillig
671.4Srillig//indent run
681.3Srilligstruct point
691.3Srilligorigin(void)
701.3Srillig{
711.3Srillig	return (struct point){
721.3Srillig		.x = 0,
731.3Srillig/* $ FIXME: All initializers must be indented to the same level. */
741.3Srillig			.y = 0,
751.3Srillig	};
761.3Srillig}
771.4Srillig//indent end
78