Home | History | Annotate | Line # | Download | only in indent
lsym_lparen_or_lbracket.c revision 1.9
      1  1.9  rillig /* $NetBSD: lsym_lparen_or_lbracket.c,v 1.9 2023/05/16 11:32:02 rillig Exp $ */
      2  1.1  rillig 
      3  1.1  rillig /*
      4  1.1  rillig  * Tests for the token lsym_lparen_or_lbracket, which represents a '(' or '['
      5  1.1  rillig  * in these contexts:
      6  1.1  rillig  *
      7  1.1  rillig  * In a type name, '(' constructs a function type.
      8  1.1  rillig  *
      9  1.1  rillig  * In an expression, '(' starts an inner expression to override the usual
     10  1.1  rillig  * operator precedence.
     11  1.1  rillig  *
     12  1.6  rillig  * In a function call expression, '(' marks the beginning of the function
     13  1.6  rillig  * arguments.
     14  1.1  rillig  *
     15  1.1  rillig  * In a 'sizeof' expression, '(' is required if the argument is a type name.
     16  1.1  rillig  *
     17  1.6  rillig  * In an expression, '(' followed by a type name starts a cast expression or
     18  1.6  rillig  * a compound literal.
     19  1.6  rillig  *
     20  1.6  rillig  * In a type declaration, '(' marks the beginning of the function parameters.
     21  1.6  rillig  *
     22  1.1  rillig  * After one of the keywords 'for', 'if', 'switch' or 'while', the controlling
     23  1.5  rillig  * expression must be enclosed in '(' and ')'; see lsym_for.c, lsym_if.c,
     24  1.5  rillig  * lsym_switch.c, lsym_while.c.
     25  1.1  rillig  *
     26  1.5  rillig  * In a declaration, '[' derives an array type.
     27  1.5  rillig  *
     28  1.5  rillig  * In an expression, '[' starts an array subscript.
     29  1.5  rillig  */
     30  1.5  rillig 
     31  1.5  rillig /* The '(' in a type name derives a function type. */
     32  1.7  rillig //indent input
     33  1.5  rillig typedef void signal_handler(int);
     34  1.5  rillig void (*signal(void (*)(int)))(int);
     35  1.7  rillig //indent end
     36  1.5  rillig 
     37  1.7  rillig //indent run
     38  1.5  rillig typedef void signal_handler(int);
     39  1.5  rillig void		(*signal(void (*)(int)))(int);
     40  1.7  rillig //indent end
     41  1.5  rillig 
     42  1.5  rillig 
     43  1.7  rillig //indent input
     44  1.6  rillig #define macro(arg) ((arg) + 1)
     45  1.7  rillig //indent end
     46  1.6  rillig 
     47  1.7  rillig //indent run-equals-input -di0
     48  1.6  rillig 
     49  1.6  rillig 
     50  1.5  rillig /*
     51  1.5  rillig  * The '(' in an expression overrides operator precedence.  In multi-line
     52  1.5  rillig  * expressions, the continuation lines are aligned on the parentheses.
     53  1.1  rillig  */
     54  1.7  rillig //indent input
     55  1.5  rillig int nested = (
     56  1.5  rillig 	(
     57  1.5  rillig 		(
     58  1.5  rillig 			(
     59  1.5  rillig 				1 + 4
     60  1.5  rillig 			)
     61  1.5  rillig 		)
     62  1.5  rillig 	)
     63  1.5  rillig );
     64  1.7  rillig //indent end
     65  1.5  rillig 
     66  1.7  rillig //indent run
     67  1.5  rillig int		nested = (
     68  1.5  rillig 			  (
     69  1.5  rillig 			   (
     70  1.5  rillig 			    (
     71  1.5  rillig 			     1 + 4
     72  1.5  rillig 			     )
     73  1.5  rillig 			    )
     74  1.5  rillig 			   )
     75  1.5  rillig );
     76  1.7  rillig //indent end
     77  1.5  rillig 
     78  1.5  rillig 
     79  1.5  rillig /* The '(' in a function call expression starts the argument list. */
     80  1.7  rillig //indent input
     81  1.5  rillig int var = macro_call ( arg1,  arg2  ,arg3);
     82  1.7  rillig //indent end
     83  1.5  rillig 
     84  1.7  rillig //indent run
     85  1.5  rillig int		var = macro_call(arg1, arg2, arg3);
     86  1.7  rillig //indent end
     87  1.5  rillig 
     88  1.5  rillig 
     89  1.5  rillig /*
     90  1.5  rillig  * The '(' in a sizeof expression is required for type names and optional for
     91  1.5  rillig  * expressions.
     92  1.5  rillig  */
     93  1.7  rillig //indent input
     94  1.5  rillig size_t sizeof_typename = sizeof ( int );
     95  1.5  rillig size_t sizeof_expr = sizeof ( 12345 ) ;
     96  1.7  rillig //indent end
     97  1.5  rillig 
     98  1.7  rillig //indent run
     99  1.5  rillig size_t		sizeof_typename = sizeof(int);
    100  1.5  rillig size_t		sizeof_expr = sizeof(12345);
    101  1.7  rillig //indent end
    102  1.5  rillig 
    103  1.5  rillig 
    104  1.5  rillig /* The '[' in a type name derives an array type. */
    105  1.7  rillig //indent input
    106  1.5  rillig int array_of_numbers[100];
    107  1.7  rillig //indent end
    108  1.5  rillig 
    109  1.7  rillig //indent run
    110  1.5  rillig int		array_of_numbers[100];
    111  1.7  rillig //indent end
    112  1.5  rillig 
    113  1.5  rillig 
    114  1.5  rillig /* The '[' in an expression accesses an array element. */
    115  1.7  rillig //indent input
    116  1.5  rillig int second_prime = &primes[1];
    117  1.7  rillig //indent end
    118  1.5  rillig 
    119  1.7  rillig //indent run
    120  1.5  rillig int		second_prime = &primes[1];
    121  1.7  rillig //indent end
    122  1.1  rillig 
    123  1.3  rillig 
    124  1.7  rillig //indent input
    125  1.3  rillig void
    126  1.3  rillig function(void)
    127  1.3  rillig {
    128  1.3  rillig 	/* Type casts */
    129  1.3  rillig 	a = (int)b;
    130  1.3  rillig 	a = (struct tag)b;
    131  1.3  rillig 	/* TODO: The '(int)' is not a type cast, it is a prototype list. */
    132  1.3  rillig 	a = (int (*)(int))fn;
    133  1.3  rillig 
    134  1.3  rillig 	/* Not type casts */
    135  1.3  rillig 	a = sizeof(int) * 2;
    136  1.3  rillig 	a = sizeof(5) * 2;
    137  1.3  rillig 	a = offsetof(struct stat, st_mtime);
    138  1.3  rillig 
    139  1.3  rillig 	/* Grouping subexpressions */
    140  1.3  rillig 	a = ((((b + c)))) * d;
    141  1.3  rillig }
    142  1.7  rillig //indent end
    143  1.1  rillig 
    144  1.7  rillig //indent run-equals-input
    145  1.2  rillig 
    146  1.6  rillig 
    147  1.6  rillig /* This is the maximum supported number of parentheses. */
    148  1.7  rillig //indent input
    149  1.6  rillig int zero = (((((((((((((((((((0)))))))))))))))))));
    150  1.7  rillig //indent end
    151  1.6  rillig 
    152  1.7  rillig //indent run-equals-input -di0
    153  1.6  rillig 
    154  1.6  rillig 
    155  1.7  rillig //indent input
    156  1.6  rillig void (*action)(void);
    157  1.7  rillig //indent end
    158  1.6  rillig 
    159  1.7  rillig //indent run-equals-input -di0
    160  1.6  rillig 
    161  1.6  rillig 
    162  1.7  rillig //indent input
    163  1.6  rillig void
    164  1.6  rillig function(void)
    165  1.6  rillig {
    166  1.6  rillig     other_function();
    167  1.6  rillig     other_function("first", 2, "last argument"[4]);
    168  1.6  rillig 
    169  1.6  rillig     if (false)(void)x;
    170  1.6  rillig     if (false)(func)(arg);
    171  1.6  rillig     if (false)(cond)?123:456;
    172  1.6  rillig 
    173  1.6  rillig     /* C99 compound literal */
    174  1.6  rillig     origin = (struct point){0,0};
    175  1.6  rillig 
    176  1.6  rillig     /* GCC statement expression */
    177  1.6  rillig     /* expr = ({if(expr)debug();expr;}); */
    178  1.6  rillig /* $ XXX: Generates 'error: Standard Input:36: Unbalanced parentheses'. */
    179  1.6  rillig }
    180  1.7  rillig //indent end
    181  1.6  rillig 
    182  1.7  rillig //indent run
    183  1.6  rillig void
    184  1.6  rillig function(void)
    185  1.6  rillig {
    186  1.6  rillig 	other_function();
    187  1.6  rillig 	other_function("first", 2, "last argument"[4]);
    188  1.6  rillig 
    189  1.6  rillig 	if (false)
    190  1.6  rillig 		(void)x;
    191  1.6  rillig 	if (false)
    192  1.6  rillig 		(func)(arg);
    193  1.6  rillig 	if (false)
    194  1.6  rillig 		(cond) ? 123 : 456;
    195  1.6  rillig 
    196  1.6  rillig 	/* C99 compound literal */
    197  1.6  rillig 	origin = (struct point){
    198  1.6  rillig 		0, 0
    199  1.6  rillig 	};
    200  1.6  rillig 
    201  1.6  rillig 	/* GCC statement expression */
    202  1.6  rillig 	/* expr = ({if(expr)debug();expr;}); */
    203  1.6  rillig }
    204  1.7  rillig //indent end
    205  1.6  rillig 
    206  1.6  rillig 
    207  1.6  rillig /*
    208  1.6  rillig  * C99 designator initializers are the rare situation where there is a space
    209  1.6  rillig  * before a '['.
    210  1.6  rillig  */
    211  1.7  rillig //indent input
    212  1.6  rillig int array[] = {
    213  1.6  rillig 	1, 2, [2] = 3, [3] = 4,
    214  1.6  rillig };
    215  1.7  rillig //indent end
    216  1.6  rillig 
    217  1.7  rillig //indent run-equals-input -di0
    218  1.6  rillig 
    219  1.6  rillig 
    220  1.6  rillig /*
    221  1.6  rillig  * Test want_blank_before_lparen for all possible token types.
    222  1.6  rillig  */
    223  1.7  rillig //indent input
    224  1.6  rillig void cover_want_blank_before_lparen(void)
    225  1.6  rillig {
    226  1.6  rillig 	/* ps.prev_token can never be 'newline'. */
    227  1.6  rillig 	int newline =
    228  1.6  rillig 	(3);
    229  1.6  rillig 
    230  1.6  rillig 	int lparen_or_lbracket = a[(3)];
    231  1.6  rillig 	int rparen_or_rbracket = a[3](5);
    232  1.6  rillig 	+(unary_op);
    233  1.6  rillig 	3 + (binary_op);
    234  1.6  rillig 	a++(postfix_op);	/* unlikely to be seen in practice */
    235  1.6  rillig 	cond ? (question) : (5);
    236  1.6  rillig 	switch (expr) {
    237  1.6  rillig 	case (case_label):;
    238  1.6  rillig 	}
    239  1.6  rillig 	a ? 3 : (colon);
    240  1.6  rillig 	(semicolon) = 3;
    241  1.6  rillig 	int lbrace[] = {(3)};
    242  1.6  rillig 	int rbrace_in_decl = {{3}(4)};	/* syntax error */
    243  1.6  rillig 	{}
    244  1.6  rillig 	(rbrace_in_stmt)();
    245  1.6  rillig 	ident(3);
    246  1.6  rillig 	int(decl);
    247  1.6  rillig 	a++, (comma)();
    248  1.6  rillig 	int comment = /* comment */ (3);	/* comment is skipped */
    249  1.6  rillig 	switch (expr) {}
    250  1.6  rillig #define preprocessing
    251  1.6  rillig 	(preprocessing)();
    252  1.9  rillig 	(lsym_form_feed)();
    254  1.6  rillig 	for(;;);
    255  1.6  rillig 	do(lsym_do)=3;while(0);
    256  1.6  rillig 	if(cond);else(lsym_else)();
    257  1.6  rillig 	do(lsym_do);while(0);
    258  1.6  rillig 	str.(member);		/* syntax error */
    259  1.6  rillig 	L("string_prefix");		/* impossible */
    260  1.6  rillig 	static (int)storage_class;	/* syntax error */
    261  1.6  rillig 	funcname(3);
    262  1.6  rillig 	typedef (type_def) new_type;
    263  1.6  rillig 	// $ TODO: is keyword_struct_union_enum possible?
    264  1.6  rillig 	struct (keyword_struct_union_enum);	/* syntax error */
    265  1.7  rillig }
    266  1.6  rillig //indent end
    267  1.7  rillig 
    268  1.6  rillig //indent run -ldi0
    269  1.6  rillig void
    270  1.6  rillig cover_want_blank_before_lparen(void)
    271  1.6  rillig {
    272  1.6  rillig 	/* ps.prev_token can never be 'newline'. */
    273  1.6  rillig 	int newline =
    274  1.6  rillig 	(3);
    275  1.6  rillig 
    276  1.6  rillig 	int lparen_or_lbracket = a[(3)];
    277  1.6  rillig 	int rparen_or_rbracket = a[3](5);
    278  1.6  rillig 	+(unary_op);
    279  1.6  rillig 	3 + (binary_op);
    280  1.6  rillig 	a++ (postfix_op);	/* unlikely to be seen in practice */
    281  1.6  rillig 	cond ? (question) : (5);
    282  1.6  rillig 	switch (expr) {
    283  1.6  rillig 	case (case_label):;
    284  1.6  rillig 	}
    285  1.6  rillig 	a ? 3 : (colon);
    286  1.6  rillig 	(semicolon) = 3;
    287  1.6  rillig 	int lbrace[] = {(3)};
    288  1.6  rillig 	int rbrace_in_decl = {{3} (4)};	/* syntax error */
    289  1.6  rillig 	{
    290  1.6  rillig 	}
    291  1.6  rillig 	(rbrace_in_stmt)();
    292  1.6  rillig 	ident(3);
    293  1.6  rillig 	int (decl);
    294  1.6  rillig 	a++, (comma)();
    295  1.6  rillig 	int comment = /* comment */ (3);	/* comment is skipped */
    296  1.6  rillig 	switch (expr) {
    297  1.6  rillig 	}
    298  1.6  rillig #define preprocessing
    299  1.9  rillig 	(preprocessing)();
    300  1.6  rillig 	(lsym_form_feed)();
    302  1.6  rillig 	for (;;);
    303  1.6  rillig 	do
    304  1.6  rillig 		(lsym_do) = 3;
    305  1.6  rillig 	while (0);
    306  1.6  rillig 	if (cond);
    307  1.6  rillig 	else
    308  1.6  rillig 		(lsym_else)();
    309  1.6  rillig 	do
    310  1.6  rillig 		(lsym_do);
    311  1.6  rillig 	while (0);
    312  1.6  rillig 	str.(member);		/* syntax error */
    313  1.6  rillig 	L("string_prefix");	/* impossible */
    314  1.6  rillig 	static (int)storage_class;	/* syntax error */
    315  1.6  rillig 	funcname(3);
    316  1.6  rillig 	typedef (type_def) new_type;
    317  1.7  rillig 	struct (keyword_struct_union_enum);	/* syntax error */
    318  1.6  rillig }
    319  1.2  rillig //indent end
    320              
    321              /* See t_errors.sh, test case 'compound_literal'. */
    322