/* $NetBSD: lsym_lbrace.c,v 1.10 2023/06/16 23:19:01 rillig Exp $ */
/*
* Tests for the token lsym_lbrace, which represents a '{' in these contexts:
*
* In an initializer, '{' starts an inner group of initializers, usually to
* initialize a nested struct, union or array.
*
* In a function body, '{' starts a block.
*
* In an expression, '(type){' starts a compound literal that is typically
* used in an assignment to a struct or array.
*
* In macro arguments, a '{' is an ordinary character, it does not need to be
* balanced. This is in contrast to '(', which must be balanced with ')'.
*
* TODO: try to split this token into lsym_lbrace_block and lsym_lbrace_init.
*/
/* Brace level in an initializer */
//indent input
void
function(void)
{
struct person p = {
.name = "Name",
.age = {{{35}}}, /* C11 6.7.9 allows this. */
};
}
//indent end
//indent run-equals-input
/* Begin of a block of statements */
//indent input
void function(void) {{{ body(); }}}
//indent end
//indent run
void
function(void)
{
{
{
body();
}
}
}
//indent end
/* Compound literal */
//indent input
struct point
origin(void)
{
return (struct point){
.x = 0,
.y = 0,
}, actual_return_value;
}
//indent end
//indent run-equals-input
/* Ensure that the comma is not interpreted as separator for declarators. */
//indent run-equals-input -bc
//indent input
{
const char *hello = (const char[]){
'h', 'e', 'l', 'l', 'o',
}, *world = (const char[]){
'w', 'o', 'r', 'l', 'd',
};
}
//indent end
//indent run-equals-input -ldi0
//indent run-equals-input -ldi0 -bc
//indent input
{
if (cond rparen {
}
switch (expr rparen {
}
}
//indent end
//indent run
{
if (cond rparen {
}
switch (expr rparen {
}
}
// exit 1
// error: Standard Input:2: Unbalanced parentheses
// error: Standard Input:4: Unbalanced parentheses
//indent end
/*
* The -bl option does not force initializer braces on separate lines.
*/
//indent input
struct {int member;} var = {1};
//indent end
//indent run -bl
struct
{
int member;
} var = {1};
//indent end
/*
* A comment in a single-line function definition is not a declaration comment
* and thus not in column 25.
*/
//indent input
void function(void); /* comment */
void function(void) { /* comment */ }
//indent end
//indent run -di0
void function(void); /* comment */
void
function(void)
{ /* comment */
}
//indent end
//indent run -di0 -nfbs
void function(void); /* comment */
void
function(void) { /* comment */
}
//indent end