init.c revision 1.148 1 /* $NetBSD: init.c,v 1.148 2021/03/28 09:20:51 rillig Exp $ */
2
3 /*
4 * Copyright (c) 1994, 1995 Jochen Pohl
5 * All Rights Reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by Jochen Pohl for
18 * The NetBSD Project.
19 * 4. The name of the author may not be used to endorse or promote products
20 * derived from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34 #if HAVE_NBTOOL_CONFIG_H
35 #include "nbtool_config.h"
36 #endif
37
38 #include <sys/cdefs.h>
39 #if defined(__RCSID) && !defined(lint)
40 __RCSID("$NetBSD: init.c,v 1.148 2021/03/28 09:20:51 rillig Exp $");
41 #endif
42
43 #include <stdlib.h>
44 #include <string.h>
45
46 #include "lint1.h"
47
48
49 /*
50 * Initialization
51 *
52 * Handles initializations of global or local objects, like in:
53 *
54 * int number = 12345;
55 * int number_with_braces = { 12345 };
56 *
57 * int array_of_unknown_size[] = { 111, 222, 333 };
58 * int array_flat[2][2] = { 11, 12, 21, 22 };
59 * int array_nested[2][2] = { { 11, 12 }, { 21, 22 } };
60 *
61 * struct { int x, y; } point = { 3, 4 };
62 * struct { int x, y; } point = { .y = 4, .x = 3 };
63 *
64 * Any scalar expression in the initializer may be surrounded by arbitrarily
65 * many extra pairs of braces, like in the example 'number_with_braces' (C99
66 * 6.7.8p11).
67 *
68 * For multi-dimensional arrays, the inner braces may be omitted like in
69 * array_flat or spelled out like in array_nested.
70 *
71 * For the initializer, the grammar parser calls these functions:
72 *
73 * begin_initialization
74 * init_lbrace for each '{'
75 * designation_add_name for each '.member' before '='
76 * designation_add_subscript for each '[123]' before '='
77 * init_using_expr for each expression
78 * init_rbrace for each '}'
79 * end_initialization
80 *
81 * Each '{' begins a new brace level, each '}' ends the current brace level.
82 * Each brace level has an associated "current object".
83 *
84 * Most of the time, the topmost level of brace_level contains a scalar type,
85 * and its remaining count toggles between 1 and 0.
86 *
87 * See also:
88 * C99 6.7.8 "Initialization"
89 * d_c99_init.c for more examples
90 */
91
92
93 /*
94 * Describes a single brace level of an ongoing initialization.
95 *
96 * XXX: Since C99, the initializers can be listed in arbitrary order by using
97 * designators to specify the sub-object to be initialized. The member names
98 * of non-leaf structs may thus appear repeatedly, as demonstrated in
99 * d_init_pop_member.c.
100 *
101 * See C99 6.7.8, which spans 6 pages full of tricky details and carefully
102 * selected examples.
103 */
104 struct brace_level {
105
106 /*
107 * The type of the current object that is initialized at this brace
108 * level.
109 *
110 * On the outermost element, this is always NULL since the outermost
111 * initializer-expression may be enclosed in an optional pair of
112 * braces, as of the current implementation.
113 *
114 * FIXME: This approach is wrong. It's not that the outermost
115 * initializer may be enclosed in additional braces, it's every scalar
116 * that may be enclosed in additional braces, as of C99 6.7.8p11.
117 *
118 * Everywhere else it is nonnull.
119 */
120 type_t *bl_type;
121
122 /*
123 * The type that will be initialized at the next initialization level,
124 * usually enclosed by another pair of braces.
125 *
126 * For an array, it is the element type, but without 'const'.
127 *
128 * For a struct or union type, it is one of the member types, but
129 * without 'const'.
130 *
131 * The outermost stack element has no bl_type but nevertheless has
132 * bl_subtype. For example, in 'int var = { 12345 }', initially there
133 * is a brace_level with bl_subtype 'int'. When the '{' is processed,
134 * an element with bl_type 'int' is pushed to the stack. When the
135 * corresponding '}' is processed, the inner element is popped again.
136 *
137 * During initialization, only the top 2 elements of the stack are
138 * looked at.
139 *
140 * XXX: Having bl_subtype here is the wrong approach, it should not be
141 * necessary at all; see bl_type.
142 */
143 type_t *bl_subtype;
144
145 /*
146 * Whether this level of the initializer requires a '}' to be
147 * completed.
148 *
149 * Multidimensional arrays do not need a closing brace to complete
150 * an inner array; for example, { 1, 2, 3, 4 } is a valid initializer
151 * for 'int arr[2][2]'.
152 *
153 * XXX: Double-check whether this is the correct approach at all; see
154 * bl_type.
155 */
156 bool bl_brace: 1;
157
158 /* Whether bl_type is an array of unknown size. */
159 bool bl_array_of_unknown_size: 1;
160
161 /*
162 * XXX: This feels wrong. Whether or not there has been a named
163 * initializer (called 'designation' since C99) should not matter at
164 * all. Even after an initializer with designation, counting of the
165 * remaining elements continues, see C99 6.7.8p17.
166 */
167 bool bl_seen_named_member: 1;
168
169 /*
170 * For structs, the next member to be initialized by a designator-less
171 * initializer.
172 */
173 sym_t *bl_next_member;
174
175 /* TODO: Add bl_next_subscript for arrays. */
176
177 /* TODO: Understand C99 6.7.8p17 and footnote 128 for unions. */
178
179 /*
180 * The number of remaining elements to be used by expressions without
181 * designator.
182 *
183 * This says nothing about which members have been initialized or not
184 * since starting with C99, members may be initialized in arbitrary
185 * order by using designators.
186 *
187 * For an array of unknown size, this is always 0 and thus irrelevant.
188 *
189 * XXX: for scalars?
190 * XXX: for structs?
191 * XXX: for unions?
192 * XXX: for arrays?
193 *
194 * XXX: Having the count of remaining objects should not be necessary.
195 * It is probably clearer to use bl_next_member and bl_next_subscript
196 * for this purpose.
197 */
198 int bl_remaining;
199
200 /*
201 * The initialization state of the enclosing data structure
202 * (struct, union, array).
203 *
204 * XXX: Or for a scalar, for the top-level element, or for expressions
205 * in redundant braces such as '{{{{ 0 }}}}' (not yet implemented as
206 * of 2021-03-25).
207 */
208 struct brace_level *bl_enclosing;
209 };
210
211 /*
212 * A single component on the path to the sub-object that is initialized by an
213 * initializer expression. Either a struct or union member, or an array
214 * subscript.
215 *
216 * See also: C99 6.7.8 "Initialization"
217 */
218 struct designator {
219 const char *name; /* for struct and union */
220 /* TODO: add 'subscript' for arrays */
221 struct designator *next;
222 };
223
224 /*
225 * The optional designation for an initializer, saying which sub-object to
226 * initialize. Examples for designations are '.member' or
227 * '.member[123].member.member[1][1]'.
228 *
229 * See also: C99 6.7.8 "Initialization"
230 */
231 struct designation {
232 struct designator *head;
233 struct designator *tail;
234 };
235
236 struct initialization {
237 /*
238 * is set as soon as a fatal error occurred in the initialization.
239 * The effect is that the rest of the initialization is ignored
240 * (parsed by yacc, expression trees built, but no initialization
241 * takes place).
242 */
243 bool initerr;
244
245 /* The symbol that is to be initialized. */
246 sym_t *initsym;
247
248 /* The innermost brace level. */
249 struct brace_level *brace_level;
250
251 /*
252 * The C99 designator, if any, for the current initialization
253 * expression.
254 */
255 struct designation designation;
256
257 struct initialization *next;
258 };
259
260
261 static struct initialization *init;
262
263 #ifdef DEBUG
264 static int debug_ind = 0;
265 #endif
266
267
268 #ifdef DEBUG
269
270 static void __printflike(1, 2)
271 debug_printf(const char *fmt, ...)
272 {
273 va_list va;
274
275 va_start(va, fmt);
276 vfprintf(stdout, fmt, va);
277 va_end(va);
278 }
279
280 static void
281 debug_indent(void)
282 {
283 debug_printf("%*s", 2 * debug_ind, "");
284 }
285
286 static void
287 debug_enter(const char *func)
288 {
289 printf("%*s+ %s\n", 2 * debug_ind++, "", func);
290 }
291
292 static void __printflike(1, 2)
293 debug_step(const char *fmt, ...)
294 {
295 va_list va;
296
297 debug_indent();
298 va_start(va, fmt);
299 vfprintf(stdout, fmt, va);
300 va_end(va);
301 printf("\n");
302 }
303
304 static void
305 debug_leave(const char *func)
306 {
307 printf("%*s- %s\n", 2 * --debug_ind, "", func);
308 }
309
310 #else
311
312 #define debug_printf(fmt, ...) do { } while (false)
313 #define debug_indent() do { } while (false)
314 #define debug_enter(function) do { } while (false)
315 #define debug_step(fmt, ...) do { } while (false)
316 #define debug_leave(function) do { } while (false)
317
318 #endif
319
320
321 static struct designator *
322 designator_new(const char *name)
323 {
324 struct designator *d = xcalloc(1, sizeof *d);
325 d->name = name;
326 return d;
327 }
328
329 static void
330 designator_free(struct designator *d)
331 {
332 free(d);
333 }
334
335
336 #ifdef DEBUG
337 static void
338 designation_debug(const struct designation *dn)
339 {
340 const struct designator *p;
341
342 if (dn->head == NULL)
343 return;
344
345 debug_indent();
346 debug_printf("designation: ");
347 for (p = dn->head; p != NULL; p = p->next)
348 debug_printf(".%s", p->name);
349 debug_printf("\n");
350 }
351 #else
352 #define designation_debug(dn) do { } while (false)
353 #endif
354
355 static void
356 designation_add(struct designation *dn, struct designator *dr)
357 {
358
359 if (dn->head != NULL) {
360 dn->tail->next = dr;
361 dn->tail = dr;
362 } else {
363 dn->head = dr;
364 dn->tail = dr;
365 }
366
367 designation_debug(dn);
368 }
369
370 /* TODO: add support for array subscripts, not only named members */
371 /*
372 * TODO: This function should not be necessary at all. There is no need to
373 * remove the head of the list.
374 */
375 static void
376 designation_shift_level(struct designation *dn)
377 {
378 lint_assert(dn->head != NULL);
379
380 if (dn->head == dn->tail) {
381 designator_free(dn->head);
382 dn->head = NULL;
383 dn->tail = NULL;
384 } else {
385 struct designator *head = dn->head;
386 dn->head = dn->head->next;
387 designator_free(head);
388 }
389
390 designation_debug(dn);
391 }
392
393
394 #ifdef DEBUG
395 /*
396 * TODO: only log the top of the stack after each modifying operation
397 *
398 * TODO: wrap all write accesses to brace_level in setter functions
399 */
400 static void
401 brace_level_debug(const struct brace_level *level)
402 {
403 if (level->bl_type != NULL)
404 debug_printf("type '%s'", type_name(level->bl_type));
405 if (level->bl_type != NULL && level->bl_subtype != NULL)
406 debug_printf(", ");
407 if (level->bl_subtype != NULL)
408 debug_printf("subtype '%s'", type_name(level->bl_subtype));
409
410 if (level->bl_brace)
411 debug_printf(", needs closing brace");
412 if (level->bl_array_of_unknown_size)
413 debug_printf(", array of unknown size");
414 if (level->bl_seen_named_member)
415 debug_printf(", seen named member");
416
417 const type_t *eff_type = level->bl_type != NULL
418 ? level->bl_type : level->bl_subtype;
419 if (eff_type->t_tspec == STRUCT && level->bl_next_member != NULL)
420 debug_printf(", next member '%s'",
421 level->bl_next_member->s_name);
422
423 debug_printf(", remaining %d\n", level->bl_remaining);
424 }
425 #else
426 #define brace_level_debug(level) do { } while (false)
427 #endif
428
429 static const sym_t *
430 brace_level_look_up_member(const struct brace_level *level, const char *name)
431 {
432 const type_t *tp = level->bl_type;
433 const sym_t *m;
434
435 lint_assert(tp->t_tspec == STRUCT || tp->t_tspec == UNION);
436
437 for (m = tp->t_str->sou_first_member; m != NULL; m = m->s_next) {
438 if (m->s_bitfield && m->s_name == unnamed)
439 continue;
440 if (strcmp(m->s_name, name) == 0)
441 return m;
442 }
443
444 return NULL;
445 }
446
447 /* TODO: merge duplicate code */
448 static sym_t *
449 brace_level_look_up_member_bloated(struct brace_level *level,
450 const struct designator *dr, int *count)
451 {
452 sym_t *m;
453
454 for (m = level->bl_type->t_str->sou_first_member;
455 m != NULL; m = m->s_next) {
456 if (m->s_bitfield && m->s_name == unnamed)
457 continue;
458 /*
459 * TODO: split into separate functions:
460 *
461 * look_up_array_next
462 * look_up_array_designator
463 * look_up_struct_next
464 * look_up_struct_designator
465 */
466 if (dr != NULL) {
467 /* XXX: this log entry looks unnecessarily verbose */
468 debug_step("have member '%s', want member '%s'",
469 m->s_name, dr->name);
470 if (strcmp(m->s_name, dr->name) == 0) {
471 (*count)++;
472 break;
473 } else
474 continue;
475 }
476
477 /* XXX: What is this code for? */
478 if (++(*count) == 1) {
479 level->bl_next_member = m;
480 level->bl_subtype = m->s_type;
481 }
482 }
483
484 return m;
485 }
486
487
488 static struct initialization *
489 initialization_new(sym_t *sym)
490 {
491 struct initialization *in = xcalloc(1, sizeof(*in));
492
493 in->initsym = sym;
494
495 return in;
496 }
497
498 static void
499 initialization_free(struct initialization *in)
500 {
501 struct brace_level *level, *next;
502
503 for (level = in->brace_level; level != NULL; level = next) {
504 next = level->bl_enclosing;
505 free(level);
506 }
507
508 free(in);
509 }
510
511 #ifdef DEBUG
512 /*
513 * TODO: only call debug_initstack after each push/pop.
514 */
515 static void
516 initialization_debug(const struct initialization *in)
517 {
518 if (in->brace_level == NULL) {
519 debug_step("no brace level in the current initialization");
520 return;
521 }
522
523 size_t i = 0;
524 for (const struct brace_level *level = in->brace_level;
525 level != NULL; level = level->bl_enclosing) {
526 debug_indent();
527 debug_printf("brace level %zu: ", i);
528 brace_level_debug(level);
529 i++;
530 }
531 }
532 #else
533 #define initialization_debug(in) do { } while (false)
534 #endif
535
536 /* XXX: unnecessary prototype since it is not recursive */
537 static bool init_array_using_string(struct initialization *, tnode_t *);
538
539
540 static struct initialization *
541 current_init(void)
542 {
543 lint_assert(init != NULL);
544 return init;
545 }
546
547 bool *
548 current_initerr(void)
549 {
550 return ¤t_init()->initerr;
551 }
552
553 sym_t **
554 current_initsym(void)
555 {
556 return ¤t_init()->initsym;
557 }
558
559 static const struct brace_level *
560 current_brace_level(void)
561 {
562 return current_init()->brace_level;
563 }
564
565 static struct brace_level **
566 current_brace_level_lvalue(void)
567 {
568 return ¤t_init()->brace_level;
569 }
570
571 static void
572 set_initerr(void)
573 {
574 current_init()->initerr = true;
575 }
576
577 #define initerr (*current_initerr())
578 #define initsym (*current_initsym())
579 #define brace_level_rvalue (current_brace_level())
580 #define brace_level_lvalue (*current_brace_level_lvalue())
581
582 #ifndef DEBUG
583
584 #define debug_designation() do { } while (false)
585 #define debug_brace_level(level) do { } while (false)
586 #define debug_initstack() do { } while (false)
587
588 #else
589
590
591 #define debug_enter() debug_enter(__func__)
592 #define debug_leave() debug_leave(__func__)
593
594 #endif
595
596
597 void
598 begin_initialization(sym_t *sym)
599 {
600 struct initialization *curr_init;
601
602 debug_step("begin initialization of '%s'", type_name(sym->s_type));
603 curr_init = initialization_new(sym);
604 curr_init->next = init;
605 init = curr_init;
606 }
607
608 void
609 end_initialization(void)
610 {
611 struct initialization *curr_init;
612
613 curr_init = init;
614 init = init->next;
615 initialization_free(curr_init);
616 debug_step("end initialization");
617 }
618
619
620
621 void
622 designation_add_name(sbuf_t *sb)
623 {
624 designation_add(¤t_init()->designation,
625 designator_new(sb->sb_name));
626 }
627
628 /* TODO: Move the function body up here, to avoid the forward declaration. */
629 static void initstack_pop_nobrace(struct initialization *);
630
631 static struct brace_level *
632 brace_level_new(type_t *type, type_t *subtype, int remaining)
633 {
634 struct brace_level *level = xcalloc(1, sizeof(*level));
635
636 level->bl_type = type;
637 level->bl_subtype = subtype;
638 level->bl_remaining = remaining;
639
640 return level;
641 }
642
643 static void
644 brace_level_set_array_dimension(int dim)
645 {
646 debug_step("setting the array size to %d", dim);
647 brace_level_lvalue->bl_type->t_dim = dim;
648 debug_indent();
649 brace_level_debug(brace_level_rvalue);
650 }
651
652 static void
653 brace_level_next_member(struct brace_level *level)
654 {
655 const sym_t *m;
656
657 do {
658 m = level->bl_next_member = level->bl_next_member->s_next;
659 /* XXX: can this assertion be made to fail? */
660 lint_assert(m != NULL);
661 } while (m->s_bitfield && m->s_name == unnamed);
662
663 debug_indent();
664 brace_level_debug(level);
665 }
666
667 /*
668 * A sub-object of an array is initialized using a designator. This does not
669 * have to be an array element directly, it can also be used to initialize
670 * only a sub-object of the array element.
671 *
672 * C99 example: struct { int member[4]; } var = { [2] = 12345 };
673 *
674 * GNU example: struct { int member[4]; } var = { [1 ... 3] = 12345 };
675 *
676 * TODO: test the following initialization with an outer and an inner type:
677 *
678 * .deeply[0].nested = {
679 * .deeply[1].nested = {
680 * 12345,
681 * },
682 * }
683 */
684 void
685 designation_add_subscript(range_t range)
686 {
687 struct brace_level *level;
688
689 debug_enter();
690 if (range.lo == range.hi)
691 debug_step("subscript is %zu", range.hi);
692 else
693 debug_step("subscript range is %zu ... %zu",
694 range.lo, range.hi);
695
696 /* XXX: This call is wrong here, it must be somewhere else. */
697 initstack_pop_nobrace(current_init());
698
699 level = brace_level_lvalue;
700 if (level->bl_array_of_unknown_size) {
701 /* No +1 here, extend_if_array_of_unknown_size will add it. */
702 int auto_dim = (int)range.hi;
703 if (auto_dim > level->bl_type->t_dim)
704 brace_level_set_array_dimension(auto_dim);
705 }
706
707 debug_leave();
708 }
709
710
711 /*
712 * Initialize the initialization stack by putting an entry for the object
713 * which is to be initialized on it.
714 *
715 * TODO: merge into begin_initialization
716 */
717 void
718 initstack_init(void)
719 {
720
721 if (initerr)
722 return;
723
724 debug_enter();
725
726 /*
727 * If the type which is to be initialized is an incomplete array,
728 * it must be duplicated.
729 */
730 if (initsym->s_type->t_tspec == ARRAY && is_incomplete(initsym->s_type))
731 initsym->s_type = duptyp(initsym->s_type);
732 /* TODO: does 'duptyp' create a memory leak? */
733
734 brace_level_lvalue = brace_level_new(NULL, initsym->s_type, 1);
735
736 initialization_debug(current_init());
737 debug_leave();
738 }
739
740 /* TODO: document me */
741 static void
742 initstack_pop_item_named_member(const char *name)
743 {
744 struct initialization *in = current_init();
745 struct brace_level *level = in->brace_level;
746 const sym_t *m;
747
748 /*
749 * TODO: fix wording of the debug message; this doesn't seem to be
750 * related to initializing the named member.
751 */
752 debug_step("initializing named member '%s'", name);
753
754 if (level->bl_type->t_tspec != STRUCT &&
755 level->bl_type->t_tspec != UNION) {
756 /* syntax error '%s' */
757 error(249, "named member must only be used with struct/union");
758 set_initerr();
759 return;
760 }
761
762 m = brace_level_look_up_member(level, name);
763 if (m == NULL) {
764 /* TODO: add type information to the message */
765 /* undefined struct/union member: %s */
766 error(101, name);
767
768 designation_shift_level(&in->designation);
769 level->bl_seen_named_member = true;
770 return;
771 }
772
773 debug_step("found matching member");
774 level->bl_subtype = m->s_type;
775 /* XXX: why ++? */
776 level->bl_remaining++;
777 /* XXX: why is bl_seen_named_member not set? */
778 designation_shift_level(&in->designation);
779 }
780
781 /* TODO: think of a better name than 'pop' */
782 static void
783 initstack_pop_item_unnamed(void)
784 {
785 struct brace_level *level = brace_level_lvalue;
786
787 /*
788 * If the removed element was a structure member, we must go
789 * to the next structure member.
790 */
791 if (level->bl_remaining > 0 && level->bl_type->t_tspec == STRUCT &&
792 !level->bl_seen_named_member) {
793 brace_level_next_member(level);
794 level->bl_subtype = level->bl_next_member->s_type;
795 }
796 }
797
798 /* TODO: think of a better name than 'pop' */
799 static void
800 initstack_pop_item(struct initialization *in)
801 {
802 struct brace_level *level;
803
804 debug_enter();
805
806 level = brace_level_lvalue;
807 debug_indent();
808 debug_printf("popping: ");
809 brace_level_debug(level);
810
811 brace_level_lvalue = level->bl_enclosing;
812 free(level);
813 level = brace_level_lvalue;
814 lint_assert(level != NULL);
815
816 level->bl_remaining--;
817 lint_assert(level->bl_remaining >= 0);
818 debug_step("%d elements remaining", level->bl_remaining);
819
820 if (in->designation.head != NULL && in->designation.head->name != NULL)
821 initstack_pop_item_named_member(in->designation.head->name);
822 else
823 initstack_pop_item_unnamed();
824
825 initialization_debug(current_init());
826 debug_leave();
827 }
828
829 /*
830 * Take all entries, including the first which requires a closing brace,
831 * from the stack.
832 */
833 static void
834 initstack_pop_brace(struct initialization *in)
835 {
836 bool brace;
837
838 debug_enter();
839 initialization_debug(in);
840 do {
841 brace = brace_level_rvalue->bl_brace;
842 /* TODO: improve wording of the debug message */
843 debug_step("loop brace=%d", brace);
844 initstack_pop_item(in);
845 } while (!brace);
846 initialization_debug(in);
847 debug_leave();
848 }
849
850 /*
851 * Take all entries which cannot be used for further initializers from the
852 * stack, but do this only if they do not require a closing brace.
853 */
854 /* TODO: think of a better name than 'pop' */
855 static void
856 initstack_pop_nobrace(struct initialization *in)
857 {
858
859 debug_enter();
860 while (!in->brace_level->bl_brace &&
861 in->brace_level->bl_remaining == 0 &&
862 !in->brace_level->bl_array_of_unknown_size)
863 initstack_pop_item(in);
864 debug_leave();
865 }
866
867 /* Extend an array of unknown size by one element */
868 static void
869 extend_if_array_of_unknown_size(void)
870 {
871 struct brace_level *level = brace_level_lvalue;
872
873 if (level->bl_remaining != 0)
874 return;
875 /*
876 * XXX: According to the function name, there should be a 'return' if
877 * bl_array_of_unknown_size is false. There's probably a test missing
878 * for that case.
879 */
880
881 /*
882 * The only place where an incomplete array may appear is at the
883 * outermost aggregate level of the object to be initialized.
884 */
885 lint_assert(level->bl_enclosing->bl_enclosing == NULL);
886 lint_assert(level->bl_type->t_tspec == ARRAY);
887
888 debug_step("extending array of unknown size '%s'",
889 type_name(level->bl_type));
890 level->bl_remaining = 1;
891 level->bl_type->t_dim++;
892 setcomplete(level->bl_type, true);
893
894 debug_step("extended type is '%s'", type_name(level->bl_type));
895 }
896
897 /* TODO: document me */
898 /* TODO: think of a better name than 'push' */
899 static void
900 initstack_push_array(struct initialization *in)
901 {
902 struct brace_level *level = in->brace_level;
903
904 if (level->bl_enclosing->bl_seen_named_member) {
905 level->bl_brace = true;
906 debug_step("ARRAY%s%s",
907 level->bl_brace ? ", needs closing brace" : "",
908 /* TODO: this is redundant, always true */
909 level->bl_enclosing->bl_seen_named_member
910 ? ", seen named member" : "");
911 }
912
913 if (is_incomplete(level->bl_type) &&
914 level->bl_enclosing->bl_enclosing != NULL) {
915 /* initialization of an incomplete type */
916 error(175);
917 set_initerr();
918 return;
919 }
920
921 level->bl_subtype = level->bl_type->t_subt;
922 level->bl_array_of_unknown_size = is_incomplete(level->bl_type);
923 level->bl_remaining = level->bl_type->t_dim;
924 designation_debug(&in->designation);
925 debug_step("type '%s' remaining %d",
926 type_name(level->bl_type), level->bl_remaining);
927 }
928
929
930 /* TODO: document me */
931 /* TODO: think of a better name than 'push' */
932 static bool
933 initstack_push_struct_or_union(struct initialization *in)
934 {
935 /*
936 * TODO: remove unnecessary 'const' for variables in functions that
937 * fit on a single screen. Keep it for larger functions.
938 */
939 struct brace_level *level = brace_level_lvalue;
940 int cnt;
941 sym_t *m;
942
943 if (is_incomplete(level->bl_type)) {
944 /* initialization of an incomplete type */
945 error(175);
946 set_initerr();
947 return false;
948 }
949
950 cnt = 0;
951 designation_debug(&in->designation);
952 debug_step("lookup for '%s'%s",
953 type_name(level->bl_type),
954 level->bl_seen_named_member ? ", seen named member" : "");
955
956 m = brace_level_look_up_member_bloated(level,
957 in->designation.head, &cnt);
958
959 if (in->designation.head != NULL) {
960 if (m == NULL) {
961 debug_step("pop struct");
962 return true;
963 }
964 level->bl_next_member = m;
965 level->bl_subtype = m->s_type;
966 level->bl_seen_named_member = true;
967 debug_step("named member '%s'",
968 in->designation.head->name);
969 designation_shift_level(&in->designation);
970 cnt = level->bl_type->t_tspec == STRUCT ? 2 : 1;
971 }
972 level->bl_brace = true;
973 debug_step("unnamed element with type '%s'%s",
974 type_name(
975 level->bl_type != NULL ? level->bl_type : level->bl_subtype),
976 level->bl_brace ? ", needs closing brace" : "");
977 if (cnt == 0) {
978 /* cannot init. struct/union with no named member */
979 error(179);
980 set_initerr();
981 return false;
982 }
983 level->bl_remaining = level->bl_type->t_tspec == STRUCT ? cnt : 1;
984 return false;
985 }
986
987 /* TODO: document me */
988 /* TODO: think of a better name than 'push' */
989 static void
990 initstack_push(struct initialization *in)
991 {
992 struct brace_level *level, *enclosing;
993
994 debug_enter();
995
996 extend_if_array_of_unknown_size();
997
998 level = brace_level_lvalue;
999 lint_assert(level->bl_remaining > 0);
1000 lint_assert(level->bl_type == NULL ||
1001 !is_scalar(level->bl_type->t_tspec));
1002
1003 brace_level_lvalue = xcalloc(1, sizeof *brace_level_lvalue);
1004 brace_level_lvalue->bl_enclosing = level;
1005 brace_level_lvalue->bl_type = level->bl_subtype;
1006 lint_assert(brace_level_lvalue->bl_type->t_tspec != FUNC);
1007
1008 again:
1009 level = brace_level_lvalue;
1010
1011 debug_step("expecting type '%s'", type_name(level->bl_type));
1012 lint_assert(level->bl_type != NULL);
1013 switch (level->bl_type->t_tspec) {
1014 case ARRAY:
1015 if (in->designation.head != NULL) {
1016 debug_step("pop array, named member '%s'%s",
1017 in->designation.head->name,
1018 level->bl_brace ? ", needs closing brace" : "");
1019 goto pop;
1020 }
1021
1022 initstack_push_array(in);
1023 break;
1024
1025 case UNION:
1026 if (tflag)
1027 /* initialization of union is illegal in trad. C */
1028 warning(238);
1029 /* FALLTHROUGH */
1030 case STRUCT:
1031 if (initstack_push_struct_or_union(in))
1032 goto pop;
1033 break;
1034 default:
1035 if (in->designation.head != NULL) {
1036 debug_step("pop scalar");
1037 pop:
1038 /* TODO: extract this into end_initializer_level */
1039 enclosing = brace_level_rvalue->bl_enclosing;
1040 free(level);
1041 brace_level_lvalue = enclosing;
1042 goto again;
1043 }
1044 /* The initialization stack now expects a single scalar. */
1045 level->bl_remaining = 1;
1046 break;
1047 }
1048
1049 initialization_debug(current_init());
1050 debug_leave();
1051 }
1052
1053 static void
1054 check_too_many_initializers(void)
1055 {
1056 const struct brace_level *level = brace_level_rvalue;
1057 if (level->bl_remaining > 0)
1058 return;
1059 /*
1060 * FIXME: even with named members, there can be too many initializers
1061 */
1062 if (level->bl_array_of_unknown_size || level->bl_seen_named_member)
1063 return;
1064
1065 tspec_t t = level->bl_type->t_tspec;
1066 if (t == ARRAY) {
1067 /* too many array initializers, expected %d */
1068 error(173, level->bl_type->t_dim);
1069 } else if (t == STRUCT || t == UNION) {
1070 /* too many struct/union initializers */
1071 error(172);
1072 } else {
1073 /* too many initializers */
1074 error(174);
1075 }
1076 set_initerr();
1077 }
1078
1079 /*
1080 * Process a '{' in an initializer by starting the initialization of the
1081 * nested data structure, with bl_type being the bl_subtype of the outer
1082 * initialization level.
1083 */
1084 static void
1085 initstack_next_brace(struct initialization *in)
1086 {
1087
1088 debug_enter();
1089 initialization_debug(in);
1090
1091 if (brace_level_rvalue->bl_type != NULL &&
1092 is_scalar(brace_level_rvalue->bl_type->t_tspec)) {
1093 /* invalid initializer type %s */
1094 error(176, type_name(brace_level_rvalue->bl_type));
1095 set_initerr();
1096 }
1097 if (!initerr)
1098 check_too_many_initializers();
1099 if (!initerr)
1100 initstack_push(in);
1101 if (!initerr) {
1102 brace_level_lvalue->bl_brace = true;
1103 designation_debug(&in->designation);
1104 debug_step("expecting type '%s'",
1105 type_name(brace_level_rvalue->bl_type != NULL
1106 ? brace_level_rvalue->bl_type
1107 : brace_level_rvalue->bl_subtype));
1108 }
1109
1110 initialization_debug(current_init());
1111 debug_leave();
1112 }
1113
1114 /* TODO: document me, or think of a better name */
1115 static void
1116 initstack_next_nobrace(struct initialization *in, tnode_t *tn)
1117 {
1118 debug_enter();
1119
1120 if (brace_level_rvalue->bl_type == NULL &&
1121 !is_scalar(brace_level_rvalue->bl_subtype->t_tspec)) {
1122 /* {}-enclosed initializer required */
1123 error(181);
1124 /* XXX: maybe set initerr here */
1125 }
1126
1127 if (!initerr)
1128 check_too_many_initializers();
1129
1130 while (!initerr) {
1131 struct brace_level *level = brace_level_lvalue;
1132
1133 if (tn->tn_type->t_tspec == STRUCT &&
1134 level->bl_type == tn->tn_type &&
1135 level->bl_enclosing != NULL &&
1136 level->bl_enclosing->bl_enclosing != NULL) {
1137 level->bl_brace = false;
1138 level->bl_remaining = 1; /* the struct itself */
1139 break;
1140 }
1141
1142 if (level->bl_type != NULL &&
1143 is_scalar(level->bl_type->t_tspec))
1144 break;
1145 initstack_push(in);
1146 }
1147
1148 initialization_debug(current_init());
1149 debug_leave();
1150 }
1151
1152 /* TODO: document me */
1153 void
1154 init_lbrace(void)
1155 {
1156 struct initialization *in = current_init();
1157
1158 if (initerr)
1159 return;
1160
1161 debug_enter();
1162 initialization_debug(in);
1163
1164 if ((initsym->s_scl == AUTO || initsym->s_scl == REG) &&
1165 brace_level_rvalue->bl_enclosing == NULL) {
1166 if (tflag &&
1167 !is_scalar(brace_level_rvalue->bl_subtype->t_tspec))
1168 /* no automatic aggregate initialization in trad. C */
1169 warning(188);
1170 }
1171
1172 /*
1173 * Remove all entries which cannot be used for further initializers
1174 * and do not expect a closing brace.
1175 */
1176 initstack_pop_nobrace(in);
1177
1178 initstack_next_brace(in);
1179
1180 initialization_debug(in);
1181 debug_leave();
1182 }
1183
1184 /*
1185 * Process a '}' in an initializer by finishing the current level of the
1186 * initialization stack.
1187 */
1188 void
1189 init_rbrace(void)
1190 {
1191 if (initerr)
1192 return;
1193
1194 debug_enter();
1195 initstack_pop_brace(current_init());
1196 debug_leave();
1197 }
1198
1199 /* In traditional C, bit-fields can be initialized only by integer constants. */
1200 static void
1201 check_bit_field_init(const tnode_t *ln, tspec_t lt, tspec_t rt)
1202 {
1203 if (tflag &&
1204 is_integer(lt) &&
1205 ln->tn_type->t_bitfield &&
1206 !is_integer(rt)) {
1207 /* bit-field initialization is illegal in traditional C */
1208 warning(186);
1209 }
1210 }
1211
1212 static void
1213 check_non_constant_initializer(const tnode_t *tn, scl_t sclass)
1214 {
1215 /* TODO: rename CON to CONSTANT to avoid ambiguity with CONVERT */
1216 if (tn == NULL || tn->tn_op == CON)
1217 return;
1218
1219 sym_t *sym;
1220 ptrdiff_t offs;
1221 if (constant_addr(tn, &sym, &offs))
1222 return;
1223
1224 if (sclass == AUTO || sclass == REG) {
1225 /* non-constant initializer */
1226 c99ism(177);
1227 } else {
1228 /* non-constant initializer */
1229 error(177);
1230 }
1231 }
1232
1233 /*
1234 * Initialize a non-array object with automatic storage duration and only a
1235 * single initializer expression without braces by delegating to ASSIGN.
1236 */
1237 static bool
1238 init_using_assign(tnode_t *rn)
1239 {
1240 tnode_t *ln, *tn;
1241
1242 if (initsym->s_type->t_tspec == ARRAY)
1243 return false;
1244 if (brace_level_rvalue->bl_enclosing != NULL)
1245 return false;
1246
1247 debug_step("handing over to ASSIGN");
1248
1249 ln = new_name_node(initsym, 0);
1250 ln->tn_type = tduptyp(ln->tn_type);
1251 ln->tn_type->t_const = false;
1252
1253 tn = build(ASSIGN, ln, rn);
1254 expr(tn, false, false, false, false);
1255
1256 /* XXX: why not clean up the initstack here already? */
1257 return true;
1258 }
1259
1260 static void
1261 check_init_expr(tnode_t *tn, scl_t sclass)
1262 {
1263 tnode_t *ln;
1264 tspec_t lt, rt;
1265 struct mbl *tmem;
1266
1267 /* Create a temporary node for the left side. */
1268 ln = tgetblk(sizeof *ln);
1269 ln->tn_op = NAME;
1270 ln->tn_type = tduptyp(brace_level_rvalue->bl_type);
1271 ln->tn_type->t_const = false;
1272 ln->tn_lvalue = true;
1273 ln->tn_sym = initsym; /* better than nothing */
1274
1275 tn = cconv(tn);
1276
1277 lt = ln->tn_type->t_tspec;
1278 rt = tn->tn_type->t_tspec;
1279
1280 debug_step("typeok '%s', '%s'",
1281 type_name(ln->tn_type), type_name(tn->tn_type));
1282 if (!typeok(INIT, 0, ln, tn))
1283 return;
1284
1285 /*
1286 * Preserve the tree memory. This is necessary because otherwise
1287 * expr() would free it.
1288 */
1289 tmem = tsave();
1290 expr(tn, true, false, true, false);
1291 trestor(tmem);
1292
1293 check_bit_field_init(ln, lt, rt);
1294
1295 /*
1296 * XXX: Is it correct to do this conversion _after_ the typeok above?
1297 */
1298 if (lt != rt ||
1299 (brace_level_rvalue->bl_type->t_bitfield && tn->tn_op == CON))
1300 tn = convert(INIT, 0, brace_level_rvalue->bl_type, tn);
1301
1302 check_non_constant_initializer(tn, sclass);
1303 }
1304
1305 void
1306 init_using_expr(tnode_t *tn)
1307 {
1308 struct initialization *in = current_init();
1309 scl_t sclass;
1310
1311 debug_enter();
1312 initialization_debug(current_init());
1313 designation_debug(&in->designation);
1314 debug_step("expr:");
1315 debug_node(tn, debug_ind + 1);
1316
1317 if (initerr || tn == NULL)
1318 goto done;
1319
1320 sclass = initsym->s_scl;
1321 if ((sclass == AUTO || sclass == REG) && init_using_assign(tn))
1322 goto done;
1323
1324 initstack_pop_nobrace(in);
1325
1326 if (init_array_using_string(in, tn)) {
1327 debug_step("after initializing the string:");
1328 /* XXX: why not clean up the initstack here already? */
1329 goto done_initstack;
1330 }
1331
1332 initstack_next_nobrace(in, tn);
1333 if (initerr || tn == NULL)
1334 goto done_initstack;
1335
1336 brace_level_lvalue->bl_remaining--;
1337 debug_step("%d elements remaining", brace_level_rvalue->bl_remaining);
1338
1339 check_init_expr(tn, sclass);
1340
1341 done_initstack:
1342 initialization_debug(current_init());
1343
1344 done:
1345 while (in->designation.head != NULL)
1346 designation_shift_level(&in->designation);
1347
1348 debug_leave();
1349 }
1350
1351
1352 /* Initialize a character array or wchar_t array with a string literal. */
1353 static bool
1354 init_array_using_string(struct initialization *in, tnode_t *tn)
1355 {
1356 tspec_t t;
1357 struct brace_level *level;
1358 int len;
1359 strg_t *strg;
1360
1361 if (tn->tn_op != STRING)
1362 return false;
1363
1364 debug_enter();
1365 initialization_debug(current_init());
1366
1367 level = brace_level_lvalue;
1368 strg = tn->tn_string;
1369
1370 /*
1371 * Check if we have an array type which can be initialized by
1372 * the string.
1373 */
1374 if (level->bl_subtype != NULL && level->bl_subtype->t_tspec == ARRAY) {
1375 debug_step("subt array");
1376 t = level->bl_subtype->t_subt->t_tspec;
1377 if (!((strg->st_tspec == CHAR &&
1378 (t == CHAR || t == UCHAR || t == SCHAR)) ||
1379 (strg->st_tspec == WCHAR && t == WCHAR))) {
1380 debug_leave();
1381 return false;
1382 }
1383 /* XXX: duplicate code, see below */
1384
1385 /* Put the array at top of stack */
1386 initstack_push(in);
1387 level = brace_level_lvalue;
1388
1389 /* TODO: what if both bl_type and bl_subtype are ARRAY? */
1390
1391 } else if (level->bl_type != NULL && level->bl_type->t_tspec == ARRAY) {
1392 debug_step("type array");
1393 t = level->bl_type->t_subt->t_tspec;
1394 if (!((strg->st_tspec == CHAR &&
1395 (t == CHAR || t == UCHAR || t == SCHAR)) ||
1396 (strg->st_tspec == WCHAR && t == WCHAR))) {
1397 debug_leave();
1398 return false;
1399 }
1400 /* XXX: duplicate code, see above */
1401
1402 /*
1403 * TODO: is this really not needed in the branch above this
1404 * one?
1405 */
1406 /*
1407 * If the array is already partly initialized, we are
1408 * wrong here.
1409 */
1410 if (level->bl_remaining != level->bl_type->t_dim) {
1411 debug_leave();
1412 return false;
1413 }
1414 } else {
1415 debug_leave();
1416 return false;
1417 }
1418
1419 /* Get length without trailing NUL character. */
1420 len = strg->st_len;
1421
1422 if (level->bl_array_of_unknown_size) {
1423 level->bl_array_of_unknown_size = false;
1424 level->bl_type->t_dim = len + 1;
1425 setcomplete(level->bl_type, true);
1426 } else {
1427 /*
1428 * TODO: check for buffer overflow in the object to be
1429 * initialized
1430 */
1431 /* XXX: double-check for off-by-one error */
1432 if (level->bl_type->t_dim < len) {
1433 /* non-null byte ignored in string initializer */
1434 warning(187);
1435 }
1436
1437 /*
1438 * TODO: C99 6.7.8p14 allows a string literal to be enclosed
1439 * in optional redundant braces, just like scalars. Add tests
1440 * for this.
1441 */
1442 }
1443
1444 /* In every case the array is initialized completely. */
1445 level->bl_remaining = 0;
1446
1447 initialization_debug(current_init());
1448 debug_leave();
1449 return true;
1450 }
1451