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