/* $NetBSD: lsym_case_label.c,v 1.11 2023/06/15 09:19:07 rillig Exp $ */ /* * Tests for the tokens lsym_case and lsym_default, which represent the * keywords 'case' and 'default', which are both used in 'switch' statements. * * Since C11, the keyword 'default' is used in _Generic selections as well. * * See also: * opt_cli.c * psym_switch_expr.c * C11 6.5.1.1 "Generic selection" */ /* * A case label can be used in a 'switch' statement. */ //indent input void function(void){switch(expr){case 1:;case 2:break;default:switch(inner){case 4:break;}}} //indent end //indent run void function(void) { switch (expr) { case 1: ; case 2: break; default: switch (inner) { case 4: break; } } } //indent end /* * If there is a '{' after a case label, it gets indented using tabs instead * of spaces. Indent does not necessarily insert a space in this situation, * which looks strange. */ //indent input void function(void) { switch (expr) { case 1: { break; } case 11: { break; } } } //indent end //indent run void function(void) { switch (expr) { /* $ The space between the ':' and the '{' is actually a tab. */ case 1: { break; } case 11: { break; } } } //indent end /* * Since C11, the _Generic selection expression allows a switch on the data * type of an expression. */ //indent input const char *type_name = _Generic( ' ', int: "character constants have type 'int'", char: "character constants have type 'char'", default: "character constants have some other type" ); //indent end //indent run -di0 const char *type_name = _Generic( // $ XXX: It's strange to align the arguments at the parenthesis even though // $ XXX: the first argument is already on a separate line. ' ', // $ The indentation is so large that the strings would spill over the right // $ margin. To prevent that, the code is right-aligned. Since the base // $ indentation of this declaration is 0, the code might even start at the // $ beginning of the line. int: "character constants have type 'int'", char: "character constants have type 'char'", default: "character constants have some other type" ); //indent end //indent run-equals-input -di0 -nlp /* * Multi-line case expressions are rare but still should be processed in a * sensible way. */ //indent input { switch (expr) { // $ FIXME: The line containing the 'case' must be indented like a 'case'. case 1 + 2 // $ FIXME: This continuation line must be indented by 4 columns. + 3: stmt; } } //indent end //indent run-equals-input -ci4