1 /* $NetBSD: init_braces.c,v 1.9 2023/07/21 06:02:07 rillig Exp $ */ 2 # 3 "init_braces.c" 3 4 /* 5 * Test initialization with excess braces around expressions. 6 * 7 * See also: 8 * C99 6.7.8 9 * C11 6.7.9 10 */ 11 12 /* lint1-extra-flags: -X 351 */ 13 14 void 15 init_int(void) 16 { 17 /* gcc-expect+4: error: invalid initializer */ 18 /* clang-expect+3: error: array initializer must be an initializer list */ 19 /* expect+2: error: {}-enclosed or constant initializer of type 'array[unknown_size] of int' required [181] */ 20 /* expect+1: error: empty array declaration for 'num0' [190] */ 21 int num0[] = 0; 22 int num1[] = { 1 }; 23 /* gcc-expect+2: warning: braces around scalar initializer */ 24 /* clang-expect+1: warning: braces around scalar initializer */ 25 int num2[] = {{ 1 }}; 26 /* gcc-expect+3: warning: braces around scalar initializer */ 27 /* gcc-expect+2: warning: braces around scalar initializer */ 28 /* clang-expect+1: warning: too many braces around scalar initializer */ 29 int num3[] = {{{ 1 }}}; 30 /* gcc-expect+5: warning: braces around scalar initializer */ 31 /* gcc-expect+4: warning: braces around scalar initializer */ 32 /* gcc-expect+3: warning: braces around scalar initializer */ 33 /* clang-expect+2: warning: too many braces around scalar initializer */ 34 /* clang-expect+1: warning: too many braces around scalar initializer */ 35 int num4[] = {{{{ 1 }}}}; 36 } 37 38 void 39 init_string(void) 40 { 41 char name0[] = ""; 42 char name1[] = { "" }; 43 /* gcc-expect+5: warning: braces around scalar initializer */ 44 /* gcc-expect+4: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast */ 45 /* clang-expect+3: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [1]' */ 46 /* clang-expect+2: warning: braces around scalar initializer */ 47 /* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */ 48 char name2[] = {{ "" }}; 49 /* gcc-expect+6: warning: braces around scalar initializer */ 50 /* gcc-expect+5: warning: braces around scalar initializer */ 51 /* gcc-expect+4: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast */ 52 /* clang-expect+3: warning: too many braces around scalar initializer */ 53 /* clang-expect+2: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [1]' */ 54 /* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */ 55 char name3[] = {{{ "" }}}; 56 /* gcc-expect+8: warning: braces around scalar initializer */ 57 /* gcc-expect+7: warning: braces around scalar initializer */ 58 /* gcc-expect+6: warning: braces around scalar initializer */ 59 /* gcc-expect+5: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast */ 60 /* clang-expect+4: warning: too many braces around scalar initializer */ 61 /* clang-expect+3: warning: too many braces around scalar initializer */ 62 /* clang-expect+2: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [1]' */ 63 /* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */ 64 char name4[] = {{{{ "" }}}}; 65 } 66 67 /* C11 6.7.2.1p13 */ 68 unsigned long 69 init_anonymous_struct_and_union(void) 70 { 71 struct time { 72 unsigned long ns; 73 }; 74 75 struct times { 76 struct time t0; 77 struct time t1; 78 }; 79 80 struct outer { 81 union { 82 struct { 83 struct times times; 84 }; 85 }; 86 }; 87 88 struct outer var = { /* struct outer */ 89 { /* anonymous union */ 90 { /* anonymous struct */ 91 .times = { 92 .t0 = { .ns = 0, }, 93 .t1 = { .ns = 0, }, 94 }, 95 }, 96 }, 97 }; 98 99 return var.times.t0.ns; 100 } 101 102 // Initializers may designate members from unnamed struct/union members. 103 // Example code adapted from jemalloc 5.1.0, jemalloc.c, init_lock. 104 unsigned char 105 init_unnamed_union(void) 106 { 107 struct init_unnamed_union { 108 union { 109 struct { 110 struct padded_union { 111 unsigned char pad1[3]; 112 union { 113 unsigned char u1; 114 unsigned char u2; 115 }; 116 unsigned char pad2[3]; 117 } padded_union; 118 }; 119 }; 120 }; 121 122 struct init_unnamed_union var = { 123 { 124 { 125 .padded_union = { 126 .pad1 = { 0, 0, 0 }, 127 .u1 = 0, 128 .pad2 = { 0, 0, 0 }, 129 }, 130 } 131 }, 132 }; 133 return var.padded_union.u1; 134 } 135