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