init_braces.c revision 1.4
11.4Srillig/* $NetBSD: init_braces.c,v 1.4 2023/06/30 09:21:52 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/* FIXME: GCC and Clang both compile this initializer. */ 901.3Srillig/* expect+1: error: type 'struct time' does not have member 'times' [101] */ 911.3Srillig .times = { 921.3Srillig .t0 = { .ns = 0, }, 931.3Srillig .t1 = { .ns = 0, }, 941.3Srillig }, 951.3Srillig }, 961.3Srillig }, 971.3Srillig }; 981.3Srillig 991.3Srillig return var.times.t0.ns; 1001.3Srillig} 101