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