1 /* $NetBSD: lsym_lbrace.c,v 1.10 2023/06/16 23:19:01 rillig Exp $ */ 2 3 /* 4 * Tests for the token lsym_lbrace, which represents a '{' in these contexts: 5 * 6 * In an initializer, '{' starts an inner group of initializers, usually to 7 * initialize a nested struct, union or array. 8 * 9 * In a function body, '{' starts a block. 10 * 11 * In an expression, '(type){' starts a compound literal that is typically 12 * used in an assignment to a struct or array. 13 * 14 * In macro arguments, a '{' is an ordinary character, it does not need to be 15 * balanced. This is in contrast to '(', which must be balanced with ')'. 16 * 17 * TODO: try to split this token into lsym_lbrace_block and lsym_lbrace_init. 18 */ 19 20 /* Brace level in an initializer */ 21 //indent input 22 void 23 function(void) 24 { 25 struct person p = { 26 .name = "Name", 27 .age = {{{35}}}, /* C11 6.7.9 allows this. */ 28 }; 29 } 30 //indent end 31 32 //indent run-equals-input 33 34 35 /* Begin of a block of statements */ 36 //indent input 37 void function(void) {{{ body(); }}} 38 //indent end 39 40 //indent run 41 void 42 function(void) 43 { 44 { 45 { 46 body(); 47 } 48 } 49 } 50 //indent end 51 52 53 /* Compound literal */ 54 //indent input 55 struct point 56 origin(void) 57 { 58 return (struct point){ 59 .x = 0, 60 .y = 0, 61 }, actual_return_value; 62 } 63 //indent end 64 65 //indent run-equals-input 66 67 /* Ensure that the comma is not interpreted as separator for declarators. */ 68 //indent run-equals-input -bc 69 70 71 //indent input 72 { 73 const char *hello = (const char[]){ 74 'h', 'e', 'l', 'l', 'o', 75 }, *world = (const char[]){ 76 'w', 'o', 'r', 'l', 'd', 77 }; 78 } 79 //indent end 80 81 //indent run-equals-input -ldi0 82 83 //indent run-equals-input -ldi0 -bc 84 85 86 //indent input 87 { 88 if (cond rparen { 89 } 90 switch (expr rparen { 91 } 92 } 93 //indent end 94 95 //indent run 96 { 97 if (cond rparen { 98 } 99 switch (expr rparen { 100 } 101 } 102 // exit 1 103 // error: Standard Input:2: Unbalanced parentheses 104 // error: Standard Input:4: Unbalanced parentheses 105 //indent end 106 107 108 /* 109 * The -bl option does not force initializer braces on separate lines. 110 */ 111 //indent input 112 struct {int member;} var = {1}; 113 //indent end 114 115 //indent run -bl 116 struct 117 { 118 int member; 119 } var = {1}; 120 //indent end 121 122 123 /* 124 * A comment in a single-line function definition is not a declaration comment 125 * and thus not in column 25. 126 */ 127 //indent input 128 void function(void); /* comment */ 129 void function(void) { /* comment */ } 130 //indent end 131 132 //indent run -di0 133 void function(void); /* comment */ 134 void 135 function(void) 136 { /* comment */ 137 } 138 //indent end 139 140 //indent run -di0 -nfbs 141 void function(void); /* comment */ 142 void 143 function(void) { /* comment */ 144 } 145 //indent end 146