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