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