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