init.c revision 1.14
1/* $NetBSD: init.c,v 1.14 2023/01/04 06:04:07 rillig Exp $ */ 2# 3 "init.c" 3 4/* 5 * Tests for initialization. 6 * 7 * C99 6.7.8 8 */ 9 10/* 11 * C99 does not allow empty initializer braces syntactically. 12 * Lint allows this syntactically, it just complains if the resulting 13 * object is empty. 14 */ 15/* expect+1: error: empty array declaration for 'empty_array_with_initializer' [190] */ 16double empty_array_with_initializer[] = {}; 17double array_with_empty_initializer[3] = {}; 18 19/* 20 * C99 does not allow empty initializer braces syntactically. 21 */ 22struct { 23 int member; 24} empty_struct_initializer = {}; 25 26 27typedef struct { 28 const char *key; 29 int n; 30} histogram_entry; 31 32/* 33 * The C standards allow omitting braces around the structural levels. For 34 * human readers, it is usually clearer to include them. 35 * 36 * Seen in external/ibm-public/postfix/dist/src/util/dict.c(624). 37 */ 38const histogram_entry hgr[] = { 39 "odd", 5, 40 "even", 5, 41}; 42 43 44/* 45 * Initialization with fewer braces than usual, must still be accepted. 46 */ 47struct { 48 int x, y; 49} points[] = { 50 0, 0, 3, 0, 0, 4, 3, 4 51}; 52 53 54/* 55 * Initialization with fewer braces than usual, must still be accepted. 56 */ 57void do_nothing(void); 58 59struct { 60 void (*action_1) (void); 61 void (*action_2) (void); 62} actions[1] = { 63 do_nothing, 64 do_nothing, 65}; 66 67 68/* expect+1: error: initialization of incomplete type 'incomplete struct incomplete_struct' [175] */ 69struct incomplete_struct s1 = { 70 1, 71/* expect+1: error: 's1' has incomplete type 'incomplete struct incomplete_struct' [31] */ 72}; 73 74/* expect+1: error: initialization of incomplete type 'incomplete struct incomplete_struct' [175] */ 75struct incomplete_struct s2 = { 76 .member = 1, 77/* expect+1: error: 's2' has incomplete type 'incomplete struct incomplete_struct' [31] */ 78}; 79 80struct incomplete_struct { 81 int num; 82}; 83 84 85/* expect+1: error: initialization of incomplete type 'incomplete union incomplete_union' [175] */ 86union incomplete_union u1 = { 87 1, 88/* expect+1: error: 'u1' has incomplete type 'incomplete union incomplete_union' [31] */ 89}; 90 91/* expect+1: error: initialization of incomplete type 'incomplete union incomplete_union' [175] */ 92union incomplete_union u2 = { 93 .member = 1, 94/* expect+1: error: 'u2' has incomplete type 'incomplete union incomplete_union' [31] */ 95}; 96 97union incomplete_union { 98 int num; 99}; 100 101 102/* expect+1: warning: cannot initialize extern declaration 'extern_var' [26] */ 103extern int extern_var = 1; 104int defined_var = 1; 105/* expect+1: warning: static variable 'static_var' unused [226] */ 106static int static_var = 1; 107/* expect+1: error: illegal storage class [8] */ 108register int register_var = 1; 109/* expect+1: error: cannot initialize typedef 'typedef_var' [25] */ 110typedef int typedef_var = 1; 111 112 113/* 114 * In an array of unknown size that is declared using fewer braces than 115 * recommended, ensure that the array size is updated at the end of the 116 * initializer. 117 */ 118struct { 119 int x; 120 int y; 121} points_of_unknown_size[] = { 122 3, 4, 123}; 124