Home | History | Annotate | Line # | Download | only in indent
fmt_decl.c revision 1.55
      1  1.55  rillig /*	$NetBSD: fmt_decl.c,v 1.55 2023/06/14 20:46:08 rillig Exp $	*/
      2   1.1  rillig 
      3  1.19  rillig /*
      4  1.19  rillig  * Tests for declarations of global variables, external functions, and local
      5  1.19  rillig  * variables.
      6  1.19  rillig  *
      7  1.19  rillig  * See also:
      8  1.19  rillig  *	opt_di.c
      9  1.19  rillig  */
     10  1.19  rillig 
     11   1.1  rillig /* See FreeBSD r303570 */
     12   1.1  rillig 
     13  1.19  rillig /*
     14  1.19  rillig  * A type definition usually declares a single type, so there is no need to
     15  1.19  rillig  * align the newly declared type name with the other variables.
     16  1.19  rillig  */
     17  1.35  rillig //indent input
     18  1.30  rillig typedef   void   (   *   function_ptr   )   (   int   *   )   ;
     19  1.35  rillig //indent end
     20   1.1  rillig 
     21  1.35  rillig //indent run
     22  1.30  rillig typedef void (*function_ptr)(int *);
     23  1.35  rillig //indent end
     24   1.1  rillig 
     25   1.1  rillig 
     26  1.19  rillig /*
     27  1.19  rillig  * In variable declarations, the names of the first declarators are indented
     28  1.19  rillig  * by the amount given in '-di', which defaults to 16.
     29  1.19  rillig  */
     30  1.35  rillig //indent input
     31  1.19  rillig extern   void   (   *   function_pointer   )   (   int   *   )   ;
     32  1.19  rillig extern   void   *   pointer;
     33  1.35  rillig //indent end
     34  1.19  rillig 
     35  1.35  rillig //indent run
     36  1.19  rillig /* $ XXX: Why is the token 'function_pointer' not aligned with 'pointer'? */
     37  1.19  rillig extern void	(*function_pointer)(int *);
     38  1.19  rillig extern void    *pointer;
     39  1.35  rillig //indent end
     40  1.19  rillig 
     41  1.19  rillig 
     42  1.35  rillig //indent input
     43   1.1  rillig static const struct
     44   1.1  rillig {
     45   1.1  rillig 	double		x;
     46   1.1  rillig 	double		y, z;
     47   1.1  rillig } n[m + 1] =
     48   1.1  rillig {
     49   1.1  rillig 	{
     50   1.1  rillig 		.0,
     51   1.1  rillig 		.9,
     52   1.1  rillig 		5
     53   1.1  rillig 	}
     54   1.1  rillig };
     55  1.35  rillig //indent end
     56   1.1  rillig 
     57  1.35  rillig //indent run
     58  1.37  rillig static const struct
     59  1.37  rillig {
     60   1.1  rillig 	double		x;
     61   1.1  rillig 	double		y, z;
     62   1.1  rillig }		n[m + 1] =
     63   1.1  rillig {
     64   1.1  rillig 	{
     65   1.1  rillig 		.0,
     66   1.1  rillig 		.9,
     67   1.1  rillig 		5
     68   1.1  rillig 	}
     69   1.1  rillig };
     70  1.35  rillig //indent end
     71   1.1  rillig 
     72   1.1  rillig 
     73  1.35  rillig //indent input
     74   1.1  rillig typedef struct Complex
     75   1.1  rillig {
     76   1.1  rillig 	double		x;
     77   1.1  rillig 	double		y;
     78   1.1  rillig }	Complex;
     79  1.35  rillig //indent end
     80   1.1  rillig 
     81  1.35  rillig //indent run
     82  1.37  rillig typedef struct Complex
     83  1.37  rillig {
     84   1.1  rillig 	double		x;
     85   1.1  rillig 	double		y;
     86   1.1  rillig }		Complex;
     87  1.35  rillig //indent end
     88   1.1  rillig 
     89   1.1  rillig 
     90   1.8  rillig /*
     91  1.38  rillig  * Ensure that function definitions are reasonably indented.  Before
     92  1.38  rillig  * 2023-05-11, tokens were repeatedly read, and the line numbers were wrong.
     93   1.8  rillig  */
     94  1.35  rillig //indent input
     95   1.1  rillig void
     96   1.1  rillig t1 (char *a, int b,
     97   1.1  rillig 	void (*fn)(void))
     98   1.1  rillig {}
     99  1.35  rillig //indent end
    100   1.1  rillig 
    101  1.35  rillig //indent run
    102   1.1  rillig void
    103   1.1  rillig t1(char *a, int b,
    104   1.1  rillig    void (*fn)(void))
    105   1.1  rillig {
    106   1.1  rillig }
    107  1.35  rillig //indent end
    108   1.1  rillig 
    109   1.1  rillig 
    110  1.19  rillig /* See opt_bc.c. */
    111  1.35  rillig //indent input
    112   1.1  rillig void t2 (char *x, int y)
    113   1.1  rillig {
    114   1.1  rillig 	int a,
    115   1.1  rillig 	b,
    116   1.1  rillig 	c;
    117   1.1  rillig 	int
    118   1.1  rillig 	*d,
    119   1.1  rillig 	*e,
    120   1.1  rillig 	*f;
    121   1.1  rillig 	int (*g)(),
    122   1.1  rillig 	(*h)(),
    123   1.1  rillig 	(*i)();
    124   1.1  rillig 	int j,
    125   1.1  rillig 	k,
    126   1.1  rillig 	l;
    127   1.1  rillig 	int m
    128   1.1  rillig 	,n
    129   1.1  rillig 	,o
    130   1.1  rillig 	;
    131  1.43  rillig 	int		chars[ /* push the comma beyond column 74 ...... */ ], x;
    132   1.1  rillig }
    133  1.35  rillig //indent end
    134   1.1  rillig 
    135  1.35  rillig //indent run
    136   1.1  rillig void
    137   1.1  rillig t2(char *x, int y)
    138   1.1  rillig {
    139   1.1  rillig 	int		a, b, c;
    140   1.1  rillig 	int
    141   1.1  rillig 		       *d, *e, *f;
    142   1.1  rillig 	int		(*g)(), (*h)(), (*i)();
    143   1.1  rillig 	int		j, k, l;
    144   1.1  rillig 	int		m
    145   1.1  rillig 		       ,n
    146   1.1  rillig 		       ,o
    147   1.1  rillig 		       ;
    148  1.43  rillig 	int		chars[/* push the comma beyond column 74 ...... */],
    149   1.1  rillig 			x;
    150   1.1  rillig }
    151  1.35  rillig //indent end
    152   1.1  rillig 
    153   1.1  rillig 
    154  1.35  rillig //indent input
    155   1.1  rillig const int	int_minimum_size =
    156  1.51  rillig // $ FIXME: Missing indentation.
    157   1.1  rillig MAXALIGN(offsetof(int, test)) + MAXIMUM_ALIGNOF;
    158  1.35  rillig //indent end
    159   1.1  rillig 
    160  1.35  rillig //indent run-equals-input
    161   1.1  rillig 
    162   1.1  rillig 
    163  1.25  rillig /*
    164  1.25  rillig  * Ensure that the usual GCC-style function attributes are formatted in a
    165  1.25  rillig  * sensible way.
    166  1.25  rillig  */
    167  1.35  rillig //indent input
    168  1.39  rillig void single_param(int) __attribute__((__noreturn__)) ;
    169  1.39  rillig void function(const char *, ...) __attribute__((format(printf, 1, 2))) ;
    170  1.35  rillig //indent end
    171  1.25  rillig 
    172  1.35  rillig //indent run -di0
    173  1.39  rillig void single_param(int) __attribute__((__noreturn__));
    174  1.39  rillig void function(const char *, ...) __attribute__((format(printf, 1, 2)));
    175  1.35  rillig //indent end
    176  1.25  rillig 
    177  1.35  rillig //indent run
    178  1.39  rillig void		single_param(int) __attribute__((__noreturn__));
    179  1.39  rillig void		function(const char *, ...) __attribute__((format(printf, 1, 2)));
    180  1.35  rillig //indent end
    181  1.25  rillig 
    182  1.25  rillig 
    183  1.35  rillig //indent input
    184   1.1  rillig static
    185   1.1  rillig _attribute_printf(1, 2)
    186   1.1  rillig void
    187   1.1  rillig print_error(const char *fmt,...)
    188   1.1  rillig {
    189   1.1  rillig }
    190  1.35  rillig //indent end
    191   1.1  rillig 
    192  1.35  rillig //indent run
    193   1.1  rillig static
    194   1.1  rillig _attribute_printf(1, 2)
    195   1.1  rillig void
    196   1.1  rillig print_error(const char *fmt, ...)
    197   1.1  rillig {
    198   1.2  rillig }
    199  1.35  rillig //indent end
    200   1.2  rillig 
    201   1.2  rillig 
    202  1.35  rillig //indent input
    203   1.2  rillig static _attribute_printf(1, 2)
    204   1.2  rillig void
    205   1.2  rillig print_error(const char *fmt,...)
    206   1.2  rillig {
    207   1.2  rillig }
    208  1.35  rillig //indent end
    209   1.1  rillig 
    210  1.35  rillig //indent run
    211   1.2  rillig static _attribute_printf(1, 2)
    212   1.2  rillig void
    213   1.2  rillig print_error(const char *fmt, ...)
    214   1.2  rillig {
    215   1.2  rillig }
    216  1.35  rillig //indent end
    217   1.2  rillig 
    218   1.2  rillig 
    219  1.35  rillig //indent input
    220   1.2  rillig static void _attribute_printf(1, 2)
    221   1.2  rillig print_error(const char *fmt,...)
    222   1.2  rillig {
    223   1.2  rillig }
    224  1.35  rillig //indent end
    225   1.2  rillig 
    226  1.35  rillig //indent run
    227   1.2  rillig static void
    228   1.2  rillig _attribute_printf(1, 2)
    229   1.2  rillig print_error(const char *fmt, ...)
    230   1.2  rillig {
    231   1.1  rillig }
    232  1.35  rillig //indent end
    233   1.1  rillig 
    234   1.1  rillig 
    235   1.3  rillig /* See FreeBSD r309380 */
    236  1.35  rillig //indent input
    237   1.1  rillig static LIST_HEAD(, alq) ald_active;
    238  1.19  rillig static int ald_shutting_down = 0;
    239   1.1  rillig struct thread *ald_thread;
    240  1.35  rillig //indent end
    241   1.1  rillig 
    242  1.35  rillig //indent run
    243   1.1  rillig static LIST_HEAD(, alq) ald_active;
    244  1.19  rillig static int	ald_shutting_down = 0;
    245   1.1  rillig struct thread  *ald_thread;
    246  1.35  rillig //indent end
    247   1.1  rillig 
    248   1.1  rillig 
    249  1.35  rillig //indent input
    250   1.1  rillig static int
    251   1.2  rillig old_style_definition(a, b, c)
    252   1.2  rillig 	struct thread *a;
    253   1.2  rillig 	int b;
    254   1.2  rillig 	double ***c;
    255   1.1  rillig {
    256   1.1  rillig 
    257   1.1  rillig }
    258  1.35  rillig //indent end
    259   1.1  rillig 
    260  1.35  rillig //indent run
    261   1.1  rillig static int
    262   1.2  rillig old_style_definition(a, b, c)
    263   1.2  rillig 	struct thread  *a;
    264   1.2  rillig 	int		b;
    265   1.2  rillig 	double	     ***c;
    266   1.1  rillig {
    267   1.1  rillig 
    268   1.1  rillig }
    269  1.35  rillig //indent end
    270   1.1  rillig 
    271   1.1  rillig 
    272   1.1  rillig /*
    273   1.1  rillig  * Demonstrate how variable declarations are broken into several lines when
    274   1.1  rillig  * the line length limit is set quite low.
    275   1.1  rillig  */
    276  1.35  rillig //indent input
    277   1.7  rillig struct s a,b;
    278   1.1  rillig struct s0 a,b;
    279   1.1  rillig struct s01 a,b;
    280   1.1  rillig struct s012 a,b;
    281   1.1  rillig struct s0123 a,b;
    282   1.1  rillig struct s01234 a,b;
    283   1.1  rillig struct s012345 a,b;
    284   1.1  rillig struct s0123456 a,b;
    285   1.1  rillig struct s01234567 a,b;
    286   1.1  rillig struct s012345678 a,b;
    287   1.1  rillig struct s0123456789 a,b;
    288   1.1  rillig struct s01234567890 a,b;
    289   1.1  rillig struct s012345678901 a,b;
    290   1.1  rillig struct s0123456789012 a,b;
    291   1.1  rillig struct s01234567890123 a,b;
    292  1.35  rillig //indent end
    293   1.1  rillig 
    294  1.35  rillig //indent run -l20 -di0
    295   1.7  rillig struct s a, b;
    296   1.7  rillig /* $ XXX: See process_comma, varname_len for why this line is broken. */
    297   1.1  rillig struct s0 a,
    298   1.1  rillig    b;
    299   1.7  rillig /* $ XXX: The indentation of the second line is wrong. The variable names */
    300   1.7  rillig /* $ XXX: 'a' and 'b' should be in the same column; the word 'struct' is */
    301   1.7  rillig /* $ XXX: missing in the calculation for the indentation. */
    302   1.1  rillig struct s01 a,
    303   1.1  rillig     b;
    304   1.1  rillig struct s012 a,
    305   1.1  rillig      b;
    306   1.1  rillig struct s0123 a,
    307   1.1  rillig       b;
    308   1.1  rillig struct s01234 a,
    309   1.1  rillig        b;
    310   1.1  rillig struct s012345 a,
    311   1.1  rillig         b;
    312   1.1  rillig struct s0123456 a,
    313   1.1  rillig          b;
    314   1.1  rillig struct s01234567 a,
    315   1.1  rillig           b;
    316   1.1  rillig struct s012345678 a,
    317   1.1  rillig            b;
    318   1.1  rillig struct s0123456789 a,
    319   1.1  rillig             b;
    320   1.1  rillig struct s01234567890 a,
    321   1.1  rillig              b;
    322   1.1  rillig struct s012345678901 a,
    323   1.1  rillig               b;
    324   1.1  rillig struct s0123456789012 a,
    325   1.1  rillig                b;
    326   1.1  rillig struct s01234567890123 a,
    327   1.1  rillig                 b;
    328  1.35  rillig //indent end
    329   1.2  rillig 
    330   1.2  rillig 
    331  1.35  rillig //indent input
    332   1.2  rillig char * x(void)
    333   1.2  rillig {
    334   1.2  rillig     type identifier;
    335   1.2  rillig     type *pointer;
    336   1.2  rillig     unused * value;
    337   1.2  rillig     (void)unused * value;
    338   1.2  rillig 
    339   1.2  rillig     dmax = (double)3 * 10.0;
    340   1.2  rillig     dmin = (double)dmax * 10.0;
    341   1.2  rillig     davg = (double)dmax * dmin;
    342   1.2  rillig 
    343   1.2  rillig     return NULL;
    344   1.2  rillig }
    345  1.35  rillig //indent end
    346   1.2  rillig 
    347  1.35  rillig //indent run
    348   1.2  rillig char *
    349   1.2  rillig x(void)
    350   1.2  rillig {
    351   1.2  rillig 	type		identifier;
    352   1.2  rillig 	type	       *pointer;
    353   1.2  rillig 	unused	       *value;
    354   1.2  rillig 	(void)unused * value;
    355   1.2  rillig 
    356   1.2  rillig 	dmax = (double)3 * 10.0;
    357   1.2  rillig 	dmin = (double)dmax * 10.0;
    358   1.2  rillig 	davg = (double)dmax * dmin;
    359   1.2  rillig 
    360   1.2  rillig 	return NULL;
    361   1.2  rillig }
    362  1.35  rillig //indent end
    363   1.2  rillig 
    364  1.21  rillig 
    365  1.35  rillig //indent input
    366   1.2  rillig int *
    367   1.2  rillig y(void) {
    368   1.2  rillig 
    369   1.2  rillig }
    370   1.2  rillig 
    371   1.2  rillig int
    372   1.2  rillig z(void) {
    373   1.2  rillig 
    374   1.2  rillig }
    375  1.35  rillig //indent end
    376   1.2  rillig 
    377  1.35  rillig //indent run
    378   1.2  rillig int *
    379   1.2  rillig y(void)
    380   1.2  rillig {
    381   1.2  rillig 
    382   1.2  rillig }
    383   1.2  rillig 
    384   1.2  rillig int
    385   1.2  rillig z(void)
    386   1.2  rillig {
    387   1.2  rillig 
    388   1.2  rillig }
    389  1.35  rillig //indent end
    390   1.2  rillig 
    391   1.2  rillig 
    392  1.35  rillig //indent input
    393   1.2  rillig int x;
    394   1.2  rillig int *y;
    395   1.2  rillig int * * * * z;
    396  1.35  rillig //indent end
    397   1.2  rillig 
    398  1.35  rillig //indent run
    399   1.2  rillig int		x;
    400   1.2  rillig int	       *y;
    401   1.2  rillig int	    ****z;
    402  1.35  rillig //indent end
    403   1.4  rillig 
    404   1.4  rillig 
    405  1.35  rillig //indent input
    406   1.4  rillig int main(void) {
    407   1.4  rillig     char (*f1)() = NULL;
    408   1.4  rillig     char *(*f1)() = NULL;
    409   1.4  rillig     char *(*f2)();
    410   1.4  rillig }
    411  1.35  rillig //indent end
    412   1.4  rillig 
    413   1.6  rillig /*
    414   1.6  rillig  * Before NetBSD io.c 1.103 from 2021-10-27, indent wrongly placed the second
    415   1.6  rillig  * and third variable declaration in column 1. This bug has been introduced
    416   1.6  rillig  * to NetBSD when FreeBSD indent was imported in 2019.
    417   1.6  rillig  */
    418  1.35  rillig //indent run -ldi0
    419   1.4  rillig int
    420   1.4  rillig main(void)
    421   1.4  rillig {
    422   1.4  rillig 	char (*f1)() = NULL;
    423   1.6  rillig 	char *(*f1)() = NULL;
    424   1.6  rillig 	char *(*f2)();
    425   1.4  rillig }
    426  1.35  rillig //indent end
    427   1.5  rillig 
    428  1.35  rillig //indent run
    429   1.5  rillig int
    430   1.5  rillig main(void)
    431   1.5  rillig {
    432   1.5  rillig /* $ XXX: Not really pretty, the name 'f1' should be aligned, if at all. */
    433   1.5  rillig 	char		(*f1)() = NULL;
    434   1.5  rillig /* $ XXX: Not really pretty, the name 'f1' should be aligned, if at all. */
    435   1.6  rillig 	char *(*	f1)() = NULL;
    436   1.5  rillig /* $ XXX: Not really pretty, the name 'f2' should be aligned, if at all. */
    437   1.6  rillig 	char *(*	f2)();
    438   1.5  rillig }
    439  1.35  rillig //indent end
    440  1.10  rillig 
    441  1.10  rillig 
    442  1.10  rillig /*
    443  1.10  rillig  * In some ancient time long before ISO C90, variable declarations with
    444  1.10  rillig  * initializer could be written without '='. The C Programming Language from
    445  1.10  rillig  * 1978 doesn't mention this form anymore.
    446  1.18  rillig  *
    447  1.18  rillig  * Before NetBSD lexi.c 1.123 from 2021-10-31, indent treated the '-' as a
    448  1.18  rillig  * unary operator.
    449  1.10  rillig  */
    450  1.35  rillig //indent input
    451  1.10  rillig int a - 1;
    452  1.10  rillig {
    453  1.10  rillig int a - 1;
    454  1.10  rillig }
    455  1.35  rillig //indent end
    456  1.10  rillig 
    457  1.35  rillig //indent run -di0
    458  1.11  rillig int a - 1;
    459  1.10  rillig {
    460  1.11  rillig 	int a - 1;
    461  1.10  rillig }
    462  1.35  rillig //indent end
    463  1.14  rillig 
    464  1.14  rillig 
    465  1.14  rillig /*
    466  1.20  rillig  * Between 2019-04-04 and before lexi.c 1.146 from 2021-11-19, the indentation
    467  1.18  rillig  * of the '*' depended on the function name, which did not make sense.  For
    468  1.18  rillig  * function names that matched [A-Za-z]+, the '*' was placed correctly, for
    469  1.18  rillig  * all other function names (containing [$0-9_]) the '*' was right-aligned on
    470  1.20  rillig  * the declaration indentation, which defaults to 16.
    471  1.14  rillig  */
    472  1.35  rillig //indent input
    473  1.14  rillig int *
    474  1.14  rillig f2(void)
    475  1.14  rillig {
    476  1.14  rillig }
    477  1.14  rillig 
    478  1.14  rillig int *
    479  1.14  rillig yy(void)
    480  1.14  rillig {
    481  1.14  rillig }
    482  1.14  rillig 
    483  1.14  rillig int *
    484  1.18  rillig int_create(void)
    485  1.14  rillig {
    486  1.14  rillig }
    487  1.35  rillig //indent end
    488  1.15  rillig 
    489  1.35  rillig //indent run-equals-input
    490  1.18  rillig 
    491  1.15  rillig 
    492  1.15  rillig /*
    493  1.15  rillig  * Since 2019-04-04, the space between the '){' is missing.
    494  1.15  rillig  */
    495  1.35  rillig //indent input
    496  1.15  rillig int *
    497  1.15  rillig function_name_____20________30________40________50
    498  1.15  rillig (void)
    499  1.15  rillig {}
    500  1.35  rillig //indent end
    501  1.15  rillig 
    502  1.38  rillig /*
    503  1.38  rillig  * Before 2023-05-11, indent moved the '{' right after the '(void)', without
    504  1.38  rillig  * any space in between.
    505  1.38  rillig  */
    506  1.35  rillig //indent run
    507  1.15  rillig int	       *function_name_____20________30________40________50
    508  1.37  rillig 		(void)
    509  1.37  rillig {
    510  1.15  rillig }
    511  1.35  rillig //indent end
    512  1.15  rillig 
    513  1.15  rillig 
    514  1.15  rillig /*
    515  1.17  rillig  * Since 2019-04-04 and before lexi.c 1.144 from 2021-11-19, some function
    516  1.17  rillig  * names were preserved while others were silently discarded.
    517  1.15  rillig  */
    518  1.35  rillig //indent input
    519  1.15  rillig int *
    520  1.15  rillig aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    521  1.15  rillig (void)
    522  1.15  rillig {}
    523  1.35  rillig //indent end
    524  1.15  rillig 
    525  1.38  rillig /*
    526  1.38  rillig  * Before 2023-05-11, indent moved the '{' right after the '(void)', without
    527  1.38  rillig  * any space in between.
    528  1.38  rillig  */
    529  1.35  rillig //indent run
    530  1.16  rillig int	       *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    531  1.37  rillig 		(void)
    532  1.37  rillig {
    533  1.15  rillig }
    534  1.35  rillig //indent end
    535  1.22  rillig 
    536  1.22  rillig 
    537  1.22  rillig /*
    538  1.22  rillig  * Before 1990, when C90 standardized function prototypes, a function
    539  1.22  rillig  * declaration or definition did not contain a '*' that may have looked
    540  1.22  rillig  * similar to the binary operator '*' because it was surrounded by two
    541  1.22  rillig  * identifiers.
    542  1.22  rillig  *
    543  1.26  rillig  * As of 2021-11-21, indent interpreted the '*' in the function declaration in
    544  1.26  rillig  * line 1 as a binary operator, even though the '*' was followed by a ','
    545  1.26  rillig  * directly. This was not visible in the output though since indent never
    546  1.26  rillig  * outputs a space before a comma.
    547  1.22  rillig  *
    548  1.26  rillig  * In the function declaration in line 2 and the function definition in line
    549  1.26  rillig  * 5, indent interpreted the '*' as a binary operator as well and accordingly
    550  1.26  rillig  * placed spaces around the '*'. On a very low syntactical analysis level,
    551  1.26  rillig  * this may have made sense since the '*' was surrounded by words, but still
    552  1.26  rillig  * the '*' is part of a declaration, where a binary operator does not make
    553  1.26  rillig  * sense.
    554  1.26  rillig  *
    555  1.26  rillig  * Essentially, as of 2021, indent had missed the last 31 years of advances in
    556  1.26  rillig  * the C programming language, in particular the invention of function
    557  1.26  rillig  * prototypes. Instead, the workaround had been to require all type names to
    558  1.26  rillig  * be specified via the options '-ta' and '-T'. This put the burden on the
    559  1.26  rillig  * user instead of the implementer.
    560  1.26  rillig  *
    561  1.26  rillig  * Fixed in lexi.c 1.156 from 2021-11-25.
    562  1.22  rillig  */
    563  1.35  rillig //indent input
    564  1.22  rillig void		buffer_add(buffer *, char);
    565  1.22  rillig void		buffer_add(buffer *buf, char ch);
    566  1.22  rillig 
    567  1.22  rillig void
    568  1.22  rillig buffer_add(buffer *buf, char ch)
    569  1.22  rillig {
    570  1.22  rillig 	*buf->e++ = ch;
    571  1.22  rillig }
    572  1.35  rillig //indent end
    573  1.22  rillig 
    574  1.50  rillig //indent run
    575  1.50  rillig void		buffer_add(buffer *, char);
    576  1.50  rillig // $ FIXME: There should be no space after the '*'.
    577  1.50  rillig void		buffer_add(buffer * buf, char ch);
    578  1.50  rillig 
    579  1.50  rillig void
    580  1.50  rillig buffer_add(buffer *buf, char ch)
    581  1.50  rillig {
    582  1.50  rillig 	*buf->e++ = ch;
    583  1.50  rillig }
    584  1.50  rillig //indent end
    585  1.23  rillig 
    586  1.23  rillig 
    587  1.23  rillig /*
    588  1.38  rillig  * Before lexi.c 1.153 from 2021-11-25, indent did not recognize 'Token' as a
    589  1.38  rillig  * type name and then messed up the positioning of the '{'.
    590  1.23  rillig  */
    591  1.35  rillig //indent input
    592  1.23  rillig static Token
    593  1.23  rillig ToToken(bool cond)
    594  1.23  rillig {
    595  1.23  rillig }
    596  1.35  rillig //indent end
    597  1.23  rillig 
    598  1.35  rillig //indent run-equals-input -TToken
    599  1.34  rillig 
    600  1.24  rillig /* Since lexi.c 1.153 from 2021-11-25. */
    601  1.35  rillig //indent run-equals-input
    602  1.23  rillig 
    603  1.23  rillig 
    604  1.23  rillig /*
    605  1.46  rillig  * Before indent.c 1.309 from 2023-05-23, indent easily got confused by unknown
    606  1.46  rillig  * type names in struct declarations, as a ';' did not finish a declaration.
    607  1.23  rillig  */
    608  1.35  rillig //indent input
    609  1.23  rillig typedef struct OpenDirs {
    610  1.23  rillig 	CachedDirList	list;
    611  1.23  rillig 	HashTable /* of CachedDirListNode */ table;
    612  1.23  rillig }		OpenDirs;
    613  1.35  rillig //indent end
    614  1.23  rillig 
    615  1.46  rillig //indent run-equals-input -THashTable
    616  1.23  rillig 
    617  1.46  rillig //indent run-equals-input
    618  1.23  rillig 
    619  1.23  rillig 
    620  1.23  rillig /*
    621  1.46  rillig  * Before lexi.c 1.153 from 2021-11-25, indent easily got confused by unknown
    622  1.46  rillig  * type names, even in declarations that are syntactically unambiguous.
    623  1.23  rillig  */
    624  1.35  rillig //indent input
    625  1.23  rillig static CachedDir *dot = NULL;
    626  1.35  rillig //indent end
    627  1.23  rillig 
    628  1.35  rillig //indent run-equals-input -TCachedDir
    629  1.34  rillig 
    630  1.35  rillig //indent run-equals-input
    631  1.23  rillig 
    632  1.23  rillig 
    633  1.23  rillig /*
    634  1.46  rillig  * Before lexi.c 1.153 from 2021-11-25, indent easily got confused by unknown
    635  1.46  rillig  * type names in declarations.
    636  1.23  rillig  */
    637  1.35  rillig //indent input
    638  1.23  rillig static CachedDir *
    639  1.23  rillig CachedDir_New(const char *name)
    640  1.23  rillig {
    641  1.23  rillig }
    642  1.35  rillig //indent end
    643  1.23  rillig 
    644  1.35  rillig //indent run-equals-input
    645  1.23  rillig 
    646  1.23  rillig 
    647  1.23  rillig /*
    648  1.26  rillig  * Before lexi.c 1.156 from 2021-11-25, indent easily got confused by unknown
    649  1.26  rillig  * type names in declarations and generated 'CachedDir * dir' with an extra
    650  1.26  rillig  * space.
    651  1.23  rillig  */
    652  1.35  rillig //indent input
    653  1.23  rillig static CachedDir *
    654  1.23  rillig CachedDir_Ref(CachedDir *dir)
    655  1.23  rillig {
    656  1.23  rillig }
    657  1.35  rillig //indent end
    658  1.23  rillig 
    659  1.35  rillig //indent run-equals-input
    660  1.23  rillig 
    661  1.23  rillig 
    662  1.23  rillig /*
    663  1.26  rillig  * Before lexi.c 1.156 from 2021-11-25, indent easily got confused by unknown
    664  1.26  rillig  * type names in declarations and generated 'HashEntry * he' with an extra
    665  1.26  rillig  * space.
    666  1.26  rillig  *
    667  1.26  rillig  * Before lexi.c 1.153 from 2021-11-25, indent also placed the '{' at the end
    668  1.26  rillig  * of the line.
    669  1.23  rillig  */
    670  1.35  rillig //indent input
    671  1.23  rillig static bool
    672  1.23  rillig HashEntry_KeyEquals(const HashEntry *he, Substring key)
    673  1.23  rillig {
    674  1.23  rillig }
    675  1.35  rillig //indent end
    676  1.23  rillig 
    677  1.35  rillig //indent run-equals-input
    678  1.23  rillig 
    679  1.23  rillig 
    680  1.23  rillig /*
    681  1.26  rillig  * Before lexi.c 1.156 from 2021-11-25, indent didn't notice that the two '*'
    682  1.26  rillig  * are in a declaration, instead it interpreted the first '*' as a binary
    683  1.26  rillig  * operator, therefore generating 'CachedDir * *var' with an extra space.
    684  1.23  rillig  */
    685  1.35  rillig //indent input
    686  1.23  rillig static void
    687  1.23  rillig CachedDir_Assign(CachedDir **var, CachedDir *dir)
    688  1.23  rillig {
    689  1.23  rillig }
    690  1.35  rillig //indent end
    691  1.23  rillig 
    692  1.46  rillig //indent run-equals-input -TCachedDir
    693  1.46  rillig 
    694  1.35  rillig //indent run-equals-input
    695  1.34  rillig 
    696  1.23  rillig 
    697  1.23  rillig /*
    698  1.24  rillig  * Before lexi.c 1.153 from 2021-11-25, all initializer expressions after the
    699  1.46  rillig  * first one were indented as if they were statement continuations. This was
    700  1.46  rillig  * caused by the token 'Shell' being identified as a word, not as a type name.
    701  1.23  rillig  */
    702  1.35  rillig //indent input
    703  1.24  rillig static Shell	shells[] = {
    704  1.23  rillig 	{
    705  1.23  rillig 		first,
    706  1.23  rillig 		second,
    707  1.23  rillig 	},
    708  1.23  rillig };
    709  1.35  rillig //indent end
    710  1.23  rillig 
    711  1.35  rillig //indent run-equals-input
    712  1.23  rillig 
    713  1.23  rillig 
    714  1.23  rillig /*
    715  1.27  rillig  * Before lexi.c 1.158 from 2021-11-25, indent easily got confused by function
    716  1.27  rillig  * attribute macros that followed the function declaration. Its primitive
    717  1.27  rillig  * heuristic between deciding between a function declaration and a function
    718  1.27  rillig  * definition only looked for ')' immediately followed by ',' or ';'. This was
    719  1.27  rillig  * sufficient for well-formatted code before 1990. With the addition of
    720  1.27  rillig  * function prototypes and GCC attributes, the situation became more
    721  1.27  rillig  * complicated, and it took indent 31 years to adapt to this new reality.
    722  1.23  rillig  */
    723  1.35  rillig //indent input
    724  1.23  rillig static void JobInterrupt(bool, int) MAKE_ATTR_DEAD;
    725  1.23  rillig static void JobRestartJobs(void);
    726  1.35  rillig //indent end
    727  1.23  rillig 
    728  1.35  rillig //indent run
    729  1.39  rillig static void	JobInterrupt(bool, int) MAKE_ATTR_DEAD;
    730  1.27  rillig static void	JobRestartJobs(void);
    731  1.35  rillig //indent end
    732  1.23  rillig 
    733  1.23  rillig 
    734  1.23  rillig /*
    735  1.27  rillig  * Before lexi.c 1.158 from 2021-11-25, indent easily got confused by the
    736  1.27  rillig  * tokens ')' and ';' in the function body. It wrongly regarded them as
    737  1.27  rillig  * finishing a function declaration.
    738  1.23  rillig  */
    739  1.35  rillig //indent input
    740  1.23  rillig MAKE_INLINE const char *
    741  1.23  rillig GNode_VarTarget(GNode *gn) { return GNode_ValueDirect(gn, TARGET); }
    742  1.35  rillig //indent end
    743  1.23  rillig 
    744  1.26  rillig /*
    745  1.26  rillig  * Before lexi.c 1.156 from 2021-11-25, indent generated 'GNode * gn' with an
    746  1.26  rillig  * extra space.
    747  1.27  rillig  *
    748  1.27  rillig  * Before lexi.c 1.158 from 2021-11-25, indent wrongly placed the function
    749  1.27  rillig  * name in line 1, together with the '{'.
    750  1.26  rillig  */
    751  1.35  rillig //indent run
    752  1.27  rillig MAKE_INLINE const char *
    753  1.27  rillig GNode_VarTarget(GNode *gn)
    754  1.27  rillig {
    755  1.23  rillig 	return GNode_ValueDirect(gn, TARGET);
    756  1.23  rillig }
    757  1.35  rillig //indent end
    758  1.23  rillig 
    759  1.35  rillig //indent run-equals-prev-output -TGNode
    760  1.25  rillig 
    761  1.25  rillig 
    762  1.25  rillig /*
    763  1.25  rillig  * Ensure that '*' in declarations is interpreted (or at least formatted) as
    764  1.25  rillig  * a 'pointer to' type derivation, not as a binary or unary operator.
    765  1.25  rillig  */
    766  1.35  rillig //indent input
    767  1.25  rillig number *var = a * b;
    768  1.25  rillig 
    769  1.25  rillig void
    770  1.25  rillig function(void)
    771  1.25  rillig {
    772  1.25  rillig 	number *var = a * b;
    773  1.25  rillig }
    774  1.35  rillig //indent end
    775  1.25  rillig 
    776  1.35  rillig //indent run-equals-input -di0
    777  1.28  rillig 
    778  1.28  rillig 
    779  1.28  rillig /*
    780  1.28  rillig  * In declarations, most occurrences of '*' are pointer type derivations.
    781  1.29  rillig  * There are a few exceptions though. Some of these are hard to detect
    782  1.29  rillig  * without knowing which identifiers are type names.
    783  1.28  rillig  */
    784  1.35  rillig //indent input
    785  1.28  rillig char str[expr * expr];
    786  1.28  rillig char str[expr**ptr];
    787  1.28  rillig char str[*ptr**ptr];
    788  1.28  rillig char str[sizeof(expr * expr)];
    789  1.28  rillig char str[sizeof(int) * expr];
    790  1.28  rillig char str[sizeof(*ptr)];
    791  1.28  rillig char str[sizeof(type**)];
    792  1.28  rillig char str[sizeof(**ptr)];
    793  1.35  rillig //indent end
    794  1.28  rillig 
    795  1.35  rillig //indent run -di0
    796  1.29  rillig char str[expr * expr];
    797  1.29  rillig char str[expr * *ptr];
    798  1.29  rillig char str[*ptr * *ptr];
    799  1.29  rillig char str[sizeof(expr * expr)];
    800  1.29  rillig char str[sizeof(int) * expr];
    801  1.28  rillig char str[sizeof(*ptr)];
    802  1.50  rillig char str[sizeof(type **)];
    803  1.28  rillig char str[sizeof(**ptr)];
    804  1.35  rillig //indent end
    805  1.31  rillig 
    806  1.31  rillig 
    807  1.31  rillig /*
    808  1.32  rillig  * Since lexi.c 1.158 from 2021-11-25, whether the function 'a' was considered
    809  1.32  rillig  * a declaration or a definition depended on the preceding struct, in
    810  1.32  rillig  * particular the length of the 'pn' line. This didn't make sense at all and
    811  1.32  rillig  * was due to an out-of-bounds memory access.
    812  1.31  rillig  *
    813  1.31  rillig  * Seen amongst others in args.c 1.72, function add_typedefs_from_file.
    814  1.32  rillig  * Fixed in lexi.c 1.165 from 2021-11-27.
    815  1.31  rillig  */
    816  1.35  rillig //indent input
    817  1.31  rillig struct {
    818  1.31  rillig } v = {
    819  1.31  rillig     pn("ta"),
    820  1.31  rillig };
    821  1.31  rillig 
    822  1.31  rillig static void
    823  1.31  rillig a(char *fe)
    824  1.31  rillig {
    825  1.31  rillig }
    826  1.31  rillig 
    827  1.31  rillig struct {
    828  1.31  rillig } v = {
    829  1.31  rillig     pn("t"),
    830  1.31  rillig };
    831  1.31  rillig 
    832  1.31  rillig static void
    833  1.31  rillig a(char *fe)
    834  1.31  rillig {
    835  1.31  rillig }
    836  1.35  rillig //indent end
    837  1.31  rillig 
    838  1.35  rillig //indent run -di0
    839  1.31  rillig struct {
    840  1.31  rillig } v = {
    841  1.31  rillig 	pn("ta"),
    842  1.31  rillig };
    843  1.31  rillig 
    844  1.31  rillig static void
    845  1.32  rillig a(char *fe)
    846  1.32  rillig {
    847  1.31  rillig }
    848  1.31  rillig 
    849  1.31  rillig struct {
    850  1.31  rillig } v = {
    851  1.31  rillig 	pn("t"),
    852  1.31  rillig };
    853  1.31  rillig 
    854  1.31  rillig static void
    855  1.31  rillig a(char *fe)
    856  1.31  rillig {
    857  1.31  rillig }
    858  1.35  rillig //indent end
    859  1.36  rillig 
    860  1.36  rillig 
    861  1.36  rillig /*
    862  1.36  rillig  * Before NetBSD indent.c 1.178 from 2021-10-29, indent removed the blank
    863  1.36  rillig  * before the '=', in the second and third of these function pointer
    864  1.36  rillig  * declarations. This was because indent interpreted the prototype parameters
    865  1.36  rillig  * 'int' and 'int, int' as type casts, which doesn't make sense at all. Fixing
    866  1.36  rillig  * this properly requires large style changes since indent is based on simple
    867  1.36  rillig  * heuristics all over. This didn't change in indent.c 1.178; instead, the
    868  1.36  rillig  * rule for inserting a blank before a binary operator was changed to always
    869  1.36  rillig  * insert a blank, except at the beginning of a line.
    870  1.36  rillig  */
    871  1.36  rillig //indent input
    872  1.36  rillig char *(*fn)() = NULL;
    873  1.36  rillig char *(*fn)(int) = NULL;
    874  1.36  rillig char *(*fn)(int, int) = NULL;
    875  1.36  rillig //indent end
    876  1.36  rillig 
    877  1.36  rillig /* XXX: The parameter '(int)' is wrongly interpreted as a type cast. */
    878  1.36  rillig /* XXX: The parameter '(int, int)' is wrongly interpreted as a type cast. */
    879  1.36  rillig //indent run-equals-input -di0
    880  1.40  rillig 
    881  1.40  rillig 
    882  1.40  rillig /*
    883  1.41  rillig  * Depending on whether there was a line break in the function header, the
    884  1.41  rillig  * spaces around the '||' operator were erroneously removed.
    885  1.40  rillig  */
    886  1.40  rillig //indent input
    887  1.40  rillig bool is_identifier_start(char ch)
    888  1.40  rillig {
    889  1.40  rillig 	return ch_isalpha(ch) || ch == '_';
    890  1.40  rillig }
    891  1.40  rillig 
    892  1.40  rillig bool
    893  1.40  rillig is_identifier_start(char ch)
    894  1.40  rillig {
    895  1.40  rillig 	return ch_isalpha(ch) || ch == '_';
    896  1.40  rillig }
    897  1.40  rillig //indent end
    898  1.40  rillig 
    899  1.40  rillig //indent run
    900  1.40  rillig bool
    901  1.40  rillig is_identifier_start(char ch)
    902  1.40  rillig {
    903  1.40  rillig 	return ch_isalpha(ch) || ch == '_';
    904  1.40  rillig }
    905  1.40  rillig 
    906  1.40  rillig bool
    907  1.40  rillig is_identifier_start(char ch)
    908  1.40  rillig {
    909  1.41  rillig 	return ch_isalpha(ch) || ch == '_';
    910  1.40  rillig }
    911  1.40  rillig //indent end
    912  1.42  rillig 
    913  1.42  rillig 
    914  1.42  rillig //indent input
    915  1.42  rillig void buf_add_chars(struct buffer *, const char *, size_t);
    916  1.42  rillig 
    917  1.42  rillig static inline bool
    918  1.42  rillig ch_isalnum(char ch)
    919  1.42  rillig {
    920  1.42  rillig     return isalnum((unsigned char)ch) != 0;
    921  1.42  rillig }
    922  1.42  rillig 
    923  1.42  rillig static inline bool
    924  1.42  rillig ch_isalpha(char ch)
    925  1.42  rillig {
    926  1.42  rillig     return isalpha((unsigned char)ch) != 0;
    927  1.42  rillig }
    928  1.42  rillig //indent end
    929  1.42  rillig 
    930  1.42  rillig //indent run -i4 -di0
    931  1.42  rillig // $ FIXME: 'buffer' is classified as 'word'.
    932  1.42  rillig // $
    933  1.48  rillig // $ XXX: 'char' is classified as 'type_in_parentheses'; check whether
    934  1.48  rillig // $ XXX: lsym_type_in_parentheses should only be used for types in cast
    935  1.48  rillig // $ XXX: expressions.
    936  1.42  rillig // $
    937  1.42  rillig // $ FIXME: 'size_t' is classified as 'word'.
    938  1.42  rillig void buf_add_chars(struct buffer *, const char *, size_t);
    939  1.42  rillig 
    940  1.42  rillig static inline bool
    941  1.42  rillig ch_isalnum(char ch)
    942  1.42  rillig {
    943  1.42  rillig     return isalnum((unsigned char)ch) != 0;
    944  1.42  rillig }
    945  1.42  rillig 
    946  1.42  rillig static inline bool
    947  1.42  rillig ch_isalpha(char ch)
    948  1.42  rillig {
    949  1.42  rillig     return isalpha((unsigned char)ch) != 0;
    950  1.42  rillig }
    951  1.42  rillig //indent end
    952  1.42  rillig 
    953  1.42  rillig //indent run-equals-input -i4 -di0
    954  1.44  rillig 
    955  1.44  rillig 
    956  1.44  rillig //indent input
    957  1.44  rillig void __printflike(1, 2)
    958  1.44  rillig debug_printf(const char *fmt, ...)
    959  1.44  rillig {
    960  1.44  rillig }
    961  1.44  rillig //indent end
    962  1.44  rillig 
    963  1.44  rillig //indent run
    964  1.44  rillig void
    965  1.44  rillig // $ FIXME: No line break here.
    966  1.44  rillig __printflike(1, 2)
    967  1.44  rillig debug_printf(const char *fmt, ...)
    968  1.44  rillig {
    969  1.44  rillig }
    970  1.44  rillig //indent end
    971  1.44  rillig 
    972  1.44  rillig 
    973  1.44  rillig //indent input
    974  1.44  rillig void
    975  1.44  rillig (error_at)(int msgid, const pos_t *pos, ...)
    976  1.44  rillig {
    977  1.44  rillig }
    978  1.44  rillig //indent end
    979  1.44  rillig 
    980  1.44  rillig //indent run -ci4 -di0 -ndj -nlp
    981  1.44  rillig void
    982  1.44  rillig // $ FIXME: Wrong indentation, should be 0 instead.
    983  1.50  rillig // $ FIXME: There should be no space after the '*'.
    984  1.50  rillig      (error_at)(int msgid, const pos_t * pos, ...)
    985  1.44  rillig {
    986  1.44  rillig }
    987  1.44  rillig //indent end
    988  1.49  rillig 
    989  1.49  rillig 
    990  1.49  rillig //indent input
    991  1.49  rillig struct a {
    992  1.49  rillig 	struct b {
    993  1.49  rillig 		struct c {
    994  1.49  rillig 			struct d1 {
    995  1.49  rillig 				int e;
    996  1.49  rillig 			} d1;
    997  1.49  rillig 			struct d2 {
    998  1.49  rillig 				int e;
    999  1.49  rillig 			} d2;
   1000  1.49  rillig 		} c;
   1001  1.49  rillig 	} b;
   1002  1.49  rillig };
   1003  1.49  rillig //indent end
   1004  1.49  rillig 
   1005  1.49  rillig //indent run-equals-input -di0
   1006  1.51  rillig 
   1007  1.51  rillig 
   1008  1.51  rillig //indent input
   1009  1.51  rillig static FILE *ArchFindMember(const char *, const char *,
   1010  1.51  rillig 			    struct ar_hdr *, const char *);
   1011  1.51  rillig 
   1012  1.51  rillig bool
   1013  1.51  rillig Job_CheckCommands(GNode *gn, void (*abortProc)(const char *, ...))
   1014  1.51  rillig {
   1015  1.51  rillig }
   1016  1.51  rillig 
   1017  1.51  rillig static void MAKE_ATTR_PRINTFLIKE(5, 0)
   1018  1.51  rillig ParseVErrorInternal(FILE *f, bool useVars, const GNode *gn,
   1019  1.51  rillig 		    ParseErrorLevel level, const char *fmt, va_list ap)
   1020  1.51  rillig {
   1021  1.51  rillig }
   1022  1.51  rillig 
   1023  1.51  rillig typedef struct {
   1024  1.51  rillig 	const char *m_name;
   1025  1.51  rillig } mod_t;
   1026  1.51  rillig //indent end
   1027  1.51  rillig 
   1028  1.51  rillig //indent run -fbs -di0 -psl
   1029  1.52  rillig // $ Must be detected as a function declaration, not a definition.
   1030  1.52  rillig static FILE *ArchFindMember(const char *, const char *,
   1031  1.52  rillig 			    struct ar_hdr *, const char *);
   1032  1.51  rillig 
   1033  1.51  rillig bool
   1034  1.51  rillig Job_CheckCommands(GNode *gn, void (*abortProc)(const char *, ...))
   1035  1.51  rillig {
   1036  1.51  rillig }
   1037  1.51  rillig 
   1038  1.51  rillig static void
   1039  1.51  rillig MAKE_ATTR_PRINTFLIKE(5, 0)
   1040  1.51  rillig ParseVErrorInternal(FILE *f, bool useVars, const GNode *gn,
   1041  1.51  rillig 		    ParseErrorLevel level, const char *fmt, va_list ap)
   1042  1.51  rillig {
   1043  1.51  rillig }
   1044  1.51  rillig 
   1045  1.51  rillig typedef struct {
   1046  1.51  rillig 	const char *m_name;
   1047  1.51  rillig }
   1048  1.51  rillig // $ FIXME: Remove this line break.
   1049  1.51  rillig mod_t;
   1050  1.51  rillig //indent end
   1051  1.53  rillig 
   1052  1.53  rillig 
   1053  1.53  rillig //indent input
   1054  1.53  rillig int a[] = {1, 2},
   1055  1.53  rillig b[] = {1, 2};
   1056  1.53  rillig {
   1057  1.53  rillig int a[] = {1, 2},
   1058  1.53  rillig b[] = {1, 2};
   1059  1.53  rillig }
   1060  1.53  rillig //indent end
   1061  1.53  rillig 
   1062  1.53  rillig //indent run -di0
   1063  1.53  rillig int a[] = {1, 2},
   1064  1.53  rillig // $ FIXME: Missing indentation.
   1065  1.53  rillig b[] = {1, 2};
   1066  1.53  rillig {
   1067  1.53  rillig 	int a[] = {1, 2},
   1068  1.53  rillig 	// $ FIXME: Missing indentation.
   1069  1.53  rillig 	b[] = {1, 2};
   1070  1.53  rillig }
   1071  1.53  rillig //indent end
   1072  1.54  rillig 
   1073  1.54  rillig 
   1074  1.54  rillig /*
   1075  1.54  rillig  * When a type occurs at the top level, it forces a line break before.
   1076  1.54  rillig  */
   1077  1.54  rillig //indent input
   1078  1.54  rillig __attribute__((__dead__)) void die(void) {}
   1079  1.54  rillig //indent end
   1080  1.54  rillig 
   1081  1.54  rillig //indent run
   1082  1.54  rillig __attribute__((__dead__))
   1083  1.54  rillig void
   1084  1.54  rillig die(void)
   1085  1.54  rillig {
   1086  1.54  rillig }
   1087  1.54  rillig //indent end
   1088  1.55  rillig 
   1089  1.55  rillig 
   1090  1.55  rillig /*
   1091  1.55  rillig  * In very rare cases, the type of a declarator might include literal tab
   1092  1.55  rillig  * characters. This tab might affect the indentation of the declarator, but
   1093  1.55  rillig  * only if it occurs before the declarator, and that is hard to achieve.
   1094  1.55  rillig  */
   1095  1.55  rillig //indent input
   1096  1.55  rillig int		arr[sizeof "	"];
   1097  1.55  rillig //indent end
   1098  1.55  rillig 
   1099  1.55  rillig //indent run-equals-input
   1100  1.55  rillig 
   1101  1.55  rillig 
   1102  1.55  rillig /*
   1103  1.55  rillig  * The '}' of an initializer is not supposed to end the statement, it only ends
   1104  1.55  rillig  * the brace level of the initializer expression.
   1105  1.55  rillig  */
   1106  1.55  rillig //indent input
   1107  1.55  rillig int multi_line[1][1][1] = {
   1108  1.55  rillig {
   1109  1.55  rillig {
   1110  1.55  rillig 1
   1111  1.55  rillig },
   1112  1.55  rillig },
   1113  1.55  rillig };
   1114  1.55  rillig int single_line[2][1][1] = {{{1},},{{2}}};
   1115  1.55  rillig //indent end
   1116  1.55  rillig 
   1117  1.55  rillig //indent run -di0
   1118  1.55  rillig int multi_line[1][1][1] = {
   1119  1.55  rillig 	{
   1120  1.55  rillig 		{
   1121  1.55  rillig 			1
   1122  1.55  rillig 		},
   1123  1.55  rillig 	},
   1124  1.55  rillig };
   1125  1.55  rillig int single_line[2][1][1] = {{{1},}, {{2}}};
   1126  1.55  rillig //indent end
   1127  1.55  rillig 
   1128  1.55  rillig 
   1129  1.55  rillig /*
   1130  1.55  rillig  * The '}' of an initializer is not supposed to end the statement, it only ends
   1131  1.55  rillig  * the brace level of the initializer expression.
   1132  1.55  rillig  */
   1133  1.55  rillig //indent input
   1134  1.55  rillig {
   1135  1.55  rillig int multi_line = {
   1136  1.55  rillig {
   1137  1.55  rillig {
   1138  1.55  rillig b
   1139  1.55  rillig },
   1140  1.55  rillig },
   1141  1.55  rillig };
   1142  1.55  rillig int single_line = {{{b},},{}};
   1143  1.55  rillig }
   1144  1.55  rillig //indent end
   1145  1.55  rillig 
   1146  1.55  rillig //indent run -di0
   1147  1.55  rillig {
   1148  1.55  rillig 	int multi_line = {
   1149  1.55  rillig 		{
   1150  1.55  rillig 			{
   1151  1.55  rillig 				b
   1152  1.55  rillig 			},
   1153  1.55  rillig 		},
   1154  1.55  rillig 	};
   1155  1.55  rillig 	int single_line = {{{b},}, {}};
   1156  1.55  rillig }
   1157  1.55  rillig //indent end
   1158  1.55  rillig 
   1159  1.55  rillig 
   1160  1.55  rillig /*
   1161  1.55  rillig  * In initializers, multi-line expressions don't have their second line
   1162  1.55  rillig  * indented, even though they should.
   1163  1.55  rillig  */
   1164  1.55  rillig //indent input
   1165  1.55  rillig {
   1166  1.55  rillig multi_line = (int[]){
   1167  1.55  rillig {1
   1168  1.55  rillig +1},
   1169  1.55  rillig {1
   1170  1.55  rillig +1},
   1171  1.55  rillig {1
   1172  1.55  rillig +1},
   1173  1.55  rillig };
   1174  1.55  rillig }
   1175  1.55  rillig //indent end
   1176  1.55  rillig 
   1177  1.55  rillig //indent run
   1178  1.55  rillig {
   1179  1.55  rillig 	multi_line = (int[]){
   1180  1.55  rillig 		{1
   1181  1.55  rillig 		+ 1},
   1182  1.55  rillig 		{1
   1183  1.55  rillig 		+ 1},
   1184  1.55  rillig 		{1
   1185  1.55  rillig 		+ 1},
   1186  1.55  rillig 	};
   1187  1.55  rillig }
   1188  1.55  rillig //indent end
   1189