init.c revision 1.15
11.15Srillig/* $NetBSD: init.c,v 1.15 2023/03/28 14:44:34 rillig Exp $ */ 21.1Srillig# 3 "init.c" 31.1Srillig 41.1Srillig/* 51.1Srillig * Tests for initialization. 61.1Srillig * 71.1Srillig * C99 6.7.8 81.1Srillig */ 91.1Srillig 101.15Srillig/* lint1-extra-flags: -X 351 */ 111.15Srillig 121.1Srillig/* 131.1Srillig * C99 does not allow empty initializer braces syntactically. 141.1Srillig * Lint allows this syntactically, it just complains if the resulting 151.1Srillig * object is empty. 161.1Srillig */ 171.13Srillig/* expect+1: error: empty array declaration for 'empty_array_with_initializer' [190] */ 181.1Srilligdouble empty_array_with_initializer[] = {}; 191.1Srilligdouble array_with_empty_initializer[3] = {}; 201.1Srillig 211.1Srillig/* 221.1Srillig * C99 does not allow empty initializer braces syntactically. 231.1Srillig */ 241.1Srilligstruct { 251.1Srillig int member; 261.1Srillig} empty_struct_initializer = {}; 271.2Srillig 281.2Srillig 291.2Srilligtypedef struct { 301.2Srillig const char *key; 311.2Srillig int n; 321.2Srillig} histogram_entry; 331.2Srillig 341.2Srillig/* 351.2Srillig * The C standards allow omitting braces around the structural levels. For 361.2Srillig * human readers, it is usually clearer to include them. 371.2Srillig * 381.2Srillig * Seen in external/ibm-public/postfix/dist/src/util/dict.c(624). 391.2Srillig */ 401.2Srilligconst histogram_entry hgr[] = { 411.2Srillig "odd", 5, 421.2Srillig "even", 5, 431.2Srillig}; 441.4Srillig 451.4Srillig 461.5Srillig/* 471.5Srillig * Initialization with fewer braces than usual, must still be accepted. 481.5Srillig */ 491.4Srilligstruct { 501.4Srillig int x, y; 511.4Srillig} points[] = { 521.4Srillig 0, 0, 3, 0, 0, 4, 3, 4 531.4Srillig}; 541.6Srillig 551.6Srillig 561.6Srillig/* 571.6Srillig * Initialization with fewer braces than usual, must still be accepted. 581.6Srillig */ 591.6Srilligvoid do_nothing(void); 601.6Srillig 611.6Srilligstruct { 621.6Srillig void (*action_1) (void); 631.6Srillig void (*action_2) (void); 641.6Srillig} actions[1] = { 651.6Srillig do_nothing, 661.6Srillig do_nothing, 671.6Srillig}; 681.8Srillig 691.9Srillig 701.9Srillig/* expect+1: error: initialization of incomplete type 'incomplete struct incomplete_struct' [175] */ 711.9Srilligstruct incomplete_struct s1 = { 721.9Srillig 1, 731.9Srillig/* expect+1: error: 's1' has incomplete type 'incomplete struct incomplete_struct' [31] */ 741.9Srillig}; 751.9Srillig 761.9Srillig/* expect+1: error: initialization of incomplete type 'incomplete struct incomplete_struct' [175] */ 771.9Srilligstruct incomplete_struct s2 = { 781.9Srillig .member = 1, 791.9Srillig/* expect+1: error: 's2' has incomplete type 'incomplete struct incomplete_struct' [31] */ 801.9Srillig}; 811.9Srillig 821.9Srilligstruct incomplete_struct { 831.9Srillig int num; 841.9Srillig}; 851.9Srillig 861.9Srillig 871.9Srillig/* expect+1: error: initialization of incomplete type 'incomplete union incomplete_union' [175] */ 881.8Srilligunion incomplete_union u1 = { 891.8Srillig 1, 901.8Srillig/* expect+1: error: 'u1' has incomplete type 'incomplete union incomplete_union' [31] */ 911.8Srillig}; 921.8Srillig 931.9Srillig/* expect+1: error: initialization of incomplete type 'incomplete union incomplete_union' [175] */ 941.8Srilligunion incomplete_union u2 = { 951.8Srillig .member = 1, 961.8Srillig/* expect+1: error: 'u2' has incomplete type 'incomplete union incomplete_union' [31] */ 971.8Srillig}; 981.8Srillig 991.8Srilligunion incomplete_union { 1001.8Srillig int num; 1011.8Srillig}; 1021.10Srillig 1031.10Srillig 1041.12Srillig/* expect+1: warning: cannot initialize extern declaration 'extern_var' [26] */ 1051.10Srilligextern int extern_var = 1; 1061.10Srilligint defined_var = 1; 1071.11Srillig/* expect+1: warning: static variable 'static_var' unused [226] */ 1081.10Srilligstatic int static_var = 1; 1091.10Srillig/* expect+1: error: illegal storage class [8] */ 1101.10Srilligregister int register_var = 1; 1111.12Srillig/* expect+1: error: cannot initialize typedef 'typedef_var' [25] */ 1121.10Srilligtypedef int typedef_var = 1; 1131.10Srillig 1141.10Srillig 1151.10Srillig/* 1161.10Srillig * In an array of unknown size that is declared using fewer braces than 1171.10Srillig * recommended, ensure that the array size is updated at the end of the 1181.10Srillig * initializer. 1191.10Srillig */ 1201.10Srilligstruct { 1211.10Srillig int x; 1221.10Srillig int y; 1231.10Srillig} points_of_unknown_size[] = { 1241.10Srillig 3, 4, 1251.10Srillig}; 126