lsym_case_label.c revision 1.6
11.6Srillig/* $NetBSD: lsym_case_label.c,v 1.6 2022/04/24 09:04:12 rillig Exp $ */ 21.1Srillig 31.1Srillig/* 41.1Srillig * Tests for the token lsym_case_label, which represents either the keyword 51.1Srillig * 'case' or the keyword 'default', which are both used in 'switch' 61.1Srillig * statements. 71.1Srillig * 81.1Srillig * Since C11, the keyword 'default' is used in _Generic selections as well. 91.1Srillig * 101.1Srillig * See also: 111.2Srillig * opt_cli.c 121.1Srillig * psym_switch_expr.c 131.1Srillig * C11 6.5.1.1 "Generic selection" 141.1Srillig */ 151.1Srillig 161.4Srillig/* 171.4Srillig * A case label can be used in a 'switch' statement. 181.4Srillig */ 191.6Srillig//indent input 201.4Srilligvoid function(void){switch(expr){case 1:;case 2:break;default:switch(inner){case 4:break;}}} 211.6Srillig//indent end 221.1Srillig 231.6Srillig//indent run 241.4Srilligvoid 251.4Srilligfunction(void) 261.4Srillig{ 271.4Srillig switch (expr) { 281.4Srillig case 1: ; 291.4Srillig case 2: 301.4Srillig break; 311.4Srillig default: 321.4Srillig switch (inner) { 331.4Srillig case 4: 341.4Srillig break; 351.4Srillig } 361.4Srillig } 371.4Srillig} 381.6Srillig//indent end 391.3Srillig 401.3Srillig 411.3Srillig/* 421.3Srillig * If there is a '{' after a case label, it gets indented using tabs instead 431.3Srillig * of spaces. Indent does not necessarily insert a space in this situation, 441.3Srillig * which looks strange. 451.3Srillig */ 461.6Srillig//indent input 471.3Srilligvoid 481.3Srilligfunction(void) 491.3Srillig{ 501.3Srillig switch (expr) { 511.3Srillig case 1: { 521.3Srillig break; 531.3Srillig } 541.3Srillig case 11: { 551.3Srillig break; 561.3Srillig } 571.3Srillig } 581.3Srillig} 591.6Srillig//indent end 601.3Srillig 611.6Srillig//indent run 621.3Srilligvoid 631.3Srilligfunction(void) 641.3Srillig{ 651.3Srillig switch (expr) { 661.3Srillig /* $ The space between the ':' and the '{' is actually a tab. */ 671.3Srillig case 1: { 681.3Srillig break; 691.3Srillig } 701.3Srillig /* $ FIXME: missing space between ':' and '{'. */ 711.3Srillig case 11:{ 721.3Srillig break; 731.3Srillig } 741.3Srillig } 751.3Srillig} 761.6Srillig//indent end 771.4Srillig 781.4Srillig 791.4Srillig/* 801.4Srillig * Since C11, the _Generic selection expression allows a switch on the data 811.4Srillig * type of an expression. 821.4Srillig */ 831.6Srillig//indent input 841.4Srilligconst char *type_name = _Generic( 851.4Srillig ' ', 861.4Srillig int: "character constants have type 'int'", 871.4Srillig char: "character constants have type 'char'", 881.4Srillig default: "character constants have some other type" 891.4Srillig); 901.6Srillig//indent end 911.4Srillig 921.6Srillig//indent run -di0 931.4Srilligconst char *type_name = _Generic( 941.4Srillig// $ XXX: It's strange to align the arguments at the parenthesis even though 951.4Srillig// $ XXX: the first argument is already on a separate line. 961.4Srillig ' ', 971.4Srillig// $ TODO: indent the type names 981.4Srilligint: "character constants have type 'int'", 991.4Srilligchar: "character constants have type 'char'", 1001.4Srilligdefault: 1011.4Srillig// $ TODO: remove the newline after 'default:' 1021.4Srillig "character constants have some other type" 1031.4Srillig); 1041.6Srillig//indent end 1051.4Srillig 1061.6Srillig//indent run -di0 -nlp 1071.4Srilligconst char *type_name = _Generic( 1081.4Srillig ' ', 1091.4Srillig// $ TODO: indent the type names 1101.4Srilligint: "character constants have type 'int'", 1111.4Srilligchar: "character constants have type 'char'", 1121.4Srilligdefault: 1131.4Srillig "character constants have some other type" 1141.4Srillig); 1151.6Srillig//indent end 116