11.18Srillig/* $NetBSD: init.c,v 1.18 2025/04/12 15:49:49 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.18Srillig/* expect+1: error: invalid 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}; 1261.16Srillig 1271.16Srilligvoid 1281.16Srilliginit_string_via_assignment(void) 1291.16Srillig{ 1301.16Srillig const char *cs_match = ""; 1311.16Srillig const int *ws_match = L""; 1321.16Srillig 1331.18Srillig /* expect+1: warning: invalid combination of 'pointer to const char' and 'pointer to int', op 'init' [124] */ 1341.16Srillig const char *cs_mismatch = L""; 1351.18Srillig /* expect+1: warning: invalid combination of 'pointer to const int' and 'pointer to char', op 'init' [124] */ 1361.16Srillig const int *ws_mismatch = ""; 1371.16Srillig} 1381.16Srillig 1391.16Srilligvoid 1401.16Srilliginit_pointer_in_struct(void) 1411.16Srillig{ 1421.16Srillig struct cs_ws { 1431.16Srillig const char *cs; 1441.16Srillig const int *ws; 1451.16Srillig }; 1461.16Srillig 1471.16Srillig struct cs_ws type_match = { 1481.16Srillig "", 1491.16Srillig L"", 1501.16Srillig }; 1511.16Srillig 1521.16Srillig struct cs_ws type_mismatch = { 1531.18Srillig /* expect+1: warning: invalid combination of 'pointer to const char' and 'pointer to int', op 'init' [124] */ 1541.16Srillig L"", 1551.18Srillig /* expect+1: warning: invalid combination of 'pointer to const int' and 'pointer to char', op 'init' [124] */ 1561.16Srillig "", 1571.16Srillig }; 1581.16Srillig 1591.16Srillig struct cs_ws extra_braces = { 1601.16Srillig { "" }, 1611.16Srillig { L"" }, 1621.16Srillig }; 1631.16Srillig} 1641.16Srillig 1651.16Srillig 1661.16Srilligvoid 1671.16Srilliginit_array_in_struct(void) 1681.16Srillig{ 1691.16Srillig struct cs_ws { 1701.16Srillig const char cs[10]; 1711.16Srillig const int ws[10]; 1721.16Srillig }; 1731.16Srillig 1741.16Srillig struct cs_ws type_match = { 1751.16Srillig "", 1761.16Srillig L"", 1771.16Srillig }; 1781.16Srillig 1791.16Srillig struct cs_ws type_mismatch = { 1801.18Srillig /* expect+1: warning: invalid combination of integer 'char' and pointer 'pointer to int' for 'init' [183] */ 1811.16Srillig L"", 1821.18Srillig /* expect+1: warning: invalid combination of integer 'char' and pointer 'pointer to char' for 'init' [183] */ 1831.16Srillig "", 1841.16Srillig }; 1851.16Srillig 1861.16Srillig struct cs_ws no_terminating_null = { 1871.16Srillig "0123456789", 1881.16Srillig L"0123456789", 1891.16Srillig }; 1901.16Srillig 1911.16Srillig struct cs_ws too_many_characters = { 1921.16Srillig /* expect+1: warning: string literal too long (11) for target array (10) [187] */ 1931.16Srillig "0123456789X", 1941.16Srillig /* expect+1: warning: string literal too long (11) for target array (10) [187] */ 1951.16Srillig L"0123456789X", 1961.16Srillig }; 1971.16Srillig 1981.16Srillig struct cs_ws extra_braces = { 1991.16Srillig { "" }, 2001.16Srillig { L"" }, 2011.16Srillig }; 2021.16Srillig} 203