init_braces.c revision 1.6
11.6Srillig/* $NetBSD: init_braces.c,v 1.6 2023/06/30 22:27:47 rillig Exp $ */ 21.1Srillig# 3 "init_braces.c" 31.1Srillig 41.1Srillig/* 51.1Srillig * Test initialization with excess braces around expressions. 61.1Srillig * 71.1Srillig * See also: 81.1Srillig * C99 6.7.8 91.1Srillig * C11 6.7.9 101.1Srillig */ 111.1Srillig 121.1Srilligvoid 131.1Srilliginit_int(void) 141.1Srillig{ 151.3Srillig /* gcc-expect+4: error: invalid initializer */ 161.3Srillig /* clang-expect+3: error: array initializer must be an initializer list */ 171.1Srillig /* expect+2: error: {}-enclosed initializer required [181] */ 181.2Srillig /* expect+1: error: empty array declaration for 'num0' [190] */ 191.1Srillig int num0[] = 0; 201.1Srillig int num1[] = { 1 }; 211.1Srillig /* gcc-expect+2: warning: braces around scalar initializer */ 221.1Srillig /* clang-expect+1: warning: braces around scalar initializer */ 231.1Srillig int num2[] = {{ 1 }}; 241.1Srillig /* gcc-expect+3: warning: braces around scalar initializer */ 251.1Srillig /* gcc-expect+2: warning: braces around scalar initializer */ 261.1Srillig /* clang-expect+1: warning: too many braces around scalar initializer */ 271.1Srillig int num3[] = {{{ 1 }}}; 281.1Srillig /* gcc-expect+5: warning: braces around scalar initializer */ 291.1Srillig /* gcc-expect+4: warning: braces around scalar initializer */ 301.1Srillig /* gcc-expect+3: warning: braces around scalar initializer */ 311.1Srillig /* clang-expect+2: warning: too many braces around scalar initializer */ 321.1Srillig /* clang-expect+1: warning: too many braces around scalar initializer */ 331.1Srillig int num4[] = {{{{ 1 }}}}; 341.1Srillig} 351.1Srillig 361.1Srilligvoid 371.1Srilliginit_string(void) 381.1Srillig{ 391.1Srillig char name0[] = ""; 401.1Srillig char name1[] = { "" }; 411.1Srillig /* gcc-expect+5: warning: braces around scalar initializer */ 421.1Srillig /* gcc-expect+4: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast */ 431.1Srillig /* clang-expect+3: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [1]' */ 441.1Srillig /* clang-expect+2: warning: braces around scalar initializer */ 451.2Srillig /* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */ 461.1Srillig char name2[] = {{ "" }}; 471.1Srillig /* gcc-expect+6: warning: braces around scalar initializer */ 481.1Srillig /* gcc-expect+5: warning: braces around scalar initializer */ 491.1Srillig /* gcc-expect+4: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast */ 501.1Srillig /* clang-expect+3: warning: too many braces around scalar initializer */ 511.1Srillig /* clang-expect+2: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [1]' */ 521.2Srillig /* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */ 531.1Srillig char name3[] = {{{ "" }}}; 541.1Srillig /* gcc-expect+8: warning: braces around scalar initializer */ 551.1Srillig /* gcc-expect+7: warning: braces around scalar initializer */ 561.1Srillig /* gcc-expect+6: warning: braces around scalar initializer */ 571.1Srillig /* gcc-expect+5: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast */ 581.1Srillig /* clang-expect+4: warning: too many braces around scalar initializer */ 591.1Srillig /* clang-expect+3: warning: too many braces around scalar initializer */ 601.1Srillig /* clang-expect+2: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [1]' */ 611.2Srillig /* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */ 621.1Srillig char name4[] = {{{{ "" }}}}; 631.1Srillig} 641.3Srillig 651.4Srillig/* C11 6.7.2.1p13 */ 661.3Srilligunsigned long 671.4Srilliginit_anonymous_struct_and_union(void) 681.3Srillig{ 691.3Srillig struct time { 701.3Srillig unsigned long ns; 711.3Srillig }; 721.3Srillig 731.3Srillig struct times { 741.3Srillig struct time t0; 751.3Srillig struct time t1; 761.3Srillig }; 771.3Srillig 781.3Srillig struct outer { 791.3Srillig union { 801.3Srillig struct { 811.3Srillig struct times times; 821.3Srillig }; 831.3Srillig }; 841.3Srillig }; 851.3Srillig 861.3Srillig struct outer var = { /* struct outer */ 871.4Srillig { /* anonymous union */ 881.4Srillig { /* anonymous struct */ 891.3Srillig .times = { 901.3Srillig .t0 = { .ns = 0, }, 911.3Srillig .t1 = { .ns = 0, }, 921.3Srillig }, 931.3Srillig }, 941.3Srillig }, 951.3Srillig }; 961.3Srillig 971.3Srillig return var.times.t0.ns; 981.3Srillig} 991.6Srillig 1001.6Srillig// Minimized example taken from jemalloc.c, init_lock. 1011.6Srilligunsigned char 1021.6Srilliginit_unnamed_union(void) 1031.6Srillig{ 1041.6Srillig struct init_unnamed_union { 1051.6Srillig union { 1061.6Srillig struct { 1071.6Srillig struct padded_union { 1081.6Srillig unsigned char pad1[3]; 1091.6Srillig union { 1101.6Srillig unsigned char u1; 1111.6Srillig unsigned char u2; 1121.6Srillig }; 1131.6Srillig unsigned char pad2[3]; 1141.6Srillig } padded_union; 1151.6Srillig }; 1161.6Srillig }; 1171.6Srillig }; 1181.6Srillig 1191.6Srillig struct init_unnamed_union var = { 1201.6Srillig { 1211.6Srillig { 1221.6Srillig .padded_union = { 1231.6Srillig .pad1 = { 0, 0, 0 }, 1241.6Srillig/* FIXME: Allow access to unnamed struct/union members. */ 1251.6Srillig/* expect+1: error: type 'struct padded_union' does not have member 'u1' [101] */ 1261.6Srillig .u1 = 0, 1271.6Srillig .pad2 = { 0, 0, 0 }, 1281.6Srillig }, 1291.6Srillig } 1301.6Srillig }, 1311.6Srillig }; 1321.6Srillig return var.padded_union.u1; 1331.6Srillig} 134