Home | History | Annotate | Line # | Download | only in indent
lsym_colon.c revision 1.3
      1  1.3  rillig /* $NetBSD: lsym_colon.c,v 1.3 2021/11/28 16:05:59 rillig Exp $ */
      2  1.1  rillig /* $FreeBSD$ */
      3  1.1  rillig 
      4  1.1  rillig /*
      5  1.1  rillig  * Tests for the token lsym_colon, which represents a ':' in these contexts:
      6  1.1  rillig  *
      7  1.1  rillig  * After a label that is the target of a 'goto' statement.
      8  1.1  rillig  *
      9  1.1  rillig  * In a 'switch' statement, after a 'case' label or a 'default' label.
     10  1.1  rillig  *
     11  1.1  rillig  * As part of the conditional operator '?:'.
     12  1.1  rillig  *
     13  1.1  rillig  * In the declaration of a struct member that is a bit-field.
     14  1.2  rillig  *
     15  1.3  rillig  * Since C11, in the _Generic selection to separate the type from its
     16  1.3  rillig  * corresponding expression.
     17  1.3  rillig  *
     18  1.2  rillig  * See also:
     19  1.2  rillig  *	label.c
     20  1.3  rillig  *	lsym_case_label.c	for the C11 _Generic expression
     21  1.2  rillig  *	lsym_question.c
     22  1.1  rillig  */
     23  1.1  rillig 
     24  1.2  rillig /*
     25  1.2  rillig  * The ':' marks a label that can be used in a 'goto' statement.
     26  1.2  rillig  */
     27  1.1  rillig #indent input
     28  1.2  rillig void endless(void)
     29  1.2  rillig {
     30  1.2  rillig label1:
     31  1.2  rillig goto label2;
     32  1.2  rillig 
     33  1.2  rillig     if (true)if (true)if (true)if (true)label2 :goto label1;
     34  1.2  rillig }
     35  1.2  rillig #indent end
     36  1.2  rillig 
     37  1.2  rillig #indent run
     38  1.2  rillig void
     39  1.2  rillig endless(void)
     40  1.2  rillig {
     41  1.2  rillig label1:
     42  1.2  rillig 	goto label2;
     43  1.2  rillig 
     44  1.2  rillig 	if (true)
     45  1.2  rillig 		if (true)
     46  1.2  rillig 			if (true)
     47  1.2  rillig 				if (true)
     48  1.2  rillig 			label2:		goto label1;
     49  1.2  rillig }
     50  1.2  rillig #indent end
     51  1.2  rillig 
     52  1.2  rillig 
     53  1.2  rillig /*
     54  1.2  rillig  * The ':' is used in a 'switch' statement, after a 'case' label or a
     55  1.2  rillig  * 'default' label.
     56  1.2  rillig  */
     57  1.2  rillig #indent input
     58  1.2  rillig void
     59  1.2  rillig example(void)
     60  1.2  rillig {
     61  1.2  rillig 	switch (expr) {
     62  1.2  rillig 	case 'x':
     63  1.2  rillig 		return;
     64  1.2  rillig 	default:
     65  1.2  rillig 		return;
     66  1.2  rillig 	}
     67  1.2  rillig }
     68  1.1  rillig #indent end
     69  1.1  rillig 
     70  1.1  rillig #indent run-equals-input
     71  1.2  rillig 
     72  1.2  rillig 
     73  1.2  rillig /*
     74  1.2  rillig  * The ':' is used as part of the conditional operator '?:'.
     75  1.2  rillig  */
     76  1.2  rillig #indent input
     77  1.2  rillig int constant_expression = true?4:12345;
     78  1.2  rillig #indent end
     79  1.2  rillig 
     80  1.2  rillig #indent run
     81  1.2  rillig int		constant_expression = true ? 4 : 12345;
     82  1.2  rillig #indent end
     83  1.2  rillig 
     84  1.2  rillig 
     85  1.2  rillig /*
     86  1.2  rillig  * The ':' is used in the declaration of a struct member that is a bit-field.
     87  1.2  rillig  */
     88  1.2  rillig #indent input
     89  1.2  rillig struct bit_field {
     90  1.2  rillig 	bool flag:1;
     91  1.2  rillig 	int maybe_signed : 4;
     92  1.2  rillig 	signed int definitely_signed:3;
     93  1.2  rillig 	signed int : 0;/* padding */
     94  1.2  rillig 	unsigned int definitely_unsigned:3;
     95  1.2  rillig 	unsigned int:0;/* padding */
     96  1.2  rillig };
     97  1.2  rillig #indent end
     98  1.2  rillig 
     99  1.2  rillig #indent run
    100  1.2  rillig struct bit_field {
    101  1.2  rillig 	bool		flag:1;
    102  1.2  rillig 	int		maybe_signed:4;
    103  1.2  rillig 	signed int	definitely_signed:3;
    104  1.2  rillig /* $ XXX: Placing the colon directly at the type looks inconsistent. */
    105  1.2  rillig 	signed int:	0;	/* padding */
    106  1.2  rillig 	unsigned int	definitely_unsigned:3;
    107  1.2  rillig /* $ XXX: Placing the colon directly at the type looks inconsistent. */
    108  1.2  rillig 	unsigned int:	0;	/* padding */
    109  1.2  rillig };
    110  1.2  rillig #indent end
    111