Home | History | Annotate | Line # | Download | only in indent
lsym_lparen_or_lbracket.c revision 1.13
      1  1.13  rillig /* $NetBSD: lsym_lparen_or_lbracket.c,v 1.13 2023/06/04 18:58:30 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.10  rillig 	origin = (struct point){0, 0};
    198   1.6  rillig 
    199   1.6  rillig 	/* GCC statement expression */
    200   1.6  rillig 	/* expr = ({if(expr)debug();expr;}); */
    201   1.6  rillig }
    202   1.7  rillig //indent end
    203   1.6  rillig 
    204   1.6  rillig 
    205   1.6  rillig /*
    206  1.10  rillig  * Test a few variants of C99 compound expressions, as the '{' and '}' must not
    207  1.10  rillig  * be treated as block delimiters.
    208  1.10  rillig  */
    209  1.10  rillig //indent input
    210  1.10  rillig {
    211  1.10  rillig 	return (struct point){0, 0};
    212  1.10  rillig 	return (struct point){
    213  1.10  rillig 		0, 0
    214  1.10  rillig 	};
    215  1.10  rillig 	return (struct point){.x = 0, .y = 0};
    216  1.10  rillig 	return (struct point){
    217  1.10  rillig 		.x = 0,
    218  1.11  rillig 		.y = 0,
    219  1.10  rillig 	};
    220  1.10  rillig }
    221  1.10  rillig //indent end
    222  1.10  rillig 
    223  1.10  rillig //indent run-equals-input
    224  1.10  rillig 
    225  1.10  rillig 
    226  1.10  rillig /*
    227   1.6  rillig  * C99 designator initializers are the rare situation where there is a space
    228   1.6  rillig  * before a '['.
    229   1.6  rillig  */
    230   1.7  rillig //indent input
    231   1.6  rillig int array[] = {
    232   1.6  rillig 	1, 2, [2] = 3, [3] = 4,
    233   1.6  rillig };
    234   1.7  rillig //indent end
    235   1.6  rillig 
    236   1.7  rillig //indent run-equals-input -di0
    237   1.6  rillig 
    238   1.6  rillig 
    239   1.6  rillig /*
    240   1.6  rillig  * Test want_blank_before_lparen for all possible token types.
    241   1.6  rillig  */
    242   1.7  rillig //indent input
    243   1.6  rillig void cover_want_blank_before_lparen(void)
    244   1.6  rillig {
    245  1.12  rillig 	/* ps.prev_lsym can never be 'newline'. */
    246   1.6  rillig 	int newline =
    247   1.6  rillig 	(3);
    248   1.6  rillig 
    249   1.6  rillig 	int lparen_or_lbracket = a[(3)];
    250   1.6  rillig 	int rparen_or_rbracket = a[3](5);
    251   1.6  rillig 	+(unary_op);
    252   1.6  rillig 	3 + (binary_op);
    253   1.6  rillig 	a++(postfix_op);	/* unlikely to be seen in practice */
    254   1.6  rillig 	cond ? (question) : (5);
    255   1.6  rillig 	switch (expr) {
    256   1.6  rillig 	case (case_label):;
    257   1.6  rillig 	}
    258   1.6  rillig 	a ? 3 : (colon);
    259   1.6  rillig 	(semicolon) = 3;
    260   1.6  rillig 	int lbrace[] = {(3)};
    261   1.6  rillig 	int rbrace_in_decl = {{3}(4)};	/* syntax error */
    262   1.6  rillig 	{}
    263   1.6  rillig 	(rbrace_in_stmt)();
    264   1.6  rillig 	ident(3);
    265   1.6  rillig 	int(decl);
    266   1.6  rillig 	a++, (comma)();
    267   1.6  rillig 	int comment = /* comment */ (3);	/* comment is skipped */
    268   1.6  rillig 	switch (expr) {}
    269   1.6  rillig #define preprocessing
    270   1.6  rillig 	(preprocessing)();
    271   1.9  rillig 	(lsym_form_feed)();
    273   1.6  rillig 	for(;;);
    274   1.6  rillig 	do(lsym_do)=3;while(0);
    275   1.6  rillig 	if(cond);else(lsym_else)();
    276   1.6  rillig 	do(lsym_do);while(0);
    277   1.6  rillig 	str.(member);		/* syntax error */
    278   1.6  rillig 	L("string_prefix");		/* impossible */
    279   1.6  rillig 	static (int)storage_class;	/* syntax error */
    280   1.6  rillig 	funcname(3);
    281   1.6  rillig 	typedef (type_def) new_type;
    282   1.6  rillig 	// $ TODO: is keyword_struct_union_enum possible?
    283   1.6  rillig 	struct (keyword_struct_union_enum);	/* syntax error */
    284   1.7  rillig }
    285   1.6  rillig //indent end
    286   1.7  rillig 
    287   1.6  rillig //indent run -ldi0
    288   1.6  rillig void
    289   1.6  rillig cover_want_blank_before_lparen(void)
    290  1.12  rillig {
    291   1.6  rillig 	/* ps.prev_lsym can never be 'newline'. */
    292   1.6  rillig 	int newline =
    293   1.6  rillig 	(3);
    294   1.6  rillig 
    295   1.6  rillig 	int lparen_or_lbracket = a[(3)];
    296   1.6  rillig 	int rparen_or_rbracket = a[3](5);
    297   1.6  rillig 	+(unary_op);
    298   1.6  rillig 	3 + (binary_op);
    299   1.6  rillig 	a++ (postfix_op);	/* unlikely to be seen in practice */
    300   1.6  rillig 	cond ? (question) : (5);
    301  1.13  rillig 	switch (expr) {
    302   1.6  rillig 	case (case_label): ;
    303   1.6  rillig 	}
    304   1.6  rillig 	a ? 3 : (colon);
    305   1.6  rillig 	(semicolon) = 3;
    306   1.6  rillig 	int lbrace[] = {(3)};
    307   1.6  rillig 	int rbrace_in_decl = {{3} (4)};	/* syntax error */
    308   1.6  rillig 	{
    309   1.6  rillig 	}
    310   1.6  rillig 	(rbrace_in_stmt)();
    311   1.6  rillig 	ident(3);
    312   1.6  rillig 	int (decl);
    313   1.6  rillig 	a++, (comma)();
    314   1.6  rillig 	int comment = /* comment */ (3);	/* comment is skipped */
    315   1.6  rillig 	switch (expr) {
    316   1.6  rillig 	}
    317   1.6  rillig #define preprocessing
    318   1.9  rillig 	(preprocessing)();
    319   1.6  rillig 	(lsym_form_feed)();
    321   1.6  rillig 	for (;;);
    322   1.6  rillig 	do
    323   1.6  rillig 		(lsym_do) = 3;
    324   1.6  rillig 	while (0);
    325   1.6  rillig 	if (cond);
    326   1.6  rillig 	else
    327   1.6  rillig 		(lsym_else)();
    328   1.6  rillig 	do
    329   1.6  rillig 		(lsym_do);
    330   1.6  rillig 	while (0);
    331   1.6  rillig 	str.(member);		/* syntax error */
    332   1.6  rillig 	L("string_prefix");	/* impossible */
    333   1.6  rillig 	static (int)storage_class;	/* syntax error */
    334   1.6  rillig 	funcname(3);
    335   1.6  rillig 	typedef (type_def) new_type;
    336   1.7  rillig 	struct (keyword_struct_union_enum);	/* syntax error */
    337   1.6  rillig }
    338   1.2  rillig //indent end
    339               
    340               /* See t_errors.sh, test case 'compound_literal'. */
    341