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