1/* $NetBSD: lsym_case_label.c,v 1.11 2023/06/15 09:19:07 rillig Exp $ */ 2 3/* 4 * Tests for the tokens lsym_case and lsym_default, which represent the 5 * keywords 'case' and 'default', which are both used in 'switch' statements. 6 * 7 * Since C11, the keyword 'default' is used in _Generic selections as well. 8 * 9 * See also: 10 * opt_cli.c 11 * psym_switch_expr.c 12 * C11 6.5.1.1 "Generic selection" 13 */ 14 15/* 16 * A case label can be used in a 'switch' statement. 17 */ 18//indent input 19void function(void){switch(expr){case 1:;case 2:break;default:switch(inner){case 4:break;}}} 20//indent end 21 22//indent run 23void 24function(void) 25{ 26 switch (expr) { 27 case 1: ; 28 case 2: 29 break; 30 default: 31 switch (inner) { 32 case 4: 33 break; 34 } 35 } 36} 37//indent end 38 39 40/* 41 * If there is a '{' after a case label, it gets indented using tabs instead 42 * of spaces. Indent does not necessarily insert a space in this situation, 43 * which looks strange. 44 */ 45//indent input 46void 47function(void) 48{ 49 switch (expr) { 50 case 1: { 51 break; 52 } 53 case 11: { 54 break; 55 } 56 } 57} 58//indent end 59 60//indent run 61void 62function(void) 63{ 64 switch (expr) { 65 /* $ The space between the ':' and the '{' is actually a tab. */ 66 case 1: { 67 break; 68 } 69 case 11: { 70 break; 71 } 72 } 73} 74//indent end 75 76 77/* 78 * Since C11, the _Generic selection expression allows a switch on the data 79 * type of an expression. 80 */ 81//indent input 82const char *type_name = _Generic( 83 ' ', 84 int: "character constants have type 'int'", 85 char: "character constants have type 'char'", 86 default: "character constants have some other type" 87); 88//indent end 89 90//indent run -di0 91const char *type_name = _Generic( 92// $ XXX: It's strange to align the arguments at the parenthesis even though 93// $ XXX: the first argument is already on a separate line. 94 ' ', 95// $ The indentation is so large that the strings would spill over the right 96// $ margin. To prevent that, the code is right-aligned. Since the base 97// $ indentation of this declaration is 0, the code might even start at the 98// $ beginning of the line. 99 int: "character constants have type 'int'", 100 char: "character constants have type 'char'", 101 default: "character constants have some other type" 102); 103//indent end 104 105//indent run-equals-input -di0 -nlp 106 107 108/* 109 * Multi-line case expressions are rare but still should be processed in a 110 * sensible way. 111 */ 112//indent input 113{ 114 switch (expr) { 115// $ FIXME: The line containing the 'case' must be indented like a 'case'. 116 case 1 117 + 2 118// $ FIXME: This continuation line must be indented by 4 columns. 119 + 3: 120 stmt; 121 } 122} 123//indent end 124 125//indent run-equals-input -ci4 126