1 1.275 rillig /* $NetBSD: init.c,v 1.275 2025/07/11 19:03:01 rillig Exp $ */ 2 1.2 cgd 3 1.1 cgd /* 4 1.1 cgd * Copyright (c) 1994, 1995 Jochen Pohl 5 1.179 rillig * Copyright (c) 2021 Roland Illig 6 1.1 cgd * All Rights Reserved. 7 1.1 cgd * 8 1.1 cgd * Redistribution and use in source and binary forms, with or without 9 1.1 cgd * modification, are permitted provided that the following conditions 10 1.1 cgd * are met: 11 1.1 cgd * 1. Redistributions of source code must retain the above copyright 12 1.1 cgd * notice, this list of conditions and the following disclaimer. 13 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 14 1.1 cgd * notice, this list of conditions and the following disclaimer in the 15 1.1 cgd * documentation and/or other materials provided with the distribution. 16 1.1 cgd * 3. All advertising materials mentioning features or use of this software 17 1.1 cgd * must display the following acknowledgement: 18 1.246 rillig * This product includes software developed by Jochen Pohl for 19 1.1 cgd * The NetBSD Project. 20 1.1 cgd * 4. The name of the author may not be used to endorse or promote products 21 1.1 cgd * derived from this software without specific prior written permission. 22 1.1 cgd * 23 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 24 1.1 cgd * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 25 1.1 cgd * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26 1.1 cgd * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 27 1.1 cgd * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 28 1.1 cgd * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29 1.1 cgd * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30 1.1 cgd * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31 1.1 cgd * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 32 1.1 cgd * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 1.1 cgd */ 34 1.1 cgd 35 1.18 jmc #if HAVE_NBTOOL_CONFIG_H 36 1.18 jmc #include "nbtool_config.h" 37 1.18 jmc #endif 38 1.18 jmc 39 1.5 christos #include <sys/cdefs.h> 40 1.235 rillig #if defined(__RCSID) 41 1.275 rillig __RCSID("$NetBSD: init.c,v 1.275 2025/07/11 19:03:01 rillig Exp $"); 42 1.1 cgd #endif 43 1.1 cgd 44 1.1 cgd #include <stdlib.h> 45 1.17 thorpej #include <string.h> 46 1.1 cgd 47 1.1 cgd #include "lint1.h" 48 1.1 cgd 49 1.53 rillig 50 1.53 rillig /* 51 1.179 rillig * Initialization of global or local objects, like in: 52 1.93 rillig * 53 1.93 rillig * int number = 12345; 54 1.93 rillig * int number_with_braces = { 12345 }; 55 1.93 rillig * int array_of_unknown_size[] = { 111, 222, 333 }; 56 1.119 rillig * struct { int x, y; } point = { .y = 4, .x = 3 }; 57 1.93 rillig * 58 1.198 rillig * During an initialization, the grammar parser calls these functions: 59 1.93 rillig * 60 1.119 rillig * begin_initialization 61 1.119 rillig * init_lbrace for each '{' 62 1.157 rillig * add_designator_member for each '.member' before '=' 63 1.157 rillig * add_designator_subscript for each '[123]' before '=' 64 1.179 rillig * init_expr for each expression 65 1.119 rillig * init_rbrace for each '}' 66 1.119 rillig * end_initialization 67 1.93 rillig * 68 1.139 rillig * Each '{' begins a new brace level, each '}' ends the current brace level. 69 1.198 rillig * Each brace level has an associated "current object", which is the starting 70 1.198 rillig * point for resolving the optional designations such as '.member[3]'. 71 1.93 rillig * 72 1.93 rillig * See also: 73 1.93 rillig * C99 6.7.8 "Initialization" 74 1.220 rillig * C11 6.7.9 "Initialization" 75 1.93 rillig * d_c99_init.c for more examples 76 1.93 rillig */ 77 1.93 rillig 78 1.229 rillig 79 1.179 rillig /* 80 1.229 rillig * Everything that happens between a '{' and the corresponding '}', as part 81 1.229 rillig * of an initialization. 82 1.229 rillig * 83 1.253 rillig * Each brace level has a "current object". For the outermost brace level, 84 1.229 rillig * it is the same as the object to be initialized. Each nested '{' begins a 85 1.229 rillig * nested brace level, for the sub-object pointed to by the designator of the 86 1.229 rillig * outer brace level. 87 1.179 rillig * 88 1.220 rillig * C99 6.7.8p17 89 1.179 rillig */ 90 1.221 rillig typedef struct brace_level { 91 1.220 rillig /* The type of the "current object". */ 92 1.220 rillig const type_t *bl_type; 93 1.220 rillig 94 1.201 rillig /* 95 1.229 rillig * The path from the "current object" to the sub-object that is 96 1.220 rillig * initialized by the next expression. 97 1.220 rillig * 98 1.252 rillig * Initially, the designation is empty. Before handling an expression, 99 1.252 rillig * the designation is updated to point to the corresponding sub-object 100 1.252 rillig * to be initialized. After handling an expression, the designation is 101 1.252 rillig * marked as done. It is later advanced as necessary. 102 1.201 rillig */ 103 1.221 rillig designation bl_designation; 104 1.192 rillig 105 1.179 rillig struct brace_level *bl_enclosing; 106 1.221 rillig } brace_level; 107 1.179 rillig 108 1.266 rillig /* An ongoing initialization. */ 109 1.221 rillig typedef struct initialization { 110 1.193 rillig /* The symbol that is to be initialized. */ 111 1.193 rillig sym_t *in_sym; 112 1.193 rillig 113 1.193 rillig /* The innermost brace level. */ 114 1.221 rillig brace_level *in_brace_level; 115 1.193 rillig 116 1.110 rillig /* 117 1.229 rillig * The maximum subscript that has ever been seen for an array of 118 1.219 rillig * unknown size, which can only occur at the outermost brace level. 119 1.219 rillig */ 120 1.219 rillig size_t in_max_subscript; 121 1.219 rillig 122 1.219 rillig /* 123 1.252 rillig * Is set when a structural error occurred in the initialization. If 124 1.252 rillig * set, the rest of the initialization is still parsed, but the 125 1.229 rillig * initialization assignments are not checked. 126 1.110 rillig */ 127 1.176 rillig bool in_err; 128 1.110 rillig 129 1.179 rillig struct initialization *in_enclosing; 130 1.221 rillig } initialization; 131 1.1 cgd 132 1.145 rillig 133 1.175 rillig static void * 134 1.175 rillig unconst_cast(const void *p) 135 1.175 rillig { 136 1.175 rillig void *r; 137 1.175 rillig 138 1.190 rillig memcpy(&r, &p, sizeof(r)); 139 1.175 rillig return r; 140 1.175 rillig } 141 1.175 rillig 142 1.177 rillig static bool 143 1.177 rillig has_automatic_storage_duration(const sym_t *sym) 144 1.177 rillig { 145 1.177 rillig 146 1.177 rillig return sym->s_scl == AUTO || sym->s_scl == REG; 147 1.177 rillig } 148 1.177 rillig 149 1.229 rillig /* 150 1.229 rillig * Test whether rn is a string literal that can initialize ltp. 151 1.229 rillig * 152 1.229 rillig * See also: 153 1.229 rillig * C99 6.7.8p14 for plain character strings 154 1.229 rillig * C99 6.7.8p15 for wide character strings 155 1.229 rillig */ 156 1.177 rillig static bool 157 1.229 rillig can_init_character_array(const type_t *ltp, const tnode_t *rn) 158 1.177 rillig { 159 1.177 rillig 160 1.229 rillig if (!(ltp != NULL && ltp->t_tspec == ARRAY && rn->tn_op == STRING)) 161 1.177 rillig return false; 162 1.177 rillig 163 1.239 rillig tspec_t lst = ltp->t_subt->t_tspec; 164 1.239 rillig tspec_t rst = rn->tn_type->t_subt->t_tspec; 165 1.177 rillig 166 1.229 rillig return rst == CHAR 167 1.229 rillig ? lst == CHAR || lst == UCHAR || lst == SCHAR 168 1.245 rillig : lst == WCHAR_TSPEC; 169 1.177 rillig } 170 1.177 rillig 171 1.179 rillig static const sym_t * 172 1.179 rillig skip_unnamed(const sym_t *m) 173 1.179 rillig { 174 1.179 rillig 175 1.243 rillig while (m != NULL && m->s_name == unnamed 176 1.243 rillig && !is_struct_or_union(m->s_type->t_tspec)) 177 1.179 rillig m = m->s_next; 178 1.179 rillig return m; 179 1.179 rillig } 180 1.179 rillig 181 1.177 rillig static const sym_t * 182 1.179 rillig first_named_member(const type_t *tp) 183 1.177 rillig { 184 1.177 rillig 185 1.179 rillig lint_assert(is_struct_or_union(tp->t_tspec)); 186 1.262 rillig return skip_unnamed(tp->u.sou->sou_first_member); 187 1.179 rillig } 188 1.179 rillig 189 1.179 rillig static void 190 1.179 rillig update_type_of_array_of_unknown_size(sym_t *sym, size_t size) 191 1.179 rillig { 192 1.179 rillig 193 1.239 rillig type_t *tp = block_dup_type(sym->s_type); 194 1.262 rillig tp->u.dimension = (int)size; 195 1.179 rillig tp->t_incomplete_array = false; 196 1.179 rillig sym->s_type = tp; 197 1.229 rillig debug_step("completed array type is '%s'", type_name(sym->s_type)); 198 1.242 rillig outsym(sym, sym->s_scl, sym->s_def); 199 1.179 rillig } 200 1.179 rillig 201 1.158 rillig static void 202 1.158 rillig check_bit_field_init(const tnode_t *ln, tspec_t lt, tspec_t rt) 203 1.158 rillig { 204 1.175 rillig 205 1.234 rillig if (!allow_c90 && 206 1.158 rillig is_integer(lt) && 207 1.158 rillig ln->tn_type->t_bitfield && 208 1.265 rillig !is_integer(rt)) 209 1.265 rillig /* bit-field initializer must be an integer in ... */ 210 1.158 rillig warning(186); 211 1.158 rillig } 212 1.158 rillig 213 1.158 rillig static void 214 1.177 rillig check_non_constant_initializer(const tnode_t *tn, const sym_t *sym) 215 1.158 rillig { 216 1.175 rillig 217 1.158 rillig if (tn == NULL || tn->tn_op == CON) 218 1.158 rillig return; 219 1.158 rillig 220 1.239 rillig const sym_t *unused_sym; 221 1.239 rillig ptrdiff_t unused_offs; 222 1.177 rillig if (constant_addr(tn, &unused_sym, &unused_offs)) 223 1.158 rillig return; 224 1.158 rillig 225 1.177 rillig if (has_automatic_storage_duration(sym)) { 226 1.158 rillig /* non-constant initializer */ 227 1.158 rillig c99ism(177); 228 1.158 rillig } else { 229 1.158 rillig /* non-constant initializer */ 230 1.158 rillig error(177); 231 1.158 rillig } 232 1.158 rillig } 233 1.158 rillig 234 1.158 rillig static void 235 1.197 rillig check_trad_no_auto_aggregate(const sym_t *sym) 236 1.179 rillig { 237 1.179 rillig 238 1.197 rillig if (has_automatic_storage_duration(sym) && 239 1.179 rillig !is_scalar(sym->s_type->t_tspec)) { 240 1.273 rillig /* automatic aggregate initialization requires C90 or later */ 241 1.179 rillig warning(188); 242 1.179 rillig } 243 1.179 rillig } 244 1.179 rillig 245 1.179 rillig static void 246 1.224 rillig check_init_expr(const type_t *ltp, sym_t *lsym, tnode_t *rn) 247 1.158 rillig { 248 1.158 rillig 249 1.239 rillig type_t *lutp = expr_unqualified_type(ltp); 250 1.200 rillig 251 1.158 rillig /* Create a temporary node for the left side. */ 252 1.247 rillig tnode_t *ln = expr_zero_alloc(sizeof(*ln), "tnode"); 253 1.158 rillig ln->tn_op = NAME; 254 1.224 rillig ln->tn_type = lutp; 255 1.158 rillig ln->tn_lvalue = true; 256 1.263 rillig ln->u.sym = lsym; 257 1.158 rillig 258 1.224 rillig rn = cconv(rn); 259 1.158 rillig 260 1.206 rillig debug_step("typeok '%s', '%s'", 261 1.224 rillig type_name(ln->tn_type), type_name(rn->tn_type)); 262 1.274 rillig if (!typeok(INIT, NULL, 0, ln, rn)) 263 1.158 rillig return; 264 1.158 rillig 265 1.238 rillig memory_pool saved_mem = expr_save_memory(); 266 1.271 rillig expr(rn, true, false, true, false, "init"); 267 1.238 rillig expr_restore_memory(saved_mem); 268 1.158 rillig 269 1.266 rillig tspec_t lt = ln->tn_type->t_tspec; 270 1.266 rillig tspec_t rt = rn->tn_type->t_tspec; 271 1.158 rillig check_bit_field_init(ln, lt, rt); 272 1.158 rillig 273 1.224 rillig if (lt != rt || (ltp->t_bitfield && rn->tn_op == CON)) 274 1.224 rillig rn = convert(INIT, 0, unconst_cast(ltp), rn); 275 1.158 rillig 276 1.224 rillig check_non_constant_initializer(rn, lsym); 277 1.158 rillig } 278 1.158 rillig 279 1.158 rillig 280 1.179 rillig static const type_t * 281 1.225 rillig designator_type(const designator *dr, const type_t *tp) 282 1.179 rillig { 283 1.239 rillig 284 1.179 rillig switch (tp->t_tspec) { 285 1.179 rillig case STRUCT: 286 1.179 rillig case UNION: 287 1.255 rillig if (dr->dr_kind != DK_MEMBER) { 288 1.229 rillig const sym_t *fmem = first_named_member(tp); 289 1.179 rillig /* syntax error '%s' */ 290 1.179 rillig error(249, "designator '[...]' is only for arrays"); 291 1.229 rillig return fmem != NULL ? fmem->s_type : NULL; 292 1.179 rillig } 293 1.179 rillig 294 1.229 rillig lint_assert(dr->dr_member != NULL); 295 1.229 rillig return dr->dr_member->s_type; 296 1.179 rillig case ARRAY: 297 1.255 rillig if (dr->dr_kind != DK_SUBSCRIPT) { 298 1.179 rillig /* syntax error '%s' */ 299 1.179 rillig error(249, 300 1.181 rillig "designator '.member' is only for struct/union"); 301 1.179 rillig } 302 1.229 rillig if (!tp->t_incomplete_array) 303 1.262 rillig lint_assert( 304 1.262 rillig dr->dr_subscript < (size_t)tp->u.dimension); 305 1.179 rillig return tp->t_subt; 306 1.179 rillig default: 307 1.259 rillig if (dr->dr_kind != DK_SCALAR) 308 1.229 rillig /* syntax error '%s' */ 309 1.229 rillig error(249, "scalar type cannot use designator"); 310 1.179 rillig return tp; 311 1.179 rillig } 312 1.179 rillig } 313 1.179 rillig 314 1.179 rillig 315 1.159 rillig #ifdef DEBUG 316 1.159 rillig static void 317 1.229 rillig designator_debug(const designator *dr) 318 1.229 rillig { 319 1.229 rillig 320 1.255 rillig if (dr->dr_kind == DK_MEMBER) { 321 1.229 rillig lint_assert(dr->dr_subscript == 0); 322 1.229 rillig debug_printf(".%s", 323 1.229 rillig dr->dr_member != NULL 324 1.229 rillig ? dr->dr_member->s_name 325 1.229 rillig : "<end>"); 326 1.255 rillig } else if (dr->dr_kind == DK_SUBSCRIPT) { 327 1.229 rillig lint_assert(dr->dr_member == NULL); 328 1.229 rillig debug_printf("[%zu]", dr->dr_subscript); 329 1.229 rillig } else { 330 1.229 rillig lint_assert(dr->dr_member == NULL); 331 1.229 rillig lint_assert(dr->dr_subscript == 0); 332 1.229 rillig debug_printf("<scalar>"); 333 1.229 rillig } 334 1.229 rillig 335 1.229 rillig if (dr->dr_done) 336 1.229 rillig debug_printf(" (done)"); 337 1.229 rillig } 338 1.229 rillig 339 1.229 rillig static void 340 1.221 rillig designation_debug(const designation *dn) 341 1.159 rillig { 342 1.159 rillig 343 1.229 rillig if (dn->dn_len == 0) { 344 1.229 rillig debug_step("designation: (empty)"); 345 1.159 rillig return; 346 1.229 rillig } 347 1.159 rillig 348 1.159 rillig debug_printf("designation: "); 349 1.239 rillig for (size_t i = 0; i < dn->dn_len; i++) 350 1.229 rillig designator_debug(dn->dn_items + i); 351 1.159 rillig debug_printf("\n"); 352 1.159 rillig } 353 1.159 rillig #else 354 1.159 rillig #define designation_debug(dn) do { } while (false) 355 1.159 rillig #endif 356 1.159 rillig 357 1.229 rillig static designator * 358 1.229 rillig designation_last(designation *dn) 359 1.229 rillig { 360 1.229 rillig 361 1.229 rillig lint_assert(dn->dn_len > 0); 362 1.229 rillig return &dn->dn_items[dn->dn_len - 1]; 363 1.229 rillig } 364 1.229 rillig 365 1.254 rillig void 366 1.229 rillig designation_push(designation *dn, designator_kind kind, 367 1.229 rillig const sym_t *member, size_t subscript) 368 1.159 rillig { 369 1.179 rillig 370 1.218 rillig if (dn->dn_len == dn->dn_cap) { 371 1.218 rillig dn->dn_cap += 4; 372 1.218 rillig dn->dn_items = xrealloc(dn->dn_items, 373 1.218 rillig dn->dn_cap * sizeof(dn->dn_items[0])); 374 1.218 rillig } 375 1.159 rillig 376 1.239 rillig designator *dr = &dn->dn_items[dn->dn_len++]; 377 1.229 rillig dr->dr_kind = kind; 378 1.229 rillig dr->dr_member = member; 379 1.229 rillig dr->dr_subscript = subscript; 380 1.229 rillig dr->dr_done = false; 381 1.229 rillig designation_debug(dn); 382 1.229 rillig } 383 1.229 rillig 384 1.229 rillig /* 385 1.229 rillig * Extend the designation as appropriate for the given type. 386 1.229 rillig * 387 1.229 rillig * C11 6.7.9p17 388 1.229 rillig */ 389 1.229 rillig static bool 390 1.229 rillig designation_descend(designation *dn, const type_t *tp) 391 1.229 rillig { 392 1.229 rillig 393 1.229 rillig if (is_struct_or_union(tp->t_tspec)) { 394 1.229 rillig const sym_t *member = first_named_member(tp); 395 1.229 rillig if (member == NULL) 396 1.229 rillig return false; 397 1.255 rillig designation_push(dn, DK_MEMBER, member, 0); 398 1.229 rillig } else if (tp->t_tspec == ARRAY) 399 1.255 rillig designation_push(dn, DK_SUBSCRIPT, NULL, 0); 400 1.229 rillig else 401 1.229 rillig designation_push(dn, DK_SCALAR, NULL, 0); 402 1.229 rillig return true; 403 1.159 rillig } 404 1.159 rillig 405 1.159 rillig /* 406 1.179 rillig * Starting at the type of the current object, resolve the type of the 407 1.179 rillig * sub-object by following each designator in the list. 408 1.198 rillig * 409 1.198 rillig * C99 6.7.8p18 410 1.159 rillig */ 411 1.179 rillig static const type_t * 412 1.225 rillig designation_type(const designation *dn, const type_t *tp) 413 1.179 rillig { 414 1.179 rillig 415 1.239 rillig for (size_t i = 0; i < dn->dn_len && tp != NULL; i++) 416 1.225 rillig tp = designator_type(dn->dn_items + i, tp); 417 1.179 rillig return tp; 418 1.179 rillig } 419 1.179 rillig 420 1.229 rillig static const type_t * 421 1.229 rillig designation_parent_type(const designation *dn, const type_t *tp) 422 1.159 rillig { 423 1.159 rillig 424 1.239 rillig for (size_t i = 0; i + 1 < dn->dn_len && tp != NULL; i++) 425 1.229 rillig tp = designator_type(dn->dn_items + i, tp); 426 1.229 rillig return tp; 427 1.159 rillig } 428 1.159 rillig 429 1.159 rillig 430 1.221 rillig static brace_level * 431 1.221 rillig brace_level_new(const type_t *tp, brace_level *enclosing) 432 1.152 rillig { 433 1.152 rillig 434 1.239 rillig brace_level *bl = xcalloc(1, sizeof(*bl)); 435 1.179 rillig bl->bl_type = tp; 436 1.178 rillig bl->bl_enclosing = enclosing; 437 1.152 rillig 438 1.178 rillig return bl; 439 1.152 rillig } 440 1.152 rillig 441 1.152 rillig static void 442 1.221 rillig brace_level_free(brace_level *bl) 443 1.152 rillig { 444 1.179 rillig 445 1.229 rillig free(bl->bl_designation.dn_items); 446 1.178 rillig free(bl); 447 1.152 rillig } 448 1.152 rillig 449 1.146 rillig #ifdef DEBUG 450 1.78 rillig static void 451 1.221 rillig brace_level_debug(const brace_level *bl) 452 1.74 rillig { 453 1.78 rillig 454 1.179 rillig lint_assert(bl->bl_type != NULL); 455 1.179 rillig 456 1.229 rillig debug_printf("type '%s'\n", type_name(bl->bl_type)); 457 1.229 rillig debug_indent_inc(); 458 1.229 rillig designation_debug(&bl->bl_designation); 459 1.229 rillig debug_indent_dec(); 460 1.74 rillig } 461 1.146 rillig #else 462 1.179 rillig #define brace_level_debug(level) do { } while (false) 463 1.146 rillig #endif 464 1.146 rillig 465 1.179 rillig /* Return the type of the sub-object that is currently being initialized. */ 466 1.179 rillig static const type_t * 467 1.229 rillig brace_level_sub_type(const brace_level *bl) 468 1.172 rillig { 469 1.147 rillig 470 1.229 rillig return designation_type(&bl->bl_designation, bl->bl_type); 471 1.229 rillig } 472 1.174 rillig 473 1.229 rillig /* 474 1.229 rillig * After initializing a sub-object, advance the designation to point after 475 1.229 rillig * the sub-object that has just been initialized. 476 1.229 rillig * 477 1.229 rillig * C99 6.7.8p17 478 1.229 rillig * C11 6.7.9p17 479 1.229 rillig */ 480 1.229 rillig static void 481 1.229 rillig brace_level_advance(brace_level *bl, size_t *max_subscript) 482 1.229 rillig { 483 1.229 rillig 484 1.229 rillig debug_enter(); 485 1.239 rillig designation *dn = &bl->bl_designation; 486 1.239 rillig const type_t *tp = designation_parent_type(dn, bl->bl_type); 487 1.229 rillig 488 1.229 rillig if (bl->bl_designation.dn_len == 0) 489 1.233 rillig (void)designation_descend(dn, bl->bl_type); 490 1.239 rillig 491 1.239 rillig designator *dr = designation_last(dn); 492 1.229 rillig switch (tp->t_tspec) { 493 1.179 rillig case STRUCT: 494 1.229 rillig lint_assert(dr->dr_member != NULL); 495 1.229 rillig dr->dr_member = skip_unnamed(dr->dr_member->s_next); 496 1.229 rillig if (dr->dr_member == NULL) 497 1.229 rillig dr->dr_done = true; 498 1.229 rillig break; 499 1.179 rillig case UNION: 500 1.229 rillig dr->dr_member = NULL; 501 1.229 rillig dr->dr_done = true; 502 1.229 rillig break; 503 1.229 rillig case ARRAY: 504 1.229 rillig dr->dr_subscript++; 505 1.229 rillig if (tp->t_incomplete_array && 506 1.229 rillig dr->dr_subscript > *max_subscript) 507 1.229 rillig *max_subscript = dr->dr_subscript; 508 1.229 rillig if (!tp->t_incomplete_array && 509 1.262 rillig dr->dr_subscript >= (size_t)tp->u.dimension) 510 1.229 rillig dr->dr_done = true; 511 1.229 rillig break; 512 1.229 rillig default: 513 1.229 rillig dr->dr_done = true; 514 1.229 rillig break; 515 1.229 rillig } 516 1.229 rillig designation_debug(dn); 517 1.229 rillig debug_leave(); 518 1.229 rillig } 519 1.216 rillig 520 1.229 rillig static void 521 1.229 rillig warn_too_many_initializers(designator_kind kind, const type_t *tp) 522 1.229 rillig { 523 1.216 rillig 524 1.259 rillig if (kind == DK_MEMBER) 525 1.229 rillig /* too many struct/union initializers */ 526 1.229 rillig error(172); 527 1.259 rillig else if (kind == DK_SUBSCRIPT) { 528 1.229 rillig lint_assert(tp->t_tspec == ARRAY); 529 1.229 rillig lint_assert(!tp->t_incomplete_array); 530 1.229 rillig /* too many array initializers, expected %d */ 531 1.262 rillig error(173, tp->u.dimension); 532 1.259 rillig } else 533 1.269 rillig /* too many initializers for '%s' */ 534 1.269 rillig error(174, type_name(tp)); 535 1.229 rillig } 536 1.216 rillig 537 1.229 rillig static bool 538 1.229 rillig brace_level_pop_done(brace_level *bl, size_t *max_subscript) 539 1.229 rillig { 540 1.229 rillig designation *dn = &bl->bl_designation; 541 1.229 rillig designator_kind dr_kind = designation_last(dn)->dr_kind; 542 1.229 rillig const type_t *sub_type = designation_parent_type(dn, bl->bl_type); 543 1.229 rillig 544 1.229 rillig while (designation_last(dn)->dr_done) { 545 1.229 rillig dn->dn_len--; 546 1.229 rillig designation_debug(dn); 547 1.229 rillig if (dn->dn_len == 0) { 548 1.229 rillig warn_too_many_initializers(dr_kind, sub_type); 549 1.229 rillig return false; 550 1.216 rillig } 551 1.229 rillig brace_level_advance(bl, max_subscript); 552 1.147 rillig } 553 1.229 rillig return true; 554 1.147 rillig } 555 1.147 rillig 556 1.179 rillig static void 557 1.229 rillig brace_level_pop_final(brace_level *bl, size_t *max_subscript) 558 1.155 rillig { 559 1.229 rillig designation *dn = &bl->bl_designation; 560 1.179 rillig 561 1.229 rillig while (dn->dn_len > 0 && designation_last(dn)->dr_done) { 562 1.229 rillig dn->dn_len--; 563 1.229 rillig designation_debug(dn); 564 1.229 rillig if (dn->dn_len == 0) 565 1.229 rillig return; 566 1.229 rillig brace_level_advance(bl, max_subscript); 567 1.155 rillig } 568 1.155 rillig } 569 1.155 rillig 570 1.266 rillig /* Make the designation point to the sub-object to be initialized next. */ 571 1.229 rillig static bool 572 1.229 rillig brace_level_goto(brace_level *bl, const tnode_t *rn, size_t *max_subscript) 573 1.158 rillig { 574 1.158 rillig 575 1.239 rillig designation *dn = &bl->bl_designation; 576 1.229 rillig if (dn->dn_len == 0 && can_init_character_array(bl->bl_type, rn)) 577 1.229 rillig return true; 578 1.229 rillig if (dn->dn_len == 0 && !designation_descend(dn, bl->bl_type)) 579 1.229 rillig return false; 580 1.229 rillig 581 1.229 rillig again: 582 1.229 rillig if (!brace_level_pop_done(bl, max_subscript)) 583 1.229 rillig return false; 584 1.229 rillig 585 1.239 rillig const type_t *ltp = brace_level_sub_type(bl); 586 1.237 rillig if (types_compatible(ltp, rn->tn_type, true, false, NULL)) 587 1.229 rillig return true; 588 1.229 rillig 589 1.229 rillig if (is_struct_or_union(ltp->t_tspec) || ltp->t_tspec == ARRAY) { 590 1.229 rillig if (can_init_character_array(ltp, rn)) 591 1.229 rillig return true; 592 1.229 rillig if (!designation_descend(dn, ltp)) 593 1.229 rillig return false; 594 1.229 rillig goto again; 595 1.158 rillig } 596 1.229 rillig 597 1.229 rillig return true; 598 1.160 rillig } 599 1.158 rillig 600 1.146 rillig 601 1.221 rillig static initialization * 602 1.221 rillig initialization_new(sym_t *sym, initialization *enclosing) 603 1.146 rillig { 604 1.146 rillig 605 1.239 rillig initialization *in = xcalloc(1, sizeof(*in)); 606 1.176 rillig in->in_sym = sym; 607 1.217 rillig in->in_enclosing = enclosing; 608 1.146 rillig 609 1.146 rillig return in; 610 1.146 rillig } 611 1.74 rillig 612 1.146 rillig static void 613 1.221 rillig initialization_free(initialization *in) 614 1.146 rillig { 615 1.221 rillig brace_level *bl, *next; 616 1.146 rillig 617 1.176 rillig for (bl = in->in_brace_level; bl != NULL; bl = next) { 618 1.176 rillig next = bl->bl_enclosing; 619 1.176 rillig brace_level_free(bl); 620 1.146 rillig } 621 1.146 rillig 622 1.146 rillig free(in); 623 1.146 rillig } 624 1.146 rillig 625 1.146 rillig #ifdef DEBUG 626 1.73 rillig static void 627 1.221 rillig initialization_debug(const initialization *in) 628 1.73 rillig { 629 1.179 rillig 630 1.229 rillig if (in->in_err) 631 1.229 rillig debug_step("initialization error"); 632 1.176 rillig if (in->in_brace_level == NULL) { 633 1.179 rillig debug_step("no brace level"); 634 1.73 rillig return; 635 1.73 rillig } 636 1.73 rillig 637 1.239 rillig const brace_level *bl; 638 1.239 rillig size_t i = 0; 639 1.179 rillig for (bl = in->in_brace_level; bl != NULL; bl = bl->bl_enclosing) { 640 1.139 rillig debug_printf("brace level %zu: ", i); 641 1.178 rillig brace_level_debug(bl); 642 1.73 rillig i++; 643 1.73 rillig } 644 1.73 rillig } 645 1.146 rillig #else 646 1.146 rillig #define initialization_debug(in) do { } while (false) 647 1.146 rillig #endif 648 1.146 rillig 649 1.1 cgd /* 650 1.179 rillig * Return the type of the object or sub-object that is currently being 651 1.179 rillig * initialized. 652 1.1 cgd */ 653 1.179 rillig static const type_t * 654 1.229 rillig initialization_sub_type(initialization *in) 655 1.179 rillig { 656 1.179 rillig 657 1.229 rillig if (in->in_brace_level == NULL) 658 1.229 rillig return in->in_sym->s_type; 659 1.229 rillig 660 1.239 rillig const type_t *tp = brace_level_sub_type(in->in_brace_level); 661 1.179 rillig if (tp == NULL) 662 1.179 rillig in->in_err = true; 663 1.179 rillig return tp; 664 1.179 rillig } 665 1.179 rillig 666 1.158 rillig static void 667 1.225 rillig initialization_lbrace(initialization *in) 668 1.1 cgd { 669 1.179 rillig 670 1.176 rillig if (in->in_err) 671 1.1 cgd return; 672 1.1 cgd 673 1.70 rillig debug_enter(); 674 1.38 rillig 675 1.239 rillig const type_t *tp = initialization_sub_type(in); 676 1.229 rillig if (tp == NULL) 677 1.179 rillig goto done; 678 1.1 cgd 679 1.239 rillig brace_level *outer_bl = in->in_brace_level; 680 1.234 rillig if (!allow_c90 && outer_bl == NULL) 681 1.197 rillig check_trad_no_auto_aggregate(in->in_sym); 682 1.70 rillig 683 1.259 rillig if (!allow_c90 && tp->t_tspec == UNION) 684 1.273 rillig /* initialization of union requires C90 or later */ 685 1.179 rillig warning(238); 686 1.1 cgd 687 1.262 rillig if (is_struct_or_union(tp->t_tspec) && tp->u.sou->sou_incomplete) { 688 1.180 rillig /* initialization of incomplete type '%s' */ 689 1.180 rillig error(175, type_name(tp)); 690 1.179 rillig in->in_err = true; 691 1.179 rillig goto done; 692 1.104 rillig } 693 1.104 rillig 694 1.229 rillig if (outer_bl != NULL && outer_bl->bl_designation.dn_len == 0) { 695 1.229 rillig designation *dn = &outer_bl->bl_designation; 696 1.233 rillig (void)designation_descend(dn, outer_bl->bl_type); 697 1.229 rillig tp = designation_type(dn, outer_bl->bl_type); 698 1.229 rillig } 699 1.1 cgd 700 1.229 rillig in->in_brace_level = brace_level_new(tp, outer_bl); 701 1.229 rillig if (is_struct_or_union(tp->t_tspec) && 702 1.229 rillig first_named_member(tp) == NULL) { 703 1.229 rillig /* cannot initialize struct/union with no named member */ 704 1.229 rillig error(179); 705 1.229 rillig in->in_err = true; 706 1.229 rillig } 707 1.68 rillig 708 1.179 rillig done: 709 1.153 rillig initialization_debug(in); 710 1.68 rillig debug_leave(); 711 1.1 cgd } 712 1.1 cgd 713 1.1 cgd static void 714 1.229 rillig initialization_rbrace(initialization *in) 715 1.1 cgd { 716 1.158 rillig 717 1.229 rillig debug_enter(); 718 1.213 rillig 719 1.229 rillig if (in->in_brace_level != NULL) 720 1.229 rillig brace_level_pop_final(in->in_brace_level, 721 1.229 rillig &in->in_max_subscript); 722 1.213 rillig 723 1.229 rillig /* C99 6.7.8p22 */ 724 1.229 rillig if (in->in_sym->s_type->t_incomplete_array && 725 1.229 rillig in->in_brace_level->bl_enclosing == NULL) { 726 1.229 rillig 727 1.236 rillig /* prevent "empty array declaration for '%s' [190]" */ 728 1.229 rillig size_t dim = in->in_max_subscript; 729 1.229 rillig if (dim == 0 && in->in_err) 730 1.229 rillig dim = 1; 731 1.158 rillig 732 1.229 rillig update_type_of_array_of_unknown_size(in->in_sym, dim); 733 1.229 rillig } 734 1.158 rillig 735 1.213 rillig if (in->in_err) 736 1.213 rillig goto done; 737 1.179 rillig 738 1.239 rillig brace_level *inner_bl = in->in_brace_level; 739 1.239 rillig brace_level *outer_bl = inner_bl->bl_enclosing; 740 1.222 rillig in->in_brace_level = outer_bl; 741 1.222 rillig brace_level_free(inner_bl); 742 1.222 rillig 743 1.229 rillig if (outer_bl != NULL) 744 1.222 rillig brace_level_advance(outer_bl, &in->in_max_subscript); 745 1.68 rillig 746 1.213 rillig done: 747 1.153 rillig initialization_debug(in); 748 1.68 rillig debug_leave(); 749 1.37 rillig } 750 1.37 rillig 751 1.37 rillig static void 752 1.229 rillig initialization_add_designator_member(initialization *in, const char *name) 753 1.164 rillig { 754 1.164 rillig 755 1.176 rillig if (in->in_err) 756 1.1 cgd return; 757 1.1 cgd 758 1.239 rillig brace_level *bl = in->in_brace_level; 759 1.229 rillig lint_assert(bl != NULL); 760 1.229 rillig 761 1.239 rillig const type_t *tp = brace_level_sub_type(bl); 762 1.229 rillig if (is_struct_or_union(tp->t_tspec)) 763 1.229 rillig goto proceed; 764 1.248 rillig else if (tp->t_tspec == ARRAY) 765 1.229 rillig /* syntax error '%s' */ 766 1.229 rillig error(249, "designator '.member' is only for struct/union"); 767 1.248 rillig else 768 1.229 rillig /* syntax error '%s' */ 769 1.229 rillig error(249, "scalar type cannot use designator"); 770 1.248 rillig in->in_err = true; 771 1.248 rillig return; 772 1.229 rillig 773 1.239 rillig proceed:; 774 1.262 rillig const sym_t *member = find_member(tp->u.sou, name); 775 1.229 rillig if (member == NULL) { 776 1.229 rillig /* type '%s' does not have member '%s' */ 777 1.229 rillig error(101, type_name(tp), name); 778 1.229 rillig in->in_err = true; 779 1.229 rillig return; 780 1.229 rillig } 781 1.229 rillig 782 1.255 rillig designation_push(&bl->bl_designation, DK_MEMBER, member, 0); 783 1.229 rillig } 784 1.229 rillig 785 1.229 rillig static void 786 1.229 rillig initialization_add_designator_subscript(initialization *in, size_t subscript) 787 1.229 rillig { 788 1.229 rillig 789 1.229 rillig if (in->in_err) 790 1.229 rillig return; 791 1.229 rillig 792 1.239 rillig brace_level *bl = in->in_brace_level; 793 1.229 rillig lint_assert(bl != NULL); 794 1.229 rillig 795 1.239 rillig const type_t *tp = brace_level_sub_type(bl); 796 1.229 rillig if (tp->t_tspec != ARRAY) { 797 1.229 rillig /* syntax error '%s' */ 798 1.229 rillig error(249, "designator '[...]' is only for arrays"); 799 1.229 rillig in->in_err = true; 800 1.229 rillig return; 801 1.229 rillig } 802 1.229 rillig 803 1.262 rillig if (!tp->t_incomplete_array && subscript >= (size_t)tp->u.dimension) { 804 1.268 rillig /* array subscript %ju cannot be > %d */ 805 1.268 rillig error(168, (uintmax_t)subscript, tp->u.dimension - 1); 806 1.229 rillig subscript = 0; /* suppress further errors */ 807 1.229 rillig } 808 1.229 rillig 809 1.229 rillig if (tp->t_incomplete_array && subscript > in->in_max_subscript) 810 1.229 rillig in->in_max_subscript = subscript; 811 1.229 rillig 812 1.255 rillig designation_push(&bl->bl_designation, DK_SUBSCRIPT, NULL, subscript); 813 1.1 cgd } 814 1.1 cgd 815 1.114 rillig /* 816 1.208 rillig * Initialize an object with automatic storage duration that has an 817 1.208 rillig * initializer expression without braces. 818 1.114 rillig */ 819 1.179 rillig static bool 820 1.221 rillig initialization_expr_using_op(initialization *in, tnode_t *rn) 821 1.116 rillig { 822 1.179 rillig 823 1.179 rillig if (!has_automatic_storage_duration(in->in_sym)) 824 1.179 rillig return false; 825 1.179 rillig if (in->in_brace_level != NULL) 826 1.179 rillig return false; 827 1.179 rillig if (in->in_sym->s_type->t_tspec == ARRAY) 828 1.179 rillig return false; 829 1.1 cgd 830 1.208 rillig debug_step("handing over to INIT"); 831 1.55 rillig 832 1.239 rillig tnode_t *ln = build_name(in->in_sym, false); 833 1.204 rillig ln->tn_type = expr_unqualified_type(ln->tn_type); 834 1.1 cgd 835 1.239 rillig tnode_t *tn = build_binary(ln, INIT, false /* XXX */, rn); 836 1.271 rillig expr(tn, false, false, false, false, "init"); 837 1.1 cgd 838 1.179 rillig return true; 839 1.1 cgd } 840 1.1 cgd 841 1.82 rillig /* Initialize a character array or wchar_t array with a string literal. */ 842 1.62 rillig static bool 843 1.225 rillig initialization_init_array_from_string(initialization *in, tnode_t *tn) 844 1.1 cgd { 845 1.1 cgd 846 1.1 cgd if (tn->tn_op != STRING) 847 1.63 rillig return false; 848 1.1 cgd 849 1.239 rillig const type_t *tp = initialization_sub_type(in); 850 1.213 rillig 851 1.229 rillig if (!can_init_character_array(tp, tn)) 852 1.179 rillig return false; 853 1.119 rillig 854 1.263 rillig size_t len = tn->u.str_literals->len; 855 1.263 rillig if (tn->u.str_literals->data != NULL) { 856 1.261 rillig quoted_iterator it = { .end = 0 }; 857 1.263 rillig for (len = 0; quoted_next(tn->u.str_literals, &it); len++) 858 1.258 rillig continue; 859 1.258 rillig } 860 1.258 rillig 861 1.262 rillig if (!tp->t_incomplete_array && (size_t)tp->u.dimension < len) 862 1.264 rillig /* string literal too long (%ju) for target array (%ju) */ 863 1.264 rillig warning(187, (uintmax_t)len, (uintmax_t)tp->u.dimension); 864 1.119 rillig 865 1.239 rillig brace_level *bl = in->in_brace_level; 866 1.229 rillig if (bl != NULL && bl->bl_designation.dn_len == 0) 867 1.233 rillig (void)designation_descend(&bl->bl_designation, bl->bl_type); 868 1.229 rillig if (bl != NULL) 869 1.229 rillig brace_level_advance(bl, &in->in_max_subscript); 870 1.229 rillig 871 1.275 rillig if (tp->t_incomplete_array) { 872 1.229 rillig update_type_of_array_of_unknown_size(in->in_sym, len + 1); 873 1.275 rillig in->in_sym->u.s_array_nonnull_dimension = len; 874 1.275 rillig } 875 1.1 cgd 876 1.63 rillig return true; 877 1.1 cgd } 878 1.158 rillig 879 1.158 rillig /* 880 1.179 rillig * Initialize a single sub-object as part of the currently ongoing 881 1.179 rillig * initialization. 882 1.158 rillig */ 883 1.179 rillig static void 884 1.221 rillig initialization_expr(initialization *in, tnode_t *tn) 885 1.158 rillig { 886 1.158 rillig 887 1.229 rillig if (in->in_err || tn == NULL) 888 1.179 rillig return; 889 1.158 rillig 890 1.179 rillig debug_enter(); 891 1.158 rillig 892 1.239 rillig brace_level *bl = in->in_brace_level; 893 1.230 rillig if (bl != NULL && !brace_level_goto(bl, tn, &in->in_max_subscript)) { 894 1.229 rillig in->in_err = true; 895 1.229 rillig goto done; 896 1.229 rillig } 897 1.270 rillig if (in->in_sym->s_type->t_tspec == AUTO_TYPE) 898 1.270 rillig in->in_sym->s_type = block_dup_type(tn->tn_type); 899 1.208 rillig if (initialization_expr_using_op(in, tn)) 900 1.179 rillig goto done; 901 1.225 rillig if (initialization_init_array_from_string(in, tn)) 902 1.229 rillig goto done; 903 1.213 rillig if (in->in_err) 904 1.213 rillig goto done; 905 1.158 rillig 906 1.239 rillig const type_t *tp = initialization_sub_type(in); 907 1.179 rillig if (tp == NULL) 908 1.179 rillig goto done; 909 1.158 rillig 910 1.184 rillig if (bl == NULL && !is_scalar(tp->t_tspec)) { 911 1.249 rillig /* {}-enclosed or constant initializer of type '%s' required */ 912 1.249 rillig error(181, type_name(in->in_sym->s_type)); 913 1.179 rillig goto done; 914 1.158 rillig } 915 1.158 rillig 916 1.206 rillig debug_step("expecting '%s', expression has '%s'", 917 1.179 rillig type_name(tp), type_name(tn->tn_type)); 918 1.179 rillig check_init_expr(tp, in->in_sym, tn); 919 1.184 rillig if (bl != NULL) 920 1.219 rillig brace_level_advance(bl, &in->in_max_subscript); 921 1.229 rillig 922 1.179 rillig done: 923 1.158 rillig initialization_debug(in); 924 1.158 rillig debug_leave(); 925 1.158 rillig } 926 1.158 rillig 927 1.158 rillig 928 1.221 rillig static initialization *init; 929 1.158 rillig 930 1.158 rillig 931 1.240 rillig sym_t * 932 1.158 rillig current_initsym(void) 933 1.158 rillig { 934 1.175 rillig 935 1.240 rillig return init->in_sym; 936 1.158 rillig } 937 1.158 rillig 938 1.158 rillig void 939 1.158 rillig begin_initialization(sym_t *sym) 940 1.158 rillig { 941 1.158 rillig 942 1.206 rillig debug_step("begin initialization of '%s'", type_name(sym->s_type)); 943 1.205 rillig debug_indent_inc(); 944 1.179 rillig 945 1.217 rillig init = initialization_new(sym, init); 946 1.158 rillig } 947 1.158 rillig 948 1.158 rillig void 949 1.158 rillig end_initialization(void) 950 1.158 rillig { 951 1.158 rillig 952 1.239 rillig initialization *in = init; 953 1.179 rillig init = in->in_enclosing; 954 1.158 rillig initialization_free(in); 955 1.179 rillig 956 1.205 rillig debug_indent_dec(); 957 1.206 rillig debug_step("end initialization"); 958 1.158 rillig } 959 1.158 rillig 960 1.158 rillig void 961 1.223 rillig begin_designation(void) 962 1.223 rillig { 963 1.223 rillig 964 1.239 rillig initialization *in = init; 965 1.227 rillig if (in->in_err) 966 1.227 rillig return; 967 1.227 rillig 968 1.256 rillig designation *dn = &in->in_brace_level->bl_designation; 969 1.256 rillig dn->dn_len = 0; 970 1.256 rillig designation_debug(dn); 971 1.223 rillig } 972 1.223 rillig 973 1.223 rillig void 974 1.158 rillig add_designator_member(sbuf_t *sb) 975 1.158 rillig { 976 1.175 rillig 977 1.239 rillig initialization_add_designator_member(init, sb->sb_name); 978 1.158 rillig } 979 1.158 rillig 980 1.158 rillig void 981 1.158 rillig add_designator_subscript(range_t range) 982 1.158 rillig { 983 1.175 rillig 984 1.239 rillig initialization_add_designator_subscript(init, range.hi); 985 1.158 rillig } 986 1.158 rillig 987 1.158 rillig void 988 1.158 rillig init_lbrace(void) 989 1.158 rillig { 990 1.175 rillig 991 1.239 rillig initialization_lbrace(init); 992 1.158 rillig } 993 1.158 rillig 994 1.158 rillig void 995 1.179 rillig init_expr(tnode_t *tn) 996 1.158 rillig { 997 1.175 rillig 998 1.239 rillig initialization_expr(init, tn); 999 1.158 rillig } 1000 1.158 rillig 1001 1.158 rillig void 1002 1.158 rillig init_rbrace(void) 1003 1.158 rillig { 1004 1.175 rillig 1005 1.239 rillig initialization_rbrace(init); 1006 1.158 rillig } 1007