init_braces.c revision 1.5
1/* $NetBSD: init_braces.c,v 1.5 2023/06/30 21:06:18 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 12void 13init_int(void) 14{ 15 /* gcc-expect+4: error: invalid initializer */ 16 /* clang-expect+3: error: array initializer must be an initializer list */ 17 /* expect+2: error: {}-enclosed initializer required [181] */ 18 /* expect+1: error: empty array declaration for 'num0' [190] */ 19 int num0[] = 0; 20 int num1[] = { 1 }; 21 /* gcc-expect+2: warning: braces around scalar initializer */ 22 /* clang-expect+1: warning: braces around scalar initializer */ 23 int num2[] = {{ 1 }}; 24 /* gcc-expect+3: warning: braces around scalar initializer */ 25 /* gcc-expect+2: warning: braces around scalar initializer */ 26 /* clang-expect+1: warning: too many braces around scalar initializer */ 27 int num3[] = {{{ 1 }}}; 28 /* gcc-expect+5: warning: braces around scalar initializer */ 29 /* gcc-expect+4: warning: braces around scalar initializer */ 30 /* gcc-expect+3: warning: braces around scalar initializer */ 31 /* clang-expect+2: warning: too many braces around scalar initializer */ 32 /* clang-expect+1: warning: too many braces around scalar initializer */ 33 int num4[] = {{{{ 1 }}}}; 34} 35 36void 37init_string(void) 38{ 39 char name0[] = ""; 40 char name1[] = { "" }; 41 /* gcc-expect+5: warning: braces around scalar initializer */ 42 /* gcc-expect+4: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast */ 43 /* clang-expect+3: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [1]' */ 44 /* clang-expect+2: warning: braces around scalar initializer */ 45 /* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */ 46 char name2[] = {{ "" }}; 47 /* gcc-expect+6: warning: braces around scalar initializer */ 48 /* gcc-expect+5: warning: braces around scalar initializer */ 49 /* gcc-expect+4: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast */ 50 /* clang-expect+3: warning: too many braces around scalar initializer */ 51 /* clang-expect+2: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [1]' */ 52 /* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */ 53 char name3[] = {{{ "" }}}; 54 /* gcc-expect+8: warning: braces around scalar initializer */ 55 /* gcc-expect+7: warning: braces around scalar initializer */ 56 /* gcc-expect+6: warning: braces around scalar initializer */ 57 /* gcc-expect+5: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast */ 58 /* clang-expect+4: warning: too many braces around scalar initializer */ 59 /* clang-expect+3: warning: too many braces around scalar initializer */ 60 /* clang-expect+2: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [1]' */ 61 /* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */ 62 char name4[] = {{{{ "" }}}}; 63} 64 65/* C11 6.7.2.1p13 */ 66unsigned long 67init_anonymous_struct_and_union(void) 68{ 69 struct time { 70 unsigned long ns; 71 }; 72 73 struct times { 74 struct time t0; 75 struct time t1; 76 }; 77 78 struct outer { 79 union { 80 struct { 81 struct times times; 82 }; 83 }; 84 }; 85 86 struct outer var = { /* struct outer */ 87 { /* anonymous union */ 88 { /* anonymous struct */ 89 .times = { 90 .t0 = { .ns = 0, }, 91 .t1 = { .ns = 0, }, 92 }, 93 }, 94 }, 95 }; 96 97 return var.times.t0.ns; 98} 99