1 /* Handle initialization things in C++.
2 Copyright (C) 1987, 89, 92, 93, 94, 1995 Free Software Foundation, Inc.
3 Contributed by Michael Tiemann (tiemann@cygnus.com)
5 This file is part of GNU CC.
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
22 /* High-level class interface. */
33 /* In C++, structures with well-defined constructors are initialized by
34 those constructors, unasked. CURRENT_BASE_INIT_LIST
35 holds a list of stmts for a BASE_INIT term in the grammar.
36 This list has one element for each base class which must be
37 initialized. The list elements are [basename, init], with
38 type basetype. This allows the possibly anachronistic form
39 (assuming d : a, b, c) "d (int a) : c(a+5), b (a-4), a (a+3)"
40 where each successive term can be handed down the constructor
41 line. Perhaps this was not intended. */
42 tree current_base_init_list, current_member_init_list;
44 void emit_base_init ();
45 void check_base_init ();
46 static void expand_aggr_vbase_init ();
47 void expand_member_init ();
48 void expand_aggr_init ();
50 static void expand_aggr_init_1 ();
51 static void expand_recursive_init_1 ();
52 static void expand_recursive_init ();
53 static void expand_virtual_init PROTO((tree, tree));
54 tree expand_vec_init ();
56 static void add_friend (), add_friends ();
58 /* Cache _builtin_new and _builtin_delete exprs. */
59 static tree BIN, BID, BIVN, BIVD;
61 /* Cache the identifier nodes for the two magic field of a new cookie. */
62 static tree nc_nelts_field_id;
64 static tree nc_ptr_2comp_field_id;
67 static tree minus_one;
69 /* Set up local variable for this file. MUST BE CALLED AFTER
70 INIT_DECL_PROCESSING. */
72 tree BI_header_type, BI_header_size;
74 void init_init_processing ()
78 /* Define implicit `operator new' and `operator delete' functions. */
79 BIN = default_conversion (get_first_fn (IDENTIFIER_GLOBAL_VALUE (ansi_opname[(int) NEW_EXPR])));
80 TREE_USED (TREE_OPERAND (BIN, 0)) = 0;
81 BID = default_conversion (get_first_fn (IDENTIFIER_GLOBAL_VALUE (ansi_opname[(int) DELETE_EXPR])));
82 TREE_USED (TREE_OPERAND (BID, 0)) = 0;
83 BIVN = default_conversion (get_first_fn (IDENTIFIER_GLOBAL_VALUE (ansi_opname[(int) VEC_NEW_EXPR])));
84 TREE_USED (TREE_OPERAND (BIVN, 0)) = 0;
85 BIVD = default_conversion (get_first_fn (IDENTIFIER_GLOBAL_VALUE (ansi_opname[(int) VEC_DELETE_EXPR])));
86 TREE_USED (TREE_OPERAND (BIVD, 0)) = 0;
87 minus_one = build_int_2 (-1, -1);
89 /* Define the structure that holds header information for
90 arrays allocated via operator new. */
91 BI_header_type = make_lang_type (RECORD_TYPE);
92 nc_nelts_field_id = get_identifier ("nelts");
93 fields[0] = build_lang_field_decl (FIELD_DECL, nc_nelts_field_id, sizetype);
94 finish_builtin_type (BI_header_type, "__new_cookie", fields,
96 BI_header_size = size_in_bytes (BI_header_type);
99 /* Subroutine of emit_base_init. For BINFO, initialize all the
100 virtual function table pointers, except those that come from
101 virtual base classes. Initialize binfo's vtable pointer, if
102 INIT_SELF is true. CAN_ELIDE is true when we know that all virtual
103 function table pointers in all bases have been initialized already,
104 probably because their constructors have just be run. ADDR is the
105 pointer to the object whos vtables we are going to initialize.
107 REAL_BINFO is usually the same as BINFO, except when addr is not of
108 pointer to the type of the real derived type that we want to
109 initialize for. This is the case when addr is a pointer to a sub
110 object of a complete object, and we only want to do part of the
111 complete object's initiailzation of vtable pointers. This is done
112 for all virtual table pointers in virtual base classes. REAL_BINFO
113 is used to find the BINFO_VTABLE that we initialize with. BINFO is
114 used for conversions of addr to subobjects.
116 BINFO_TYPE (real_binfo) must be BINFO_TYPE (binfo).
118 Relies upon binfo being inside TYPE_BINFO (TREE_TYPE (TREE_TYPE
121 expand_direct_vtbls_init (real_binfo, binfo, init_self, can_elide, addr)
122 tree real_binfo, binfo, addr;
123 int init_self, can_elide;
125 tree real_binfos = BINFO_BASETYPES (real_binfo);
126 tree binfos = BINFO_BASETYPES (binfo);
127 int i, n_baselinks = real_binfos ? TREE_VEC_LENGTH (real_binfos) : 0;
128 int has_expanded = 0;
130 for (i = 0; i < n_baselinks; i++)
132 tree real_base_binfo = TREE_VEC_ELT (real_binfos, i);
133 tree base_binfo = TREE_VEC_ELT (binfos, i);
134 int is_not_base_vtable =
135 i != CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (real_binfo));
136 if (! TREE_VIA_VIRTUAL (real_base_binfo))
138 expand_direct_vtbls_init (real_base_binfo, base_binfo,
139 (is_not_base_vtable || flag_rtti), can_elide, addr);
140 if (is_not_base_vtable && flag_rtti)
145 /* Before turning this on, make sure it is correct. */
146 if (can_elide && ! BINFO_MODIFIED (binfo))
149 /* Should we use something besides CLASSTYPE_VFIELDS? */
150 if (init_self && !has_expanded && CLASSTYPE_VFIELDS (BINFO_TYPE (real_binfo)))
152 tree base_ptr = convert_pointer_to_real (binfo, addr);
153 expand_virtual_init (real_binfo, base_ptr);
158 /* Subroutine of emit_base_init. */
160 perform_member_init (member, name, init, explicit, protect_list)
161 tree member, name, init, *protect_list;
165 tree type = TREE_TYPE (member);
167 if (TYPE_NEEDS_CONSTRUCTING (type)
168 || (init && TYPE_HAS_CONSTRUCTOR (type)))
170 /* Since `init' is already a TREE_LIST on the current_member_init_list,
171 only build it into one if we aren't already a list. */
172 if (init != NULL_TREE && TREE_CODE (init) != TREE_LIST)
173 init = build_tree_list (NULL_TREE, init);
175 decl = build_component_ref (C_C_D, name, 0, explicit);
178 && TREE_CODE (type) == ARRAY_TYPE
180 && TREE_CHAIN (init) == NULL_TREE
181 && TREE_CODE (TREE_TYPE (TREE_VALUE (init))) == ARRAY_TYPE)
183 /* Initialization of one array from another. */
184 expand_vec_init (TREE_OPERAND (decl, 1), decl,
185 array_type_nelts (type), TREE_VALUE (init), 1);
188 expand_aggr_init (decl, init, 0, 0);
192 if (init == NULL_TREE)
196 cp_error ("incomplete initializer for member `%D' of class `%T' which has no constructor",
197 member, current_class_type);
198 init = error_mark_node;
200 /* member traversal: note it leaves init NULL */
201 else if (TREE_CODE (TREE_TYPE (member)) == REFERENCE_TYPE)
202 cp_pedwarn ("uninitialized reference member `%D'", member);
204 else if (TREE_CODE (init) == TREE_LIST)
206 /* There was an explicit member initialization. Do some
207 work in that case. */
208 if (TREE_CHAIN (init))
210 warning ("initializer list treated as compound expression");
211 init = build_compound_expr (init);
214 init = TREE_VALUE (init);
217 /* We only build this with a null init if we got it from the
218 current_member_init_list. */
219 if (init || explicit)
221 decl = build_component_ref (C_C_D, name, 0, explicit);
222 expand_expr_stmt (build_modify_expr (decl, INIT_EXPR, init));
225 expand_cleanups_to (NULL_TREE);
227 if (TYPE_NEEDS_DESTRUCTOR (type))
229 tree expr = build_component_ref (C_C_D, name, 0, explicit);
230 expr = build_delete (type, expr, integer_zero_node,
231 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0);
233 if (expr != error_mark_node)
236 *protect_list = tree_cons (NULL_TREE, expr, *protect_list);
241 extern int warn_reorder;
243 /* Subroutine of emit_member_init. */
248 tree x, member, name, field, init;
249 tree init_list = NULL_TREE;
250 tree fields_to_unmark = NULL_TREE;
254 for (member = TYPE_FIELDS (t); member ; member = TREE_CHAIN (member))
258 /* member could be, for example, a CONST_DECL for an enumerated
259 tag; we don't want to try to initialize that, since it already
261 if (TREE_CODE (member) != FIELD_DECL || !DECL_NAME (member))
264 for (x = current_member_init_list, pos = 0; x; x = TREE_CHAIN (x), ++pos)
266 /* If we cleared this out, then pay no attention to it. */
267 if (TREE_PURPOSE (x) == NULL_TREE)
269 name = TREE_PURPOSE (x);
272 field = (TREE_CODE (name) == COMPONENT_REF
273 ? TREE_OPERAND (name, 1) : IDENTIFIER_CLASS_VALUE (name));
275 /* Let's find out when this happens. */
276 my_friendly_assert (TREE_CODE (name) != COMPONENT_REF, 348);
277 field = IDENTIFIER_CLASS_VALUE (name);
280 /* If one member shadows another, get the outermost one. */
281 if (TREE_CODE (field) == TREE_LIST)
282 field = TREE_VALUE (field);
290 cp_warning_at ("member initializers for `%#D'", last_field);
291 cp_warning_at (" and `%#D'", field);
292 warning (" will be re-ordered to match declaration order");
298 /* Make sure we won't try to work on this init again. */
299 TREE_PURPOSE (x) = NULL_TREE;
300 x = build_tree_list (name, TREE_VALUE (x));
305 /* If we didn't find MEMBER in the list, create a dummy entry
306 so the two lists (INIT_LIST and the list of members) will be
308 x = build_tree_list (NULL_TREE, NULL_TREE);
310 init_list = chainon (init_list, x);
313 /* Initializers for base members go at the end. */
314 for (x = current_member_init_list ; x ; x = TREE_CHAIN (x))
316 name = TREE_PURPOSE (x);
319 if (purpose_member (name, init_list))
321 cp_error ("multiple initializations given for member `%D'",
322 IDENTIFIER_CLASS_VALUE (name));
326 init_list = chainon (init_list,
327 build_tree_list (name, TREE_VALUE (x)));
328 TREE_PURPOSE (x) = NULL_TREE;
336 sort_base_init (t, rbase_ptr, vbase_ptr)
337 tree t, *rbase_ptr, *vbase_ptr;
339 tree binfos = BINFO_BASETYPES (TYPE_BINFO (t));
340 int n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
346 /* For warn_reorder. */
348 tree last_base = NULL_TREE;
350 tree rbases = NULL_TREE;
351 tree vbases = NULL_TREE;
353 /* First walk through and splice out vbase and invalid initializers.
354 Also replace names with binfos. */
356 last = tree_cons (NULL_TREE, NULL_TREE, current_base_init_list);
357 for (x = TREE_CHAIN (last); x; x = TREE_CHAIN (x))
359 tree basename = TREE_PURPOSE (x);
362 if (basename == NULL_TREE)
364 /* Initializer for single base class. Must not
365 use multiple inheritance or this is ambiguous. */
366 switch (n_baseclasses)
369 cp_error ("`%T' does not have a base class to initialize",
375 cp_error ("unnamed initializer ambiguous for `%T' which uses multiple inheritance",
379 binfo = TREE_VEC_ELT (binfos, 0);
381 else if (is_aggr_typedef (basename, 1))
383 binfo = binfo_or_else (IDENTIFIER_TYPE_VALUE (basename), t);
384 if (binfo == NULL_TREE)
387 /* Virtual base classes are special cases. Their initializers
388 are recorded with this constructor, and they are used when
389 this constructor is the top-level constructor called. */
390 if (TREE_VIA_VIRTUAL (binfo))
392 tree v = CLASSTYPE_VBASECLASSES (t);
393 while (BINFO_TYPE (v) != BINFO_TYPE (binfo))
396 vbases = tree_cons (v, TREE_VALUE (x), vbases);
401 /* Otherwise, if it is not an immediate base class, complain. */
402 for (i = n_baseclasses-1; i >= 0; i--)
403 if (BINFO_TYPE (binfo) == BINFO_TYPE (TREE_VEC_ELT (binfos, i)))
407 cp_error ("`%T' is not an immediate base class of `%T'",
408 IDENTIFIER_TYPE_VALUE (basename),
415 my_friendly_abort (365);
417 TREE_PURPOSE (x) = binfo;
418 TREE_CHAIN (last) = x;
421 TREE_CHAIN (last) = NULL_TREE;
423 /* Now walk through our regular bases and make sure they're initialized. */
425 for (i = 0; i < n_baseclasses; ++i)
427 tree base_binfo = TREE_VEC_ELT (binfos, i);
430 if (TREE_VIA_VIRTUAL (base_binfo))
433 for (x = current_base_init_list, pos = 0; x; x = TREE_CHAIN (x), ++pos)
435 tree binfo = TREE_PURPOSE (x);
437 if (binfo == NULL_TREE)
440 if (binfo == base_binfo)
446 cp_warning_at ("base initializers for `%#T'", last_base);
447 cp_warning_at (" and `%#T'", BINFO_TYPE (binfo));
448 warning (" will be re-ordered to match inheritance order");
451 last_base = BINFO_TYPE (binfo);
454 /* Make sure we won't try to work on this init again. */
455 TREE_PURPOSE (x) = NULL_TREE;
456 x = build_tree_list (binfo, TREE_VALUE (x));
461 /* If we didn't find BASE_BINFO in the list, create a dummy entry
462 so the two lists (RBASES and the list of bases) will be
464 x = build_tree_list (NULL_TREE, NULL_TREE);
466 rbases = chainon (rbases, x);
473 /* Perform partial cleanups for a base for exception handling. */
475 build_partial_cleanup_for (binfo)
478 tree expr = convert_pointer_to_real (binfo,
479 build_unary_op (ADDR_EXPR, C_C_D, 0));
481 return build_delete (TREE_TYPE (expr),
484 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0);
487 /* Perform whatever initializations have yet to be done on the base
488 class of the class variable. These actions are in the global
489 variable CURRENT_BASE_INIT_LIST. Such an action could be
490 NULL_TREE, meaning that the user has explicitly called the base
491 class constructor with no arguments.
493 If there is a need for a call to a constructor, we must surround
494 that call with a pushlevel/poplevel pair, since we are technically
495 at the PARM level of scope.
497 Argument IMMEDIATELY, if zero, forces a new sequence to be
498 generated to contain these new insns, so it can be emitted later.
499 This sequence is saved in the global variable BASE_INIT_INSNS.
500 Otherwise, the insns are emitted into the current sequence.
502 Note that emit_base_init does *not* initialize virtual base
503 classes. That is done specially, elsewhere. */
506 emit_base_init (t, immediately)
510 extern tree in_charge_identifier;
514 tree rbase_init_list, vbase_init_list;
515 tree t_binfo = TYPE_BINFO (t);
516 tree binfos = BINFO_BASETYPES (t_binfo);
517 int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
519 my_friendly_assert (protect_list == NULL_TREE, 999);
523 do_pending_stack_adjust ();
527 if (write_symbols == NO_DEBUG)
528 /* As a matter of principle, `start_sequence' should do this. */
531 /* Always emit a line number note so we can step into constructors. */
532 emit_line_note_force (DECL_SOURCE_FILE (current_function_decl),
533 DECL_SOURCE_LINE (current_function_decl));
535 mem_init_list = sort_member_init (t);
536 current_member_init_list = NULL_TREE;
538 sort_base_init (t, &rbase_init_list, &vbase_init_list);
539 current_base_init_list = NULL_TREE;
541 if (TYPE_USES_VIRTUAL_BASECLASSES (t))
543 tree first_arg = TREE_CHAIN (DECL_ARGUMENTS (current_function_decl));
545 expand_start_cond (first_arg, 0);
546 expand_aggr_vbase_init (t_binfo, C_C_D, current_class_decl,
551 /* Now, perform initialization of non-virtual base classes. */
552 for (i = 0; i < n_baseclasses; i++)
554 tree base = current_class_decl;
555 tree base_binfo = TREE_VEC_ELT (binfos, i);
556 tree init = void_list_node;
558 if (TREE_VIA_VIRTUAL (base_binfo))
561 #if 0 /* Once unsharing happens soon enough. */
562 my_friendly_assert (BINFO_INHERITANCE_CHAIN (base_binfo) == t_binfo);
564 BINFO_INHERITANCE_CHAIN (base_binfo) = t_binfo;
567 if (TREE_PURPOSE (rbase_init_list))
568 init = TREE_VALUE (rbase_init_list);
569 else if (TYPE_NEEDS_CONSTRUCTING (BINFO_TYPE (base_binfo)))
572 if (init != void_list_node)
574 member = convert_pointer_to (base_binfo, current_class_decl);
575 expand_aggr_init_1 (base_binfo, 0,
576 build_indirect_ref (member, NULL_PTR), init,
577 BINFO_OFFSET_ZEROP (base_binfo), LOOKUP_NORMAL);
578 expand_cleanups_to (NULL_TREE);
581 if (TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo)))
584 protect_list = tree_cons (NULL_TREE,
585 build_partial_cleanup_for (base_binfo),
589 rbase_init_list = TREE_CHAIN (rbase_init_list);
592 /* Initialize all the virtual function table fields that
593 do come from virtual base classes. */
594 if (TYPE_USES_VIRTUAL_BASECLASSES (t))
595 expand_indirect_vtbls_init (t_binfo, C_C_D, current_class_decl, 0);
597 /* Initialize all the virtual function table fields that
598 do not come from virtual base classes. */
599 expand_direct_vtbls_init (t_binfo, t_binfo, 1, 1, current_class_decl);
601 for (member = TYPE_FIELDS (t); member; member = TREE_CHAIN (member))
606 /* member could be, for example, a CONST_DECL for an enumerated
607 tag; we don't want to try to initialize that, since it already
609 if (TREE_CODE (member) != FIELD_DECL || !DECL_NAME (member))
612 /* See if we had a user-specified member initialization. */
613 if (TREE_PURPOSE (mem_init_list))
615 name = TREE_PURPOSE (mem_init_list);
616 init = TREE_VALUE (mem_init_list);
619 /* Also see if it's ever a COMPONENT_REF here. If it is, we
620 need to do `expand_assignment (name, init, 0, 0);' and
622 my_friendly_assert (TREE_CODE (name) != COMPONENT_REF, 349);
626 name = DECL_NAME (member);
627 init = DECL_INITIAL (member);
632 perform_member_init (member, name, init, from_init_list, &protect_list);
633 mem_init_list = TREE_CHAIN (mem_init_list);
636 /* Now initialize any members from our bases. */
637 while (mem_init_list)
639 tree name, init, field;
641 if (TREE_PURPOSE (mem_init_list))
643 name = TREE_PURPOSE (mem_init_list);
644 init = TREE_VALUE (mem_init_list);
645 /* XXX: this may need the COMPONENT_REF operand 0 check if
646 it turns out we actually get them. */
647 field = IDENTIFIER_CLASS_VALUE (name);
649 /* If one member shadows another, get the outermost one. */
650 if (TREE_CODE (field) == TREE_LIST)
652 field = TREE_VALUE (field);
653 if (decl_type_context (field) != current_class_type)
654 cp_error ("field `%D' not in immediate context", field);
658 /* It turns out if you have an anonymous union in the
659 class, a member from it can end up not being on the
660 list of fields (rather, the type is), and therefore
661 won't be seen by the for loop above. */
663 /* The code in this for loop is derived from a general loop
664 which had this check in it. Theoretically, we've hit
665 every initialization for the list of members in T, so
666 we shouldn't have anything but these left in this list. */
667 my_friendly_assert (DECL_FIELD_CONTEXT (field) != t, 351);
670 perform_member_init (field, name, init, 1, &protect_list);
672 mem_init_list = TREE_CHAIN (mem_init_list);
677 extern rtx base_init_insns;
679 do_pending_stack_adjust ();
680 my_friendly_assert (base_init_insns == 0, 207);
681 base_init_insns = get_insns ();
685 /* All the implicit try blocks we built up will be zapped
686 when we come to a real binding contour boundary. */
689 /* Check that all fields are properly initialized after
690 an assignment to `this'. */
696 for (member = TYPE_FIELDS (t); member; member = TREE_CHAIN (member))
697 if (DECL_NAME (member) && TREE_USED (member))
698 cp_error ("field `%D' used before initialized (after assignment to `this')",
702 /* This code sets up the virtual function tables appropriate for
703 the pointer DECL. It is a one-ply initialization.
705 BINFO is the exact type that DECL is supposed to be. In
706 multiple inheritance, this might mean "C's A" if C : A, B. */
708 expand_virtual_init (binfo, decl)
711 tree type = BINFO_TYPE (binfo);
713 tree vtype, vtype_binfo;
715 /* This code is crusty. Should be simple, like:
716 vtbl = BINFO_VTABLE (binfo);
718 vtype = DECL_CONTEXT (CLASSTYPE_VFIELD (type));
719 vtype_binfo = get_binfo (vtype, TREE_TYPE (TREE_TYPE (decl)), 0);
720 vtbl = BINFO_VTABLE (binfo_value (DECL_FIELD_CONTEXT (CLASSTYPE_VFIELD (type)), binfo));
721 assemble_external (vtbl);
722 TREE_USED (vtbl) = 1;
723 vtbl = build1 (ADDR_EXPR, TYPE_POINTER_TO (TREE_TYPE (vtbl)), vtbl);
724 decl = convert_pointer_to_real (vtype_binfo, decl);
725 vtbl_ptr = build_vfield_ref (build_indirect_ref (decl, NULL_PTR), vtype);
726 if (vtbl_ptr == error_mark_node)
729 /* Have to convert VTBL since array sizes may be different. */
730 vtbl = convert_force (TREE_TYPE (vtbl_ptr), vtbl, 0);
731 expand_expr_stmt (build_modify_expr (vtbl_ptr, NOP_EXPR, vtbl));
734 /* Subroutine of `expand_aggr_vbase_init'.
735 BINFO is the binfo of the type that is being initialized.
736 INIT_LIST is the list of initializers for the virtual baseclass. */
738 expand_aggr_vbase_init_1 (binfo, exp, addr, init_list)
739 tree binfo, exp, addr, init_list;
741 tree init = purpose_member (binfo, init_list);
742 tree ref = build_indirect_ref (addr, NULL_PTR);
744 init = TREE_VALUE (init);
745 /* Call constructors, but don't set up vtables. */
746 expand_aggr_init_1 (binfo, exp, ref, init, 0, LOOKUP_COMPLAIN);
747 expand_cleanups_to (NULL_TREE);
750 /* Initialize this object's virtual base class pointers. This must be
751 done only at the top-level of the object being constructed.
753 INIT_LIST is list of initialization for constructor to perform. */
755 expand_aggr_vbase_init (binfo, exp, addr, init_list)
761 tree type = BINFO_TYPE (binfo);
763 if (TYPE_USES_VIRTUAL_BASECLASSES (type))
765 tree result = init_vbase_pointers (type, addr);
769 expand_expr_stmt (build_compound_expr (result));
771 for (vbases = CLASSTYPE_VBASECLASSES (type); vbases;
772 vbases = TREE_CHAIN (vbases))
774 tree tmp = purpose_member (vbases, result);
775 expand_aggr_vbase_init_1 (vbases, exp,
776 TREE_OPERAND (TREE_VALUE (tmp), 0),
782 /* Subroutine to perform parser actions for member initialization.
783 S_ID is the scoped identifier.
784 NAME is the name of the member.
785 INIT is the initializer, or `void_type_node' if none. */
787 do_member_init (s_id, name, init)
788 tree s_id, name, init;
792 if (current_class_type == NULL_TREE
793 || ! is_aggr_typedef (s_id, 1))
795 binfo = get_binfo (IDENTIFIER_TYPE_VALUE (s_id),
796 current_class_type, 1);
797 if (binfo == error_mark_node)
801 error_not_base_type (IDENTIFIER_TYPE_VALUE (s_id), current_class_type);
805 base = convert_pointer_to (binfo, current_class_decl);
806 expand_member_init (build_indirect_ref (base, NULL_PTR), name, init);
809 /* Function to give error message if member initialization specification
810 is erroneous. FIELD is the member we decided to initialize.
811 TYPE is the type for which the initialization is being performed.
812 FIELD must be a member of TYPE, or the base type from which FIELD
813 comes must not need a constructor.
815 MEMBER_NAME is the name of the member. */
818 member_init_ok_or_else (field, type, member_name)
823 if (field == error_mark_node)
825 if (field == NULL_TREE)
827 cp_error ("class `%T' does not have any field named `%s'", type,
831 if (DECL_CONTEXT (field) != type
832 && TYPE_NEEDS_CONSTRUCTING (DECL_CONTEXT (field)))
834 cp_error ("member `%D' comes from base class needing constructor",
838 if (TREE_STATIC (field))
840 cp_error ("field `%#D' is static; only point of initialization is its declaration",
848 /* If NAME is a viable field name for the aggregate DECL,
849 and PARMS is a viable parameter list, then expand an _EXPR
850 which describes this initialization.
852 Note that we do not need to chase through the class's base classes
853 to look for NAME, because if it's in that list, it will be handled
854 by the constructor for that base class.
856 We do not yet have a fixed-point finder to instantiate types
857 being fed to overloaded constructors. If there is a unique
858 constructor, then argument types can be got from that one.
860 If INIT is non-NULL, then it the initialization should
861 be placed in `current_base_init_list', where it will be processed
862 by `emit_base_init'. */
864 expand_member_init (exp, name, init)
865 tree exp, name, init;
867 extern tree ptr_type_node; /* should be in tree.h */
869 tree basetype = NULL_TREE, field;
874 if (exp == NULL_TREE)
875 return; /* complain about this later */
877 type = TYPE_MAIN_VARIANT (TREE_TYPE (exp));
879 if (name == NULL_TREE && IS_AGGR_TYPE (type))
880 switch (CLASSTYPE_N_BASECLASSES (type))
883 error ("base class initializer specified, but no base class to initialize");
886 basetype = TYPE_BINFO_BASETYPE (type, 0);
889 error ("initializer for unnamed base class ambiguous");
890 cp_error ("(type `%T' uses multiple inheritance)", type);
896 /* The grammar should not allow fields which have names
897 that are TYPENAMEs. Therefore, if the field has
898 a non-NULL TREE_TYPE, we may assume that this is an
899 attempt to initialize a base class member of the current
900 type. Otherwise, it is an attempt to initialize a
903 if (init == void_type_node)
906 if (name == NULL_TREE || IDENTIFIER_HAS_TYPE_VALUE (name))
910 if (name == NULL_TREE)
914 name = TYPE_IDENTIFIER (basetype);
917 error ("no base class to initialize");
924 basetype = IDENTIFIER_TYPE_VALUE (name);
926 && ! binfo_member (basetype, TYPE_BINFO (type))
927 && ! binfo_member (basetype, CLASSTYPE_VBASECLASSES (type)))
929 if (IDENTIFIER_CLASS_VALUE (name))
931 if (TYPE_USES_VIRTUAL_BASECLASSES (type))
932 error ("type `%s' is not an immediate or virtual basetype for `%s'",
933 IDENTIFIER_POINTER (name),
934 TYPE_NAME_STRING (type));
936 error ("type `%s' is not an immediate basetype for `%s'",
937 IDENTIFIER_POINTER (name),
938 TYPE_NAME_STRING (type));
943 if (purpose_member (name, current_base_init_list))
945 error ("base class `%s' already initialized",
946 IDENTIFIER_POINTER (name));
950 base_init = build_tree_list (name, init);
951 TREE_TYPE (base_init) = basetype;
952 current_base_init_list = chainon (current_base_init_list, base_init);
959 field = lookup_field (type, name, 1, 0);
961 if (! member_init_ok_or_else (field, type, IDENTIFIER_POINTER (name)))
964 if (purpose_member (name, current_member_init_list))
966 error ("field `%s' already initialized", IDENTIFIER_POINTER (name));
970 member_init = build_tree_list (name, init);
971 TREE_TYPE (member_init) = TREE_TYPE (field);
972 current_member_init_list = chainon (current_member_init_list, member_init);
976 else if (name == NULL_TREE)
978 compiler_error ("expand_member_init: name == NULL_TREE");
983 field = lookup_field (basetype, name, 0, 0);
985 if (! member_init_ok_or_else (field, basetype, IDENTIFIER_POINTER (name)))
988 /* now see if there is a constructor for this type
989 which will take these args. */
991 if (TYPE_HAS_CONSTRUCTOR (TREE_TYPE (field)))
993 tree parmtypes, fndecl;
995 if (TREE_CODE (exp) == VAR_DECL || TREE_CODE (exp) == PARM_DECL)
997 /* just know that we've seen something for this node */
998 DECL_INITIAL (exp) = error_mark_node;
1001 type = TYPE_MAIN_VARIANT (TREE_TYPE (field));
1002 actual_name = TYPE_IDENTIFIER (type);
1003 parm = build_component_ref (exp, name, 0, 0);
1005 /* Now get to the constructor. */
1006 fndecl = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type), 0);
1007 /* Get past destructor, if any. */
1008 if (TYPE_HAS_DESTRUCTOR (type))
1009 fndecl = DECL_CHAIN (fndecl);
1012 my_friendly_assert (TREE_CODE (fndecl) == FUNCTION_DECL, 209);
1014 /* If the field is unique, we can use the parameter
1015 types to guide possible type instantiation. */
1016 if (DECL_CHAIN (fndecl) == NULL_TREE)
1018 /* There was a confusion here between
1019 FIELD and FNDECL. The following code
1020 should be correct, but abort is here
1022 my_friendly_abort (48);
1023 parmtypes = FUNCTION_ARG_CHAIN (fndecl);
1027 parmtypes = NULL_TREE;
1031 init = convert_arguments (parm, parmtypes, NULL_TREE, fndecl, LOOKUP_NORMAL);
1032 if (init == NULL_TREE || TREE_TYPE (init) != error_mark_node)
1033 rval = build_method_call (NULL_TREE, actual_name, init, NULL_TREE, LOOKUP_NORMAL);
1037 if (rval != error_mark_node)
1039 /* Now, fill in the first parm with our guy */
1040 TREE_VALUE (TREE_OPERAND (rval, 1))
1041 = build_unary_op (ADDR_EXPR, parm, 0);
1042 TREE_TYPE (rval) = ptr_type_node;
1043 TREE_SIDE_EFFECTS (rval) = 1;
1046 else if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (field)))
1048 parm = build_component_ref (exp, name, 0, 0);
1049 expand_aggr_init (parm, NULL_TREE, 0, 0);
1050 rval = error_mark_node;
1053 /* Now initialize the member. It does not have to
1054 be of aggregate type to receive initialization. */
1055 if (rval != error_mark_node)
1056 expand_expr_stmt (rval);
1059 /* This is like `expand_member_init', only it stores one aggregate
1062 INIT comes in two flavors: it is either a value which
1063 is to be stored in EXP, or it is a parameter list
1064 to go to a constructor, which will operate on EXP.
1065 If FLAGS is LOOKUP_ONLYCONVERTING then it is the = init form of
1066 the initializer, if FLAGS is 0, then it is the (init) form.
1067 If `init' is a CONSTRUCTOR, then we emit a warning message,
1068 explaining that such initializations are invalid.
1070 ALIAS_THIS is nonzero iff we are initializing something which is
1071 essentially an alias for C_C_D. In this case, the base constructor
1072 may move it on us, and we must keep track of such deviations.
1074 If INIT resolves to a CALL_EXPR which happens to return
1075 something of the type we are looking for, then we know
1076 that we can safely use that call to perform the
1079 The virtual function table pointer cannot be set up here, because
1080 we do not really know its type.
1082 Virtual baseclass pointers are also set up here.
1084 This never calls operator=().
1086 When initializing, nothing is CONST.
1088 A default copy constructor may have to be used to perform the
1091 A constructor or a conversion operator may have to be used to
1092 perform the initialization, but not both, as it would be ambiguous.
1096 expand_aggr_init (exp, init, alias_this, flags)
1101 tree type = TREE_TYPE (exp);
1102 int was_const = TREE_READONLY (exp);
1104 if (init == error_mark_node)
1107 TREE_READONLY (exp) = 0;
1109 if (TREE_CODE (type) == ARRAY_TYPE)
1111 /* Must arrange to initialize each element of EXP
1112 from elements of INIT. */
1113 int was_const_elts = TYPE_READONLY (TREE_TYPE (type));
1114 tree itype = init ? TREE_TYPE (init) : NULL_TREE;
1117 TREE_TYPE (exp) = TYPE_MAIN_VARIANT (type);
1119 TREE_TYPE (init) = TYPE_MAIN_VARIANT (itype);
1121 if (init && TREE_TYPE (init) == NULL_TREE)
1123 /* Handle bad initializers like:
1127 COMPLEX(double r = 0.0, double i = 0.0) {re = r; im = i;};
1131 int main(int argc, char **argv) {
1132 COMPLEX zees(1.0, 0.0)[10];
1135 error ("bad array initializer");
1138 expand_vec_init (exp, exp, array_type_nelts (type), init,
1139 init && comptypes (TREE_TYPE (init), TREE_TYPE (exp), 1));
1140 TREE_READONLY (exp) = was_const;
1141 TREE_TYPE (exp) = type;
1143 TREE_TYPE (init) = itype;
1147 if (TREE_CODE (exp) == VAR_DECL || TREE_CODE (exp) == PARM_DECL)
1148 /* just know that we've seen something for this node */
1149 TREE_USED (exp) = 1;
1152 /* If initializing from a GNU C CONSTRUCTOR, consider the elts in the
1153 constructor as parameters to an implicit GNU C++ constructor. */
1154 if (init && TREE_CODE (init) == CONSTRUCTOR
1155 && TYPE_HAS_CONSTRUCTOR (type)
1156 && TREE_TYPE (init) == type)
1157 init = CONSTRUCTOR_ELTS (init);
1159 expand_aggr_init_1 (TYPE_BINFO (type), exp, exp,
1160 init, alias_this, LOOKUP_NORMAL|flags);
1161 TREE_READONLY (exp) = was_const;
1165 expand_default_init (binfo, true_exp, exp, type, init, alias_this, flags)
1173 /* It fails because there may not be a constructor which takes
1174 its own type as the first (or only parameter), but which does
1175 take other types via a conversion. So, if the thing initializing
1176 the expression is a unit element of type X, first try X(X&),
1177 followed by initialization by X. If neither of these work
1178 out, then look hard. */
1182 if (init == NULL_TREE
1183 || (TREE_CODE (init) == TREE_LIST && ! TREE_TYPE (init)))
1187 init = TREE_VALUE (parms);
1189 else if (TREE_CODE (init) == INDIRECT_REF && TREE_HAS_CONSTRUCTOR (init)
1190 && TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (TREE_TYPE (init)))
1192 rval = convert_for_initialization (exp, type, init, 0, 0, 0, 0);
1193 TREE_USED (rval) = 1;
1194 expand_expr_stmt (rval);
1198 parms = build_tree_list (NULL_TREE, init);
1200 if (TYPE_USES_VIRTUAL_BASECLASSES (type))
1202 if (true_exp == exp)
1203 parms = tree_cons (NULL_TREE, integer_one_node, parms);
1205 parms = tree_cons (NULL_TREE, integer_zero_node, parms);
1206 flags |= LOOKUP_HAS_IN_CHARGE;
1209 if (init && TREE_CHAIN (parms) == NULL_TREE
1210 && TYPE_HAS_CONSTRUCTOR (type)
1211 && ! TYPE_NEEDS_CONSTRUCTING (type)
1212 && TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (TREE_TYPE (init)))
1214 rval = build (INIT_EXPR, type, exp, init);
1215 TREE_SIDE_EFFECTS (rval) = 1;
1216 expand_expr_stmt (rval);
1220 rval = build_method_call (exp, constructor_name_full (type),
1221 parms, binfo, flags);
1223 /* Private, protected, or otherwise unavailable. */
1224 if (rval == error_mark_node)
1226 if (flags & LOOKUP_COMPLAIN)
1227 cp_error ("in base initialization for %sclass `%T'",
1228 TREE_VIA_VIRTUAL (binfo) ? "virtual base " : "",
1231 else if (rval == NULL_TREE)
1232 my_friendly_abort (361);
1235 /* p. 222: if the base class assigns to `this', then that
1236 value is used in the derived class. */
1237 if ((flag_this_is_variable & 1) && alias_this)
1239 TREE_TYPE (rval) = TREE_TYPE (current_class_decl);
1240 expand_assignment (current_class_decl, rval, 0, 0);
1243 expand_expr_stmt (rval);
1248 /* This function is responsible for initializing EXP with INIT
1251 BINFO is the binfo of the type for who we are performing the
1252 initialization. For example, if W is a virtual base class of A and B,
1254 If we are initializing B, then W must contain B's W vtable, whereas
1255 were we initializing C, W must contain C's W vtable.
1257 TRUE_EXP is nonzero if it is the true expression being initialized.
1258 In this case, it may be EXP, or may just contain EXP. The reason we
1259 need this is because if EXP is a base element of TRUE_EXP, we
1260 don't necessarily know by looking at EXP where its virtual
1261 baseclass fields should really be pointing. But we do know
1262 from TRUE_EXP. In constructors, we don't know anything about
1263 the value being initialized.
1265 ALIAS_THIS serves the same purpose it serves for expand_aggr_init.
1267 FLAGS is just passes to `build_method_call'. See that function for
1271 expand_aggr_init_1 (binfo, true_exp, exp, init, alias_this, flags)
1278 tree type = TREE_TYPE (exp);
1279 tree init_type = NULL_TREE;
1281 my_friendly_assert (init != error_mark_node && type != error_mark_node, 211);
1283 /* Use a function returning the desired type to initialize EXP for us.
1284 If the function is a constructor, and its first argument is
1285 NULL_TREE, know that it was meant for us--just slide exp on
1286 in and expand the constructor. Constructors now come
1290 tree init_list = NULL_TREE;
1292 if (TREE_CODE (init) == TREE_LIST)
1295 if (TREE_CHAIN (init) == NULL_TREE)
1296 init = TREE_VALUE (init);
1299 init_type = TREE_TYPE (init);
1301 if (TREE_CODE (init) != TREE_LIST)
1303 if (TREE_CODE (init_type) == ERROR_MARK)
1307 /* These lines are found troublesome 5/11/89. */
1308 if (TREE_CODE (init_type) == REFERENCE_TYPE)
1309 init_type = TREE_TYPE (init_type);
1312 /* This happens when we use C++'s functional cast notation.
1313 If the types match, then just use the TARGET_EXPR
1314 directly. Otherwise, we need to create the initializer
1315 separately from the object being initialized. */
1316 if (TREE_CODE (init) == TARGET_EXPR)
1318 if (TYPE_MAIN_VARIANT (init_type) == TYPE_MAIN_VARIANT (type))
1320 if (TREE_CODE (exp) == VAR_DECL
1321 || TREE_CODE (exp) == RESULT_DECL)
1322 /* Unify the initialization targets. */
1323 DECL_RTL (TREE_OPERAND (init, 0)) = DECL_RTL (exp);
1325 DECL_RTL (TREE_OPERAND (init, 0)) = expand_expr (exp, NULL_RTX, 0, 0);
1327 expand_expr_stmt (init);
1332 init = TREE_OPERAND (init, 1);
1333 init = build (CALL_EXPR, init_type,
1334 TREE_OPERAND (init, 0), TREE_OPERAND (init, 1), 0);
1335 TREE_SIDE_EFFECTS (init) = 1;
1337 TREE_VALUE (init_list) = init;
1341 if (init_type == type && TREE_CODE (init) == CALL_EXPR
1343 /* It is valid to directly initialize from a CALL_EXPR
1344 without going through X(X&), apparently. */
1345 && ! TYPE_GETS_INIT_REF (type)
1349 /* A CALL_EXPR is a legitimate form of initialization, so
1350 we should not print this warning message. */
1352 /* Should have gone away due to 5/11/89 change. */
1353 if (TREE_CODE (TREE_TYPE (init)) == REFERENCE_TYPE)
1354 init = convert_from_reference (init);
1356 expand_assignment (exp, init, 0, 0);
1357 if (exp == DECL_RESULT (current_function_decl))
1359 /* Failing this assertion means that the return value
1360 from receives multiple initializations. */
1361 my_friendly_assert (DECL_INITIAL (exp) == NULL_TREE
1362 || DECL_INITIAL (exp) == error_mark_node,
1364 DECL_INITIAL (exp) = init;
1368 else if (init_type == type
1369 && TREE_CODE (init) == COND_EXPR)
1371 /* Push value to be initialized into the cond, where possible.
1372 Avoid spurious warning messages when initializing the
1373 result of this function. */
1374 TREE_OPERAND (init, 1)
1375 = build_modify_expr (exp, INIT_EXPR, TREE_OPERAND (init, 1));
1376 if (exp == DECL_RESULT (current_function_decl))
1377 DECL_INITIAL (exp) = NULL_TREE;
1378 TREE_OPERAND (init, 2)
1379 = build_modify_expr (exp, INIT_EXPR, TREE_OPERAND (init, 2));
1380 if (exp == DECL_RESULT (current_function_decl))
1381 DECL_INITIAL (exp) = init;
1382 TREE_SIDE_EFFECTS (init) = 1;
1383 expand_expr (init, const0_rtx, VOIDmode, 0);
1389 /* We did not know what we were initializing before. Now we do. */
1390 if (TREE_CODE (init) == TARGET_EXPR)
1392 tree tmp = TREE_OPERAND (TREE_OPERAND (init, 1), 1);
1394 if (TREE_CODE (TREE_VALUE (tmp)) == NOP_EXPR
1395 && TREE_OPERAND (TREE_VALUE (tmp), 0) == integer_zero_node)
1397 /* In order for this to work for RESULT_DECLs, if their
1398 type has a constructor, then they must be BLKmode
1399 so that they will be meaningfully addressable. */
1400 tree arg = build_unary_op (ADDR_EXPR, exp, 0);
1401 init = TREE_OPERAND (init, 1);
1402 init = build (CALL_EXPR, build_pointer_type (TREE_TYPE (init)),
1403 TREE_OPERAND (init, 0), TREE_OPERAND (init, 1), 0);
1404 TREE_SIDE_EFFECTS (init) = 1;
1405 TREE_VALUE (TREE_OPERAND (init, 1))
1406 = convert_pointer_to (TREE_TYPE (TREE_TYPE (TREE_VALUE (tmp))), arg);
1410 expand_assignment (current_function_decl, init, 0, 0);
1413 if (exp == DECL_RESULT (current_function_decl))
1415 if (DECL_INITIAL (DECL_RESULT (current_function_decl)))
1416 fatal ("return value from function receives multiple initializations");
1417 DECL_INITIAL (exp) = init;
1419 expand_expr_stmt (init);
1424 if (TREE_CODE (exp) == VAR_DECL
1425 && TREE_CODE (init) == CONSTRUCTOR
1426 && TREE_HAS_CONSTRUCTOR (init))
1428 tree t = store_init_value (exp, init);
1431 expand_decl_init (exp);
1434 t = build (INIT_EXPR, type, exp, init);
1435 TREE_SIDE_EFFECTS (t) = 1;
1436 expand_expr_stmt (t);
1440 /* Handle this case: when calling a constructor: xyzzy foo(bar);
1441 which really means: xyzzy foo = bar; Ugh!
1443 More useful for this case: xyzzy *foo = new xyzzy (bar); */
1445 if (! TYPE_NEEDS_CONSTRUCTING (type) && ! IS_AGGR_TYPE (type))
1447 if (init_list && TREE_CHAIN (init_list))
1449 warning ("initializer list being treated as compound expression");
1450 init = convert (type, build_compound_expr (init_list));
1451 if (init == error_mark_node)
1455 expand_assignment (exp, init, 0, 0);
1459 /* See whether we can go through a type conversion operator.
1460 This wins over going through a non-existent constructor. If
1461 there is a constructor, it is ambiguous. */
1462 if (TREE_CODE (init) != TREE_LIST)
1464 tree ttype = TREE_CODE (init_type) == REFERENCE_TYPE
1465 ? TREE_TYPE (init_type) : init_type;
1467 if (ttype != type && IS_AGGR_TYPE (ttype))
1469 tree rval = build_type_conversion (CONVERT_EXPR, type, init, 0);
1473 /* See if there is a constructor for``type'' that takes a
1474 ``ttype''-typed object. */
1475 tree parms = build_tree_list (NULL_TREE, init);
1476 tree as_cons = NULL_TREE;
1477 if (TYPE_HAS_CONSTRUCTOR (type))
1478 as_cons = build_method_call (exp, constructor_name_full (type),
1480 LOOKUP_SPECULATIVELY|LOOKUP_NO_CONVERSION);
1481 if (as_cons != NULL_TREE && as_cons != error_mark_node)
1482 /* ANSI C++ June 5 1992 WP 12.3.2.6.1 */
1483 cp_error ("ambiguity between conversion to `%T' and constructor",
1486 expand_assignment (exp, rval, 0, 0);
1493 /* Handle default copy constructors here, does not matter if there is
1494 a constructor or not. */
1495 if (type == init_type && IS_AGGR_TYPE (type)
1496 && init && TREE_CODE (init) != TREE_LIST)
1497 expand_default_init (binfo, true_exp, exp, type, init, alias_this, flags);
1498 /* Not sure why this is here... */
1499 else if (TYPE_HAS_CONSTRUCTOR (type))
1500 expand_default_init (binfo, true_exp, exp, type, init, alias_this, flags);
1501 else if (TREE_CODE (type) == ARRAY_TYPE)
1503 if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (type)))
1504 expand_vec_init (exp, exp, array_type_nelts (type), init, 0);
1505 else if (TYPE_VIRTUAL_P (TREE_TYPE (type)))
1506 sorry ("arrays of objects with virtual functions but no constructors");
1509 expand_recursive_init (binfo, true_exp, exp, init,
1510 CLASSTYPE_BASE_INIT_LIST (type), alias_this);
1513 /* A pointer which holds the initializer. First call to
1514 expand_aggr_init gets this value pointed to, and sets it to init_null. */
1515 static tree *init_ptr, init_null;
1517 /* Subroutine of expand_recursive_init:
1519 ADDR is the address of the expression being initialized.
1520 INIT_LIST is the cons-list of initializations to be performed.
1521 ALIAS_THIS is its same, lovable self. */
1523 expand_recursive_init_1 (binfo, true_exp, addr, init_list, alias_this)
1524 tree binfo, true_exp, addr;
1530 if (TREE_PURPOSE (init_list))
1532 if (TREE_CODE (TREE_PURPOSE (init_list)) == FIELD_DECL)
1534 tree member = TREE_PURPOSE (init_list);
1535 tree subexp = build_indirect_ref (convert_pointer_to (TREE_VALUE (init_list), addr), NULL_PTR);
1536 tree member_base = build (COMPONENT_REF, TREE_TYPE (member), subexp, member);
1537 if (IS_AGGR_TYPE (TREE_TYPE (member)))
1538 expand_aggr_init (member_base, DECL_INITIAL (member), 0, 0);
1539 else if (TREE_CODE (TREE_TYPE (member)) == ARRAY_TYPE
1540 && TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (member)))
1542 member_base = save_expr (default_conversion (member_base));
1543 expand_vec_init (member, member_base,
1544 array_type_nelts (TREE_TYPE (member)),
1545 DECL_INITIAL (member), 0);
1548 expand_expr_stmt (build_modify_expr (member_base, INIT_EXPR, DECL_INITIAL (member)));
1550 else if (TREE_CODE (TREE_PURPOSE (init_list)) == TREE_LIST)
1552 expand_recursive_init_1 (binfo, true_exp, addr, TREE_PURPOSE (init_list), alias_this);
1553 expand_recursive_init_1 (binfo, true_exp, addr, TREE_VALUE (init_list), alias_this);
1555 else if (TREE_CODE (TREE_PURPOSE (init_list)) == ERROR_MARK)
1557 /* Only initialize the virtual function tables if we
1558 are initializing the ultimate users of those vtables. */
1559 if (TREE_VALUE (init_list))
1561 /* We have to ensure that the first argment to
1562 expand_virtual_init is in binfo's hierarchy. */
1563 /* Is it the case that this is exactly the right binfo? */
1564 /* If it is ok, then fixup expand_virtual_init, to make
1566 expand_virtual_init (get_binfo (TREE_VALUE (init_list), binfo, 0),
1568 if (TREE_VALUE (init_list) == binfo
1569 && TYPE_USES_VIRTUAL_BASECLASSES (BINFO_TYPE (binfo)))
1570 expand_indirect_vtbls_init (binfo, true_exp, addr, 1);
1574 my_friendly_abort (49);
1576 else if (TREE_VALUE (init_list)
1577 && TREE_CODE (TREE_VALUE (init_list)) == TREE_VEC)
1579 tree subexp = build_indirect_ref (convert_pointer_to (TREE_VALUE (init_list), addr), NULL_PTR);
1580 expand_aggr_init_1 (binfo, true_exp, subexp, *init_ptr,
1581 alias_this && BINFO_OFFSET_ZEROP (TREE_VALUE (init_list)),
1584 /* INIT_PTR is used up. */
1585 init_ptr = &init_null;
1588 my_friendly_abort (50);
1589 init_list = TREE_CHAIN (init_list);
1593 /* Initialize EXP with INIT. Type EXP does not have a constructor,
1594 but it has a baseclass with a constructor or a virtual function
1595 table which needs initializing.
1597 INIT_LIST is a cons-list describing what parts of EXP actually
1598 need to be initialized. INIT is given to the *unique*, first
1599 constructor within INIT_LIST. If there are multiple first
1600 constructors, such as with multiple inheritance, INIT must
1601 be zero or an ambiguity error is reported.
1603 ALIAS_THIS is passed from `expand_aggr_init'. See comments
1607 expand_recursive_init (binfo, true_exp, exp, init, init_list, alias_this)
1608 tree binfo, true_exp, exp, init;
1612 tree *old_init_ptr = init_ptr;
1613 tree addr = build_unary_op (ADDR_EXPR, exp, 0);
1616 if (true_exp == exp && TYPE_USES_VIRTUAL_BASECLASSES (BINFO_TYPE (binfo)))
1618 expand_aggr_vbase_init (binfo, exp, addr, init_list);
1619 expand_indirect_vtbls_init (binfo, true_exp, addr, 1);
1621 expand_recursive_init_1 (binfo, true_exp, addr, init_list, alias_this);
1625 tree type = TREE_TYPE (exp);
1627 if (TREE_CODE (type) == REFERENCE_TYPE)
1628 type = TREE_TYPE (type);
1629 if (IS_AGGR_TYPE (type))
1630 cp_error ("unexpected argument to constructor `%T'", type);
1632 error ("unexpected argument to constructor");
1634 init_ptr = old_init_ptr;
1637 /* Report an error if NAME is not the name of a user-defined,
1638 aggregate type. If OR_ELSE is nonzero, give an error message. */
1640 is_aggr_typedef (name, or_else)
1646 if (name == error_mark_node)
1649 if (IDENTIFIER_HAS_TYPE_VALUE (name))
1650 type = IDENTIFIER_TYPE_VALUE (name);
1654 cp_error ("`%T' is not an aggregate typedef", name);
1658 if (! IS_AGGR_TYPE (type)
1659 && TREE_CODE (type) != TEMPLATE_TYPE_PARM)
1662 cp_error ("`%T' is not an aggregate type", type);
1668 /* Like is_aggr_typedef, but returns typedef if successful. */
1670 get_aggr_from_typedef (name, or_else)
1676 if (name == error_mark_node)
1679 if (IDENTIFIER_HAS_TYPE_VALUE (name))
1680 type = IDENTIFIER_TYPE_VALUE (name);
1684 cp_error ("`%T' fails to be an aggregate typedef", name);
1688 if (! IS_AGGR_TYPE (type)
1689 && TREE_CODE (type) != TEMPLATE_TYPE_PARM)
1692 cp_error ("type `%T' is of non-aggregate type", type);
1699 get_type_value (name)
1702 if (name == error_mark_node)
1705 if (IDENTIFIER_HAS_TYPE_VALUE (name))
1706 return IDENTIFIER_TYPE_VALUE (name);
1712 /* This code could just as well go in `class.c', but is placed here for
1715 /* For an expression of the form CNAME :: NAME (PARMLIST), build
1716 the appropriate function call. */
1718 build_member_call (cname, name, parmlist)
1719 tree cname, name, parmlist;
1722 tree method_name = name;
1724 int dont_use_this = 0;
1725 tree basetype_path, decl;
1727 if (TREE_CODE (method_name) == BIT_NOT_EXPR)
1729 method_name = TREE_OPERAND (method_name, 0);
1733 if (TREE_CODE (cname) == SCOPE_REF)
1734 cname = resolve_scope_to_name (NULL_TREE, cname);
1736 if (cname == NULL_TREE || ! (type = get_aggr_from_typedef (cname, 1)))
1737 return error_mark_node;
1739 /* An operator we did not like. */
1740 if (name == NULL_TREE)
1741 return error_mark_node;
1746 /* Everything can explicitly call a destructor; see 12.4 */
1747 if (! TYPE_HAS_DESTRUCTOR (type))
1748 cp_error ("type `%#T' does not have a destructor", type);
1751 cp_error ("cannot call destructor `%T::~%T' without object", type,
1753 return error_mark_node;
1756 /* No object? Then just fake one up, and let build_method_call
1757 figure out what to do. */
1758 if (current_class_type == 0
1759 || get_base_distance (type, current_class_type, 0, &basetype_path) == -1)
1764 basetype_path = TYPE_BINFO (type);
1765 decl = build1 (NOP_EXPR, TYPE_POINTER_TO (type), error_mark_node);
1767 else if (current_class_decl == 0)
1770 decl = build1 (NOP_EXPR, TYPE_POINTER_TO (type), error_mark_node);
1774 tree olddecl = current_class_decl;
1775 tree oldtype = TREE_TYPE (TREE_TYPE (olddecl));
1776 if (oldtype != type)
1778 tree newtype = build_type_variant (type, TYPE_READONLY (oldtype),
1779 TYPE_VOLATILE (oldtype));
1780 decl = convert_force (build_pointer_type (newtype), olddecl, 0);
1786 decl = build_indirect_ref (decl, NULL_PTR);
1788 if (t = lookup_fnfields (basetype_path, method_name, 0))
1789 return build_method_call (decl, method_name, parmlist, basetype_path,
1790 LOOKUP_NORMAL|LOOKUP_NONVIRTUAL);
1791 if (TREE_CODE (name) == IDENTIFIER_NODE
1792 && ((t = lookup_field (TYPE_BINFO (type), name, 1, 0))))
1794 if (t == error_mark_node)
1795 return error_mark_node;
1796 if (TREE_CODE (t) == FIELD_DECL)
1800 cp_error ("invalid use of non-static field `%D'", t);
1801 return error_mark_node;
1803 decl = build (COMPONENT_REF, TREE_TYPE (t), decl, t);
1805 else if (TREE_CODE (t) == VAR_DECL)
1809 cp_error ("invalid use of member `%D'", t);
1810 return error_mark_node;
1812 if (TYPE_LANG_SPECIFIC (TREE_TYPE (decl))
1813 && TYPE_OVERLOADS_CALL_EXPR (TREE_TYPE (decl)))
1814 return build_opfncall (CALL_EXPR, LOOKUP_NORMAL, decl, parmlist, NULL_TREE);
1815 return build_function_call (decl, parmlist);
1819 cp_error ("no method `%T::%D'", type, name);
1820 return error_mark_node;
1824 /* Build a reference to a member of an aggregate. This is not a
1825 C++ `&', but really something which can have its address taken,
1826 and then act as a pointer to member, for example CNAME :: FIELD
1827 can have its address taken by saying & CNAME :: FIELD.
1829 @@ Prints out lousy diagnostics for operator <typename>
1832 @@ This function should be rewritten and placed in search.c. */
1834 build_offset_ref (cname, name)
1837 tree decl, type, fnfields, fields, t = error_mark_node;
1838 tree basetypes = NULL_TREE;
1841 if (TREE_CODE (cname) == SCOPE_REF)
1842 cname = resolve_scope_to_name (NULL_TREE, cname);
1844 if (cname == NULL_TREE || ! is_aggr_typedef (cname, 1))
1845 return error_mark_node;
1847 type = IDENTIFIER_TYPE_VALUE (cname);
1849 if (TREE_CODE (name) == BIT_NOT_EXPR)
1852 name = TREE_OPERAND (name, 0);
1855 if (TYPE_SIZE (type) == 0)
1857 t = IDENTIFIER_CLASS_VALUE (name);
1860 cp_error ("incomplete type `%T' does not have member `%D'", type,
1862 return error_mark_node;
1864 if (TREE_CODE (t) == TYPE_DECL || TREE_CODE (t) == VAR_DECL
1865 || TREE_CODE (t) == CONST_DECL)
1870 if (TREE_CODE (t) == FIELD_DECL)
1871 sorry ("use of member in incomplete aggregate type");
1872 else if (TREE_CODE (t) == FUNCTION_DECL)
1873 sorry ("use of member function in incomplete aggregate type");
1875 my_friendly_abort (52);
1876 return error_mark_node;
1880 if (TREE_CODE (name) == TYPE_EXPR)
1881 /* Pass a TYPE_DECL to build_component_type_expr. */
1882 return build_component_type_expr (TYPE_NAME (TREE_TYPE (cname)),
1883 name, NULL_TREE, 1);
1886 if (current_class_type == 0
1887 || get_base_distance (type, current_class_type, 0, &basetypes) == -1)
1889 basetypes = TYPE_BINFO (type);
1890 decl = build1 (NOP_EXPR,
1891 IDENTIFIER_TYPE_VALUE (cname),
1894 else if (current_class_decl == 0)
1895 decl = build1 (NOP_EXPR, IDENTIFIER_TYPE_VALUE (cname),
1900 fnfields = lookup_fnfields (basetypes, name, 1);
1901 fields = lookup_field (basetypes, name, 0, 0);
1903 if (fields == error_mark_node || fnfields == error_mark_node)
1904 return error_mark_node;
1906 /* A lot of this logic is now handled in lookup_field and
1910 basetypes = TREE_PURPOSE (fnfields);
1912 /* Go from the TREE_BASELINK to the member function info. */
1913 t = TREE_VALUE (fnfields);
1917 if (DECL_FIELD_CONTEXT (fields) == DECL_FIELD_CONTEXT (t))
1919 error ("ambiguous member reference: member `%s' defined as both field and function",
1920 IDENTIFIER_POINTER (name));
1921 return error_mark_node;
1923 if (UNIQUELY_DERIVED_FROM_P (DECL_FIELD_CONTEXT (fields), DECL_FIELD_CONTEXT (t)))
1925 else if (UNIQUELY_DERIVED_FROM_P (DECL_FIELD_CONTEXT (t), DECL_FIELD_CONTEXT (fields)))
1929 error ("ambiguous member reference: member `%s' derives from distinct classes in multiple inheritance lattice");
1930 return error_mark_node;
1934 if (t == TREE_VALUE (fnfields))
1936 extern int flag_save_memoized_contexts;
1938 if (DECL_CHAIN (t) == NULL_TREE || dtor)
1940 enum access_type access;
1942 /* unique functions are handled easily. */
1944 access = compute_access (basetypes, t);
1945 if (access == access_protected)
1947 cp_error_at ("member function `%#D' is protected", t);
1948 error ("in this context");
1949 return error_mark_node;
1951 if (access == access_private)
1953 cp_error_at ("member function `%#D' is private", t);
1954 error ("in this context");
1955 return error_mark_node;
1957 assemble_external (t);
1958 return build (OFFSET_REF, TREE_TYPE (t), decl, t);
1961 /* overloaded functions may need more work. */
1964 if (TYPE_HAS_DESTRUCTOR (type)
1965 && DECL_CHAIN (DECL_CHAIN (t)) == NULL_TREE)
1971 /* FNFIELDS is most likely allocated on the search_obstack,
1972 which will go away after this class scope. If we need
1973 to save this value for later (either for memoization
1974 or for use as an initializer for a static variable), then
1977 ??? The smart thing to do for the case of saving initializers
1978 is to resolve them before we're done with this scope. */
1979 if (!TREE_PERMANENT (fnfields)
1980 && ((flag_save_memoized_contexts && global_bindings_p ())
1981 || ! allocation_temporary_p ()))
1982 fnfields = copy_list (fnfields);
1983 t = build_tree_list (error_mark_node, fnfields);
1984 TREE_TYPE (t) = build_offset_type (type, unknown_type_node);
1989 /* Now that we know we are looking for a field, see if we
1990 have access to that field. Lookup_field will give us the
1993 t = lookup_field (basetypes, name, 1, 0);
1995 if (t == error_mark_node)
1996 return error_mark_node;
2000 cp_error ("`%D' is not a member of type `%T'", name, type);
2001 return error_mark_node;
2004 if (TREE_CODE (t) == TYPE_DECL)
2009 /* static class members and class-specific enum
2010 values can be returned without further ado. */
2011 if (TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == CONST_DECL)
2013 assemble_external (t);
2018 if (TREE_CODE (t) == FIELD_DECL && DECL_BIT_FIELD (t))
2020 cp_error ("illegal pointer to bit field `%D'", t);
2021 return error_mark_node;
2024 /* static class functions too. */
2025 if (TREE_CODE (t) == FUNCTION_DECL && TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
2026 my_friendly_abort (53);
2028 /* In member functions, the form `cname::name' is no longer
2029 equivalent to `this->cname::name'. */
2030 return build (OFFSET_REF, build_offset_type (type, TREE_TYPE (t)), decl, t);
2033 /* Given an object EXP and a member function reference MEMBER,
2034 return the address of the actual member function. */
2036 get_member_function (exp_addr_ptr, exp, member)
2040 tree ctype = TREE_TYPE (exp);
2041 tree function = save_expr (build_unary_op (ADDR_EXPR, member, 0));
2043 if (TYPE_VIRTUAL_P (ctype)
2044 || (flag_all_virtual == 1 && TYPE_OVERLOADS_METHOD_CALL_EXPR (ctype)))
2049 /* Save away the unadulterated `this' pointer. */
2050 exp_addr = save_expr (*exp_addr_ptr);
2052 /* Cast function to signed integer. */
2053 e0 = build1 (NOP_EXPR, integer_type_node, function);
2055 /* There is a hack here that takes advantage of
2056 twos complement arithmetic, and the fact that
2057 there are more than one UNITS to the WORD.
2058 If the high bit is set for the `function',
2059 then we pretend it is a virtual function,
2060 and the array indexing will knock this bit
2061 out the top, leaving a valid index. */
2062 if (UNITS_PER_WORD <= 1)
2063 my_friendly_abort (54);
2065 e1 = build (GT_EXPR, boolean_type_node, e0, integer_zero_node);
2066 e1 = build_compound_expr (tree_cons (NULL_TREE, exp_addr,
2067 build_tree_list (NULL_TREE, e1)));
2068 e1 = save_expr (e1);
2070 if (TREE_SIDE_EFFECTS (*exp_addr_ptr))
2072 exp = build_indirect_ref (exp_addr, NULL_PTR);
2073 *exp_addr_ptr = exp_addr;
2076 /* This is really hairy: if the function pointer is a pointer
2077 to a non-virtual member function, then we can't go mucking
2078 with the `this' pointer (any more than we already have to
2079 this point). If it is a pointer to a virtual member function,
2080 then we have to adjust the `this' pointer according to
2081 what the virtual function table tells us. */
2083 e3 = build_vfn_ref (exp_addr_ptr, exp, e0);
2084 my_friendly_assert (e3 != error_mark_node, 213);
2086 /* Change this pointer type from `void *' to the
2087 type it is really supposed to be. */
2088 TREE_TYPE (e3) = TREE_TYPE (function);
2090 /* If non-virtual, use what we had originally. Otherwise,
2091 use the value we get from the virtual function table. */
2092 *exp_addr_ptr = build_conditional_expr (e1, exp_addr, *exp_addr_ptr);
2094 function = build_conditional_expr (e1, function, e3);
2096 return build_indirect_ref (function, NULL_PTR);
2099 /* If a OFFSET_REF made it through to here, then it did
2100 not have its address taken. */
2103 resolve_offset_ref (exp)
2106 tree type = TREE_TYPE (exp);
2107 tree base = NULL_TREE;
2109 tree basetype, addr;
2111 if (TREE_CODE (exp) == TREE_LIST)
2112 return build_unary_op (ADDR_EXPR, exp, 0);
2114 if (TREE_CODE (exp) != OFFSET_REF)
2116 my_friendly_assert (TREE_CODE (type) == OFFSET_TYPE, 214);
2117 if (TYPE_OFFSET_BASETYPE (type) != current_class_type)
2119 error ("object missing in use of pointer-to-member construct");
2120 return error_mark_node;
2123 type = TREE_TYPE (type);
2128 member = TREE_OPERAND (exp, 1);
2129 base = TREE_OPERAND (exp, 0);
2132 if ((TREE_CODE (member) == VAR_DECL
2133 && ! TYPE_PTRMEMFUNC_P (TREE_TYPE (member)))
2134 || TREE_CODE (TREE_TYPE (member)) == FUNCTION_TYPE)
2136 /* These were static members. */
2137 if (mark_addressable (member) == 0)
2138 return error_mark_node;
2142 /* Syntax error can cause a member which should
2143 have been seen as static to be grok'd as non-static. */
2144 if (TREE_CODE (member) == FIELD_DECL && C_C_D == NULL_TREE)
2146 if (TREE_ADDRESSABLE (member) == 0)
2148 cp_error_at ("member `%D' is non-static in static member function context", member);
2149 error ("at this point in file");
2150 TREE_ADDRESSABLE (member) = 1;
2152 return error_mark_node;
2155 /* The first case is really just a reference to a member of `this'. */
2156 if (TREE_CODE (member) == FIELD_DECL
2158 || (TREE_CODE (base) == NOP_EXPR
2159 && TREE_OPERAND (base, 0) == error_mark_node)))
2162 enum access_type access;
2164 if (TREE_CODE (exp) == OFFSET_REF && TREE_CODE (type) == OFFSET_TYPE)
2165 basetype = TYPE_OFFSET_BASETYPE (type);
2167 basetype = DECL_CONTEXT (member);
2169 base = current_class_decl;
2171 if (get_base_distance (basetype, TREE_TYPE (TREE_TYPE (base)), 0, &basetype_path) < 0)
2173 error_not_base_type (basetype, TREE_TYPE (TREE_TYPE (base)));
2174 return error_mark_node;
2176 addr = convert_pointer_to (basetype, base);
2177 access = compute_access (basetype_path, member);
2178 if (access == access_public)
2179 return build (COMPONENT_REF, TREE_TYPE (member),
2180 build_indirect_ref (addr, NULL_PTR), member);
2181 if (access == access_protected)
2183 cp_error_at ("member `%D' is protected", member);
2184 error ("in this context");
2185 return error_mark_node;
2187 if (access == access_private)
2189 cp_error_at ("member `%D' is private", member);
2190 error ("in this context");
2191 return error_mark_node;
2193 my_friendly_abort (55);
2196 /* If this is a reference to a member function, then return
2197 the address of the member function (which may involve going
2198 through the object's vtable), otherwise, return an expression
2199 for the dereferenced pointer-to-member construct. */
2200 addr = build_unary_op (ADDR_EXPR, base, 0);
2202 if (TREE_CODE (TREE_TYPE (member)) == METHOD_TYPE)
2204 basetype = DECL_CLASS_CONTEXT (member);
2205 addr = convert_pointer_to (basetype, addr);
2206 return build_unary_op (ADDR_EXPR, get_member_function (&addr, build_indirect_ref (addr, NULL_PTR), member), 0);
2208 else if (TREE_CODE (TREE_TYPE (member)) == OFFSET_TYPE)
2210 basetype = TYPE_OFFSET_BASETYPE (TREE_TYPE (member));
2211 addr = convert_pointer_to (basetype, addr);
2212 member = convert (ptrdiff_type_node,
2213 build_unary_op (ADDR_EXPR, member, 0));
2214 return build1 (INDIRECT_REF, type,
2215 build (PLUS_EXPR, build_pointer_type (type),
2218 else if (TYPE_PTRMEMFUNC_P (TREE_TYPE (member)))
2220 return get_member_function_from_ptrfunc (&addr, member);
2222 my_friendly_abort (56);
2227 /* Return either DECL or its known constant value (if it has one). */
2230 decl_constant_value (decl)
2233 if (! TREE_THIS_VOLATILE (decl)
2235 /* These may be necessary for C, but they break C++. */
2236 ! TREE_PUBLIC (decl)
2237 /* Don't change a variable array bound or initial value to a constant
2238 in a place where a variable is invalid. */
2241 && DECL_INITIAL (decl) != 0
2242 && TREE_CODE (DECL_INITIAL (decl)) != ERROR_MARK
2243 /* This is invalid if initial value is not constant.
2244 If it has either a function call, a memory reference,
2245 or a variable, then re-evaluating it could give different results. */
2246 && TREE_CONSTANT (DECL_INITIAL (decl))
2247 /* Check for cases where this is sub-optimal, even though valid. */
2248 && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR
2250 /* We must allow this to work outside of functions so that
2251 static constants can be used for array sizes. */
2252 && current_function_decl != 0
2253 && DECL_MODE (decl) != BLKmode
2256 return DECL_INITIAL (decl);
2260 /* Friend handling routines. */
2261 /* Friend data structures:
2263 Lists of friend functions come from TYPE_DECL nodes. Since all
2264 aggregate types are automatically typedef'd, these nodes are guaranteed
2267 The TREE_PURPOSE of a friend list is the name of the friend,
2268 and its TREE_VALUE is another list.
2270 For each element of that list, either the TREE_VALUE or the TREE_PURPOSE
2271 will be filled in, but not both. The TREE_VALUE of that list is an
2272 individual function which is a friend. The TREE_PURPOSE of that list
2273 indicates a type in which all functions by that name are friends.
2275 Lists of friend classes come from _TYPE nodes. Love that consistency
2279 is_friend_type (type1, type2)
2282 return is_friend (type1, type2);
2286 is_friend (type, supplicant)
2287 tree type, supplicant;
2292 if (supplicant == NULL_TREE || type == NULL_TREE)
2295 declp = (TREE_CODE_CLASS (TREE_CODE (supplicant)) == 'd');
2298 /* It's a function decl. */
2300 tree list = DECL_FRIENDLIST (TYPE_NAME (type));
2301 tree name = DECL_NAME (supplicant);
2304 if (DECL_FUNCTION_MEMBER_P (supplicant))
2305 ctype = DECL_CLASS_CONTEXT (supplicant);
2309 for (; list ; list = TREE_CHAIN (list))
2311 if (name == TREE_PURPOSE (list))
2313 tree friends = TREE_VALUE (list);
2314 name = DECL_ASSEMBLER_NAME (supplicant);
2315 for (; friends ; friends = TREE_CHAIN (friends))
2317 if (ctype == TREE_PURPOSE (friends))
2319 if (name == DECL_ASSEMBLER_NAME (TREE_VALUE (friends)))
2329 if (type == supplicant)
2332 list = CLASSTYPE_FRIEND_CLASSES (TREE_TYPE (TYPE_NAME (type)));
2333 for (; list ; list = TREE_CHAIN (list))
2334 if (supplicant == TREE_VALUE (list))
2342 context = DECL_CONTEXT (TYPE_NAME (supplicant));
2343 else if (DECL_FUNCTION_MEMBER_P (supplicant))
2344 context = DECL_CLASS_CONTEXT (supplicant);
2346 context = NULL_TREE;
2349 return is_friend (type, context);
2355 /* Add a new friend to the friends of the aggregate type TYPE.
2356 DECL is the FUNCTION_DECL of the friend being added. */
2358 add_friend (type, decl)
2361 tree typedecl = TYPE_NAME (type);
2362 tree list = DECL_FRIENDLIST (typedecl);
2363 tree name = DECL_NAME (decl);
2367 if (name == TREE_PURPOSE (list))
2369 tree friends = TREE_VALUE (list);
2370 for (; friends ; friends = TREE_CHAIN (friends))
2372 if (decl == TREE_VALUE (friends))
2374 cp_warning ("`%D' is already a friend of class `%T'",
2376 cp_warning_at ("previous friend declaration of `%D'",
2377 TREE_VALUE (friends));
2381 TREE_VALUE (list) = tree_cons (error_mark_node, decl,
2385 list = TREE_CHAIN (list);
2387 DECL_FRIENDLIST (typedecl)
2388 = tree_cons (DECL_NAME (decl), build_tree_list (error_mark_node, decl),
2389 DECL_FRIENDLIST (typedecl));
2390 if (DECL_NAME (decl) == ansi_opname[(int) MODIFY_EXPR])
2392 tree parmtypes = TYPE_ARG_TYPES (TREE_TYPE (decl));
2393 TYPE_HAS_ASSIGNMENT (TREE_TYPE (typedecl)) = 1;
2394 if (parmtypes && TREE_CHAIN (parmtypes))
2396 tree parmtype = TREE_VALUE (TREE_CHAIN (parmtypes));
2397 if (TREE_CODE (parmtype) == REFERENCE_TYPE
2398 && TREE_TYPE (parmtypes) == TREE_TYPE (typedecl))
2399 TYPE_HAS_ASSIGN_REF (TREE_TYPE (typedecl)) = 1;
2404 /* Declare that every member function NAME in FRIEND_TYPE
2405 (which may be NULL_TREE) is a friend of type TYPE. */
2407 add_friends (type, name, friend_type)
2408 tree type, name, friend_type;
2410 tree typedecl = TYPE_NAME (type);
2411 tree list = DECL_FRIENDLIST (typedecl);
2415 if (name == TREE_PURPOSE (list))
2417 tree friends = TREE_VALUE (list);
2418 while (friends && TREE_PURPOSE (friends) != friend_type)
2419 friends = TREE_CHAIN (friends);
2422 warning ("method `%s::%s' is already a friend of class",
2423 TYPE_NAME_STRING (friend_type),
2424 IDENTIFIER_POINTER (name));
2426 warning ("function `%s' is already a friend of class `%s'",
2427 IDENTIFIER_POINTER (name),
2428 IDENTIFIER_POINTER (DECL_NAME (typedecl)));
2430 TREE_VALUE (list) = tree_cons (friend_type, NULL_TREE,
2434 list = TREE_CHAIN (list);
2436 DECL_FRIENDLIST (typedecl) =
2438 build_tree_list (friend_type, NULL_TREE),
2439 DECL_FRIENDLIST (typedecl));
2440 if (! strncmp (IDENTIFIER_POINTER (name),
2441 IDENTIFIER_POINTER (ansi_opname[(int) MODIFY_EXPR]),
2442 strlen (IDENTIFIER_POINTER (ansi_opname[(int) MODIFY_EXPR]))))
2444 TYPE_HAS_ASSIGNMENT (TREE_TYPE (typedecl)) = 1;
2445 sorry ("declaring \"friend operator =\" will not find \"operator = (X&)\" if it exists");
2449 /* Set up a cross reference so that type TYPE will make member function
2450 CTYPE::DECL a friend when CTYPE is finally defined. For more than
2451 one, set up a cross reference so that functions with the name DECL
2452 and type CTYPE know that they are friends of TYPE. */
2454 xref_friend (type, decl, ctype)
2455 tree type, decl, ctype;
2457 tree friend_decl = TYPE_NAME (ctype);
2459 tree typedecl = TYPE_NAME (type);
2460 tree t = tree_cons (NULL_TREE, ctype, DECL_UNDEFINED_FRIENDS (typedecl));
2462 DECL_UNDEFINED_FRIENDS (typedecl) = t;
2466 SET_DECL_WAITING_FRIENDS (friend_decl,
2468 DECL_WAITING_FRIENDS (friend_decl)));
2469 TREE_TYPE (DECL_WAITING_FRIENDS (friend_decl)) = decl;
2472 /* Make FRIEND_TYPE a friend class to TYPE. If FRIEND_TYPE has already
2473 been defined, we make all of its member functions friends of
2474 TYPE. If not, we make it a pending friend, which can later be added
2475 when its definition is seen. If a type is defined, then its TYPE_DECL's
2476 DECL_UNDEFINED_FRIENDS contains a (possibly empty) list of friend
2477 classes that are not defined. If a type has not yet been defined,
2478 then the DECL_WAITING_FRIENDS contains a list of types
2479 waiting to make it their friend. Note that these two can both
2480 be in use at the same time! */
2482 make_friend_class (type, friend_type)
2483 tree type, friend_type;
2487 if (IS_SIGNATURE (type))
2489 error ("`friend' declaration in signature definition");
2492 if (IS_SIGNATURE (friend_type))
2494 error ("signature type `%s' declared `friend'",
2495 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (friend_type))));
2498 if (type == friend_type)
2500 pedwarn ("class `%s' is implicitly friends with itself",
2501 TYPE_NAME_STRING (type));
2505 GNU_xref_hier (TYPE_NAME_STRING (type),
2506 TYPE_NAME_STRING (friend_type), 0, 0, 1);
2508 classes = CLASSTYPE_FRIEND_CLASSES (type);
2509 while (classes && TREE_VALUE (classes) != friend_type)
2510 classes = TREE_CHAIN (classes);
2512 warning ("class `%s' is already friends with class `%s'",
2513 TYPE_NAME_STRING (TREE_VALUE (classes)), TYPE_NAME_STRING (type));
2516 CLASSTYPE_FRIEND_CLASSES (type)
2517 = tree_cons (NULL_TREE, friend_type, CLASSTYPE_FRIEND_CLASSES (type));
2521 /* Main friend processor. This is large, and for modularity purposes,
2522 has been removed from grokdeclarator. It returns `void_type_node'
2523 to indicate that something happened, though a FIELD_DECL is
2526 CTYPE is the class this friend belongs to.
2528 DECLARATOR is the name of the friend.
2530 DECL is the FUNCTION_DECL that the friend is.
2532 In case we are parsing a friend which is part of an inline
2533 definition, we will need to store PARM_DECL chain that comes
2534 with it into the DECL_ARGUMENTS slot of the FUNCTION_DECL.
2536 FLAGS is just used for `grokclassfn'.
2538 QUALS say what special qualifies should apply to the object
2539 pointed to by `this'. */
2541 do_friend (ctype, declarator, decl, parmdecls, flags, quals)
2542 tree ctype, declarator, decl, parmdecls;
2543 enum overload_flags flags;
2546 /* Every decl that gets here is a friend of something. */
2547 DECL_FRIEND_P (decl) = 1;
2551 tree cname = TYPE_NAME (ctype);
2552 if (TREE_CODE (cname) == TYPE_DECL)
2553 cname = DECL_NAME (cname);
2555 /* A method friend. */
2556 if (TREE_CODE (decl) == FUNCTION_DECL)
2558 if (flags == NO_SPECIAL && ctype && declarator == cname)
2559 DECL_CONSTRUCTOR_P (decl) = 1;
2561 /* This will set up DECL_ARGUMENTS for us. */
2562 grokclassfn (ctype, cname, decl, flags, quals);
2563 if (TYPE_SIZE (ctype) != 0)
2564 check_classfn (ctype, cname, decl);
2566 if (TREE_TYPE (decl) != error_mark_node)
2568 if (TYPE_SIZE (ctype))
2570 /* We don't call pushdecl here yet, or ever on this
2571 actual FUNCTION_DECL. We must preserve its TREE_CHAIN
2573 make_decl_rtl (decl, NULL_PTR, 1);
2574 add_friend (current_class_type, decl);
2578 register char *classname
2579 = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (ctype)));
2581 error ("member declared as friend before type `%s' defined",
2588 /* Possibly a bunch of method friends. */
2590 /* Get the class they belong to. */
2591 tree ctype = IDENTIFIER_TYPE_VALUE (cname);
2593 /* This class is defined, use its methods now. */
2594 if (TYPE_SIZE (ctype))
2596 tree fields = lookup_fnfields (TYPE_BINFO (ctype), declarator, 0);
2598 add_friends (current_class_type, declarator, ctype);
2600 error ("method `%s' is not a member of class `%s'",
2601 IDENTIFIER_POINTER (declarator),
2602 IDENTIFIER_POINTER (cname));
2605 /* Note: DECLARATOR actually has more than one; in this
2606 case, we're making sure that fns with the name DECLARATOR
2607 and type CTYPE know they are friends of the current
2609 xref_friend (current_class_type, declarator, ctype);
2610 decl = void_type_node;
2613 else if (TREE_CODE (decl) == FUNCTION_DECL
2614 && ((IDENTIFIER_LENGTH (declarator) == 4
2615 && IDENTIFIER_POINTER (declarator)[0] == 'm'
2616 && ! strcmp (IDENTIFIER_POINTER (declarator), "main"))
2617 || (IDENTIFIER_LENGTH (declarator) > 10
2618 && IDENTIFIER_POINTER (declarator)[0] == '_'
2619 && IDENTIFIER_POINTER (declarator)[1] == '_'
2620 && strncmp (IDENTIFIER_POINTER (declarator)+2,
2621 "builtin_", 8) == 0)))
2623 /* raw "main", and builtin functions never gets overloaded,
2624 but they can become friends. */
2625 add_friend (current_class_type, decl);
2626 DECL_FRIEND_P (decl) = 1;
2627 decl = void_type_node;
2630 @@ or possibly a friend from a base class ?!? */
2631 else if (TREE_CODE (decl) == FUNCTION_DECL)
2633 /* Friends must all go through the overload machinery,
2634 even though they may not technically be overloaded.
2636 Note that because classes all wind up being top-level
2637 in their scope, their friend wind up in top-level scope as well. */
2638 DECL_ASSEMBLER_NAME (decl)
2639 = build_decl_overload (declarator, TYPE_ARG_TYPES (TREE_TYPE (decl)),
2640 TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE);
2641 DECL_ARGUMENTS (decl) = parmdecls;
2642 DECL_CLASS_CONTEXT (decl) = current_class_type;
2644 /* We can call pushdecl here, because the TREE_CHAIN of this
2645 FUNCTION_DECL is not needed for other purposes. */
2646 decl = pushdecl (decl);
2648 make_decl_rtl (decl, NULL_PTR, 1);
2649 add_friend (current_class_type, decl);
2651 DECL_FRIEND_P (decl) = 1;
2653 TREE_OVERLOADED (declarator) = 1;
2658 /* @@ Should be able to ingest later definitions of this function
2660 tree decl = lookup_name_nonclass (declarator);
2661 if (decl == NULL_TREE)
2663 warning ("implicitly declaring `%s' as struct",
2664 IDENTIFIER_POINTER (declarator));
2665 decl = xref_tag (record_type_node, declarator, NULL_TREE, 1);
2666 decl = TYPE_NAME (decl);
2669 /* Allow abbreviated declarations of overloaded functions,
2670 but not if those functions are really class names. */
2671 if (TREE_CODE (decl) == TREE_LIST && TREE_TYPE (TREE_PURPOSE (decl)))
2673 warning ("`friend %s' archaic, use `friend class %s' instead",
2674 IDENTIFIER_POINTER (declarator),
2675 IDENTIFIER_POINTER (declarator));
2676 decl = TREE_TYPE (TREE_PURPOSE (decl));
2679 if (TREE_CODE (decl) == TREE_LIST)
2680 add_friends (current_class_type, TREE_PURPOSE (decl), NULL_TREE);
2682 make_friend_class (current_class_type, TREE_TYPE (decl));
2683 decl = void_type_node;
2688 /* TYPE has now been defined. It may, however, have a number of things
2689 waiting make make it their friend. We resolve these references
2692 embrace_waiting_friends (type)
2695 tree decl = TYPE_NAME (type);
2698 if (TREE_CODE (decl) != TYPE_DECL)
2701 for (waiters = DECL_WAITING_FRIENDS (decl); waiters;
2702 waiters = TREE_CHAIN (waiters))
2704 tree waiter = TREE_PURPOSE (waiters);
2706 tree waiter_prev = TREE_VALUE (waiters);
2708 tree decl = TREE_TYPE (waiters);
2709 tree name = decl ? (TREE_CODE (decl) == IDENTIFIER_NODE
2710 ? decl : DECL_NAME (decl)) : NULL_TREE;
2713 /* @@ There may be work to be done since we have not verified
2714 @@ consistency between original and friend declarations
2715 @@ of the functions waiting to become friends. */
2716 tree field = lookup_fnfields (TYPE_BINFO (type), name, 0);
2719 add_friends (waiter, name, type);
2721 add_friend (waiter, decl);
2723 error_with_file_and_line (DECL_SOURCE_FILE (TYPE_NAME (waiter)),
2724 DECL_SOURCE_LINE (TYPE_NAME (waiter)),
2725 "no method `%s' defined in class `%s' to be friend",
2726 IDENTIFIER_POINTER (DECL_NAME (TREE_TYPE (waiters))),
2727 TYPE_NAME_STRING (type));
2730 make_friend_class (type, waiter);
2733 if (TREE_CHAIN (waiter_prev))
2734 TREE_CHAIN (waiter_prev) = TREE_CHAIN (TREE_CHAIN (waiter_prev));
2736 DECL_UNDEFINED_FRIENDS (TYPE_NAME (waiter)) = NULL_TREE;
2741 /* Common subroutines of build_new and build_vec_delete. */
2743 /* Common interface for calling "builtin" functions that are not
2747 build_builtin_call (type, node, arglist)
2752 tree rval = build (CALL_EXPR, type, node, arglist, 0);
2753 TREE_SIDE_EFFECTS (rval) = 1;
2754 assemble_external (TREE_OPERAND (node, 0));
2755 TREE_USED (TREE_OPERAND (node, 0)) = 1;
2759 /* Generate a C++ "new" expression. DECL is either a TREE_LIST
2760 (which needs to go through some sort of groktypename) or it
2761 is the name of the class we are newing. INIT is an initialization value.
2762 It is either an EXPRLIST, an EXPR_NO_COMMAS, or something in braces.
2763 If INIT is void_type_node, it means do *not* call a constructor
2766 For types with constructors, the data returned is initialized
2767 by the appropriate constructor.
2769 Whether the type has a constructor or not, if it has a pointer
2770 to a virtual function table, then that pointer is set up
2773 Unless I am mistaken, a call to new () will return initialized
2774 data regardless of whether the constructor itself is private or
2775 not. NOPE; new fails if the constructor is private (jcm).
2777 Note that build_new does nothing to assure that any special
2778 alignment requirements of the type are met. Rather, it leaves
2779 it up to malloc to do the right thing. Otherwise, folding to
2780 the right alignment cal cause problems if the user tries to later
2781 free the memory returned by `new'.
2783 PLACEMENT is the `placement' list for user-defined operator new (). */
2785 extern int flag_check_new;
2788 build_new (placement, decl, init, use_global_new)
2793 tree type, true_type, size, rval;
2795 tree alloc_expr, alloc_temp;
2797 enum tree_code code = NEW_EXPR;
2799 tree pending_sizes = NULL_TREE;
2801 if (decl == error_mark_node)
2802 return error_mark_node;
2804 if (TREE_CODE (decl) == TREE_LIST)
2806 tree absdcl = TREE_VALUE (decl);
2807 tree last_absdcl = NULL_TREE;
2808 int old_immediate_size_expand;
2810 if (current_function_decl
2811 && DECL_CONSTRUCTOR_P (current_function_decl))
2813 old_immediate_size_expand = immediate_size_expand;
2814 immediate_size_expand = 0;
2817 nelts = integer_one_node;
2819 if (absdcl && TREE_CODE (absdcl) == CALL_EXPR)
2820 my_friendly_abort (215);
2821 while (absdcl && TREE_CODE (absdcl) == INDIRECT_REF)
2823 last_absdcl = absdcl;
2824 absdcl = TREE_OPERAND (absdcl, 0);
2827 if (absdcl && TREE_CODE (absdcl) == ARRAY_REF)
2829 /* probably meant to be a vec new */
2832 while (TREE_OPERAND (absdcl, 0)
2833 && TREE_CODE (TREE_OPERAND (absdcl, 0)) == ARRAY_REF)
2835 last_absdcl = absdcl;
2836 absdcl = TREE_OPERAND (absdcl, 0);
2840 this_nelts = TREE_OPERAND (absdcl, 1);
2841 if (this_nelts != error_mark_node)
2843 if (this_nelts == NULL_TREE)
2844 error ("new of array type fails to specify size");
2847 this_nelts = save_expr (convert (sizetype, this_nelts));
2848 absdcl = TREE_OPERAND (absdcl, 0);
2849 if (this_nelts == integer_zero_node)
2851 warning ("zero size array reserves no space");
2852 nelts = integer_zero_node;
2855 nelts = build_binary_op (MULT_EXPR, nelts, this_nelts, 1);
2859 nelts = integer_zero_node;
2863 TREE_OPERAND (last_absdcl, 0) = absdcl;
2865 TREE_VALUE (decl) = absdcl;
2867 type = true_type = groktypename (decl);
2868 if (! type || type == error_mark_node)
2870 immediate_size_expand = old_immediate_size_expand;
2871 return error_mark_node;
2874 if (current_function_decl
2875 && DECL_CONSTRUCTOR_P (current_function_decl))
2877 pending_sizes = get_pending_sizes ();
2878 immediate_size_expand = old_immediate_size_expand;
2881 else if (TREE_CODE (decl) == IDENTIFIER_NODE)
2883 if (IDENTIFIER_HAS_TYPE_VALUE (decl))
2885 /* An aggregate type. */
2886 type = IDENTIFIER_TYPE_VALUE (decl);
2887 decl = TYPE_NAME (type);
2891 /* A builtin type. */
2892 decl = lookup_name (decl, 1);
2893 my_friendly_assert (TREE_CODE (decl) == TYPE_DECL, 215);
2894 type = TREE_TYPE (decl);
2898 else if (TREE_CODE (decl) == TYPE_DECL)
2900 type = TREE_TYPE (decl);
2907 decl = TYPE_NAME (type);
2910 /* ``A reference cannot be created by the new operator. A reference
2911 is not an object (8.2.2, 8.4.3), so a pointer to it could not be
2912 returned by new.'' ARM 5.3.3 */
2913 if (TREE_CODE (type) == REFERENCE_TYPE)
2915 error ("new cannot be applied to a reference type");
2916 type = true_type = TREE_TYPE (type);
2919 if (TREE_CODE (type) == FUNCTION_TYPE)
2921 error ("new cannot be applied to a function type");
2922 return error_mark_node;
2925 /* When the object being created is an array, the new-expression yields a
2926 pointer to the initial element (if any) of the array. For example,
2927 both new int and new int[10] return an int*. 5.3.4. */
2928 if (TREE_CODE (type) == ARRAY_TYPE && has_array == 0)
2930 nelts = array_type_nelts_top (type);
2932 type = true_type = TREE_TYPE (type);
2935 if (TYPE_READONLY (type) || TYPE_VOLATILE (type))
2936 type = TYPE_MAIN_VARIANT (type);
2938 /* If our base type is an array, then make sure we know how many elements
2940 while (TREE_CODE (true_type) == ARRAY_TYPE)
2942 tree this_nelts = array_type_nelts_top (true_type);
2943 nelts = build_binary_op (MULT_EXPR, nelts, this_nelts, 1);
2944 true_type = TREE_TYPE (true_type);
2947 size = fold (build_binary_op (MULT_EXPR, size_in_bytes (true_type),
2950 size = size_in_bytes (type);
2952 if (true_type == void_type_node)
2954 error ("invalid type `void' for new");
2955 return error_mark_node;
2958 if (TYPE_SIZE (true_type) == 0)
2960 incomplete_type_error (0, true_type);
2961 return error_mark_node;
2964 if (TYPE_LANG_SPECIFIC (true_type)
2965 && CLASSTYPE_ABSTRACT_VIRTUALS (true_type))
2967 abstract_virtuals_error (NULL_TREE, true_type);
2968 return error_mark_node;
2971 if (TYPE_LANG_SPECIFIC (true_type) && IS_SIGNATURE (true_type))
2973 signature_error (NULL_TREE, true_type);
2974 return error_mark_node;
2977 /* Get a little extra space to store a couple of things before the new'ed
2979 if (has_array && TYPE_VEC_NEW_USES_COOKIE (true_type))
2981 tree extra = BI_header_size;
2983 size = size_binop (PLUS_EXPR, size, extra);
2987 code = VEC_NEW_EXPR;
2989 /* Allocate the object. */
2990 if (! use_global_new && TYPE_LANG_SPECIFIC (true_type)
2991 && (TYPE_GETS_NEW (true_type) & (1 << has_array)))
2992 rval = build_opfncall (code, LOOKUP_NORMAL,
2993 TYPE_POINTER_TO (true_type), size, placement);
2996 rval = build_opfncall (code, LOOKUP_GLOBAL|LOOKUP_COMPLAIN,
2997 ptr_type_node, size, placement);
2998 rval = convert (TYPE_POINTER_TO (true_type), rval);
3000 else if (! has_array && flag_this_is_variable > 0
3001 && TYPE_NEEDS_CONSTRUCTING (true_type) && init != void_type_node)
3003 if (init == NULL_TREE || TREE_CODE (init) == TREE_LIST)
3007 error ("constructors take parameter lists");
3008 return error_mark_node;
3013 rval = build_builtin_call (build_pointer_type (true_type),
3014 has_array ? BIVN : BIN,
3015 build_tree_list (NULL_TREE, size));
3017 /* See comment above as to why this is disabled. */
3020 rval = build (PLUS_EXPR, TYPE_POINTER_TO (true_type), rval,
3022 rval = build (BIT_AND_EXPR, TYPE_POINTER_TO (true_type),
3023 rval, build1 (BIT_NOT_EXPR, integer_type_node,
3027 TREE_CALLS_NEW (rval) = 1;
3030 if (flag_check_new && rval)
3032 /* For array new, we need to make sure that the call to new is
3033 not expanded as part of the RTL_EXPR for the initialization,
3034 so we can't just use save_expr here. */
3036 alloc_temp = get_temp_name (TREE_TYPE (rval), 0);
3037 alloc_expr = build (MODIFY_EXPR, TREE_TYPE (rval), alloc_temp, rval);
3038 TREE_SIDE_EFFECTS (alloc_expr) = 1;
3042 alloc_expr = NULL_TREE;
3044 /* if rval is NULL_TREE I don't have to allocate it, but are we totally
3045 sure we have some extra bytes in that case for the BI_header_size
3046 cookies? And how does that interact with the code below? (mrs) */
3047 /* Finish up some magic for new'ed arrays */
3048 if (has_array && TYPE_VEC_NEW_USES_COOKIE (true_type) && rval != NULL_TREE)
3050 tree extra = BI_header_size;
3052 rval = convert (ptr_type_node, rval); /* convert to void * first */
3053 rval = convert (string_type_node, rval); /* lets not add void* and ints */
3054 rval = save_expr (build_binary_op (PLUS_EXPR, rval, extra, 1));
3055 /* Store header info. */
3056 cookie = build_indirect_ref (build (MINUS_EXPR, TYPE_POINTER_TO (BI_header_type),
3057 rval, extra), NULL_PTR);
3058 exp1 = build (MODIFY_EXPR, void_type_node,
3059 build_component_ref (cookie, nc_nelts_field_id, 0, 0),
3061 TREE_SIDE_EFFECTS (exp1) = 1;
3062 rval = convert (build_pointer_type (true_type), rval);
3063 TREE_CALLS_NEW (rval) = 1;
3064 TREE_SIDE_EFFECTS (rval) = 1;
3065 rval = build_compound_expr (tree_cons (NULL_TREE, exp1,
3066 build_tree_list (NULL_TREE, rval)));
3069 if (rval == error_mark_node)
3070 return error_mark_node;
3072 /* Don't call any constructors or do any initialization. */
3073 if (init == void_type_node)
3076 if (TYPE_NEEDS_CONSTRUCTING (type) || init)
3078 if (! TYPE_NEEDS_CONSTRUCTING (type) && ! IS_AGGR_TYPE (type))
3080 /* New 2.0 interpretation: `new int (10)' means
3081 allocate an int, and initialize it with 10. */
3084 rval = save_expr (rval);
3085 deref = build_indirect_ref (rval, NULL_PTR);
3086 TREE_READONLY (deref) = 0;
3088 if (TREE_CHAIN (init) != NULL_TREE)
3089 pedwarn ("initializer list being treated as compound expression");
3090 init = build_compound_expr (init);
3092 init = convert_for_initialization (deref, type, init, LOOKUP_NORMAL,
3093 "new", NULL_TREE, 0);
3094 rval = build (COMPOUND_EXPR, TREE_TYPE (rval),
3095 build_modify_expr (deref, NOP_EXPR, init),
3097 TREE_NO_UNUSED_WARNING (rval) = 1;
3098 TREE_SIDE_EFFECTS (rval) = 1;
3099 TREE_CALLS_NEW (rval) = 1;
3101 else if (! has_array)
3104 /* Constructors are never virtual. If it has an initialization, we
3105 need to complain if we aren't allowed to use the ctor that took
3107 int flags = LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_COMPLAIN;
3109 if (rval && TYPE_USES_VIRTUAL_BASECLASSES (true_type))
3111 init = tree_cons (NULL_TREE, integer_one_node, init);
3112 flags |= LOOKUP_HAS_IN_CHARGE;
3117 if (newrval && TREE_CODE (TREE_TYPE (newrval)) == POINTER_TYPE)
3118 newrval = build_indirect_ref (newrval, NULL_PTR);
3120 newrval = build_method_call (newrval, constructor_name_full (true_type),
3121 init, NULL_TREE, flags);
3126 TREE_HAS_CONSTRUCTOR (rval) = 1;
3129 rval = error_mark_node;
3131 else if (current_function_decl == NULL_TREE)
3133 extern tree static_aggregates;
3135 /* In case of static initialization, SAVE_EXPR is good enough. */
3136 rval = save_expr (rval);
3137 init = copy_to_permanent (init);
3138 rval = copy_to_permanent (rval);
3139 static_aggregates = perm_tree_cons (init, rval, static_aggregates);
3143 /* Have to wrap this in RTL_EXPR for two cases:
3144 in base or member initialization and if we
3145 are a branch of a ?: operator. Since we
3146 can't easily know the latter, just do it always. */
3147 tree xval = make_node (RTL_EXPR);
3149 TREE_TYPE (xval) = TREE_TYPE (rval);
3150 do_pending_stack_adjust ();
3151 start_sequence_for_rtl_expr (xval);
3153 /* As a matter of principle, `start_sequence' should do this. */
3156 rval = save_expr (rval);
3157 rval = expand_vec_init (decl, rval,
3158 build_binary_op (MINUS_EXPR, nelts,
3159 integer_one_node, 1),
3162 do_pending_stack_adjust ();
3164 TREE_SIDE_EFFECTS (xval) = 1;
3165 TREE_CALLS_NEW (xval) = 1;
3166 RTL_EXPR_SEQUENCE (xval) = get_insns ();
3169 if (TREE_CODE (rval) == SAVE_EXPR)
3171 /* Errors may cause this to not get evaluated. */
3172 if (SAVE_EXPR_RTL (rval) == 0)
3173 SAVE_EXPR_RTL (rval) = const0_rtx;
3174 RTL_EXPR_RTL (xval) = SAVE_EXPR_RTL (rval);
3178 my_friendly_assert (TREE_CODE (rval) == VAR_DECL, 217);
3179 RTL_EXPR_RTL (xval) = DECL_RTL (rval);
3184 else if (TYPE_READONLY (true_type))
3185 cp_error ("uninitialized const in `new' of `%#T'", true_type);
3191 /* Did we modify the storage? */
3192 if (rval != alloc_temp)
3194 tree ifexp = build_binary_op (NE_EXPR, alloc_expr,
3195 integer_zero_node, 1);
3196 rval = build_conditional_expr (ifexp, rval, alloc_temp);
3202 if (rval && TREE_TYPE (rval) != build_pointer_type (type))
3204 /* The type of new int [3][3] is not int *, but int [3] * */
3205 rval = build_c_cast (build_pointer_type (type), rval, 0);
3209 rval = build_compound_expr (chainon (pending_sizes,
3210 build_tree_list (NULL_TREE, rval)));
3214 extern tree gc_visible;
3218 rval = save_expr (rval);
3219 /* We don't need a `headof' operation to do this because
3220 we know where the object starts. */
3221 objbits = build1 (INDIRECT_REF, unsigned_type_node,
3222 build (MINUS_EXPR, ptr_type_node,
3223 rval, c_sizeof_nowarn (unsigned_type_node)));
3224 update_expr = build_modify_expr (objbits, BIT_IOR_EXPR, gc_visible);
3225 rval = build_compound_expr (tree_cons (NULL_TREE, rval,
3226 tree_cons (NULL_TREE, update_expr,
3227 build_tree_list (NULL_TREE, rval))));
3233 /* `expand_vec_init' performs initialization of a vector of aggregate
3236 DECL is passed only for error reporting, and provides line number
3237 and source file name information.
3238 BASE is the space where the vector will be.
3239 MAXINDEX is the maximum index of the array (one less than the
3240 number of elements).
3241 INIT is the (possibly NULL) initializer.
3243 FROM_ARRAY is 0 if we should init everything with INIT
3244 (i.e., every element initialized from INIT).
3245 FROM_ARRAY is 1 if we should index into INIT in parallel
3246 with initialization of DECL.
3247 FROM_ARRAY is 2 if we should index into INIT in parallel,
3248 but use assignment instead of initialization. */
3251 expand_vec_init (decl, base, maxindex, init, from_array)
3252 tree decl, base, maxindex, init;
3256 tree iterator, base2 = NULL_TREE;
3257 tree type = TREE_TYPE (TREE_TYPE (base));
3260 maxindex = convert (integer_type_node, maxindex);
3261 if (maxindex == error_mark_node)
3262 return error_mark_node;
3264 if (current_function_decl == NULL_TREE)
3266 rval = make_tree_vec (3);
3267 TREE_VEC_ELT (rval, 0) = base;
3268 TREE_VEC_ELT (rval, 1) = maxindex;
3269 TREE_VEC_ELT (rval, 2) = init;
3273 size = size_in_bytes (type);
3275 /* Set to zero in case size is <= 0. Optimizer will delete this if
3276 it is not needed. */
3277 rval = get_temp_regvar (TYPE_POINTER_TO (type),
3278 convert (TYPE_POINTER_TO (type), null_pointer_node));
3279 base = default_conversion (base);
3280 base = convert (TYPE_POINTER_TO (type), base);
3281 expand_assignment (rval, base, 0, 0);
3282 base = get_temp_regvar (TYPE_POINTER_TO (type), base);
3284 if (init != NULL_TREE
3285 && TREE_CODE (init) == CONSTRUCTOR
3286 && TREE_TYPE (init) == TREE_TYPE (decl))
3288 /* Initialization of array from {...}. */
3289 tree elts = CONSTRUCTOR_ELTS (init);
3290 tree baseref = build1 (INDIRECT_REF, type, base);
3291 tree baseinc = build (PLUS_EXPR, TYPE_POINTER_TO (type), base, size);
3292 int host_i = TREE_INT_CST_LOW (maxindex);
3294 if (IS_AGGR_TYPE (type))
3299 expand_aggr_init (baseref, TREE_VALUE (elts), 0, 0);
3301 expand_assignment (base, baseinc, 0, 0);
3302 elts = TREE_CHAIN (elts);
3304 /* Initialize any elements by default if possible. */
3307 if (TYPE_NEEDS_CONSTRUCTING (type) == 0)
3310 use_variable (DECL_RTL (base));
3314 iterator = get_temp_regvar (integer_type_node,
3315 build_int_2 (host_i, 0));
3317 goto init_by_default;
3323 expand_assignment (baseref, TREE_VALUE (elts), 0, 0);
3325 expand_assignment (base, baseinc, 0, 0);
3326 elts = TREE_CHAIN (elts);
3330 use_variable (DECL_RTL (base));
3336 iterator = get_temp_regvar (integer_type_node, maxindex);
3340 /* If initializing one array from another,
3341 initialize element by element. */
3344 /* We rely upon the below calls the do argument checking */
3345 if (decl == NULL_TREE)
3347 sorry ("initialization of array from dissimilar array type");
3348 return error_mark_node;
3352 base2 = default_conversion (init);
3353 itype = TREE_TYPE (base2);
3354 base2 = get_temp_regvar (itype, base2);
3355 itype = TREE_TYPE (itype);
3357 else if (TYPE_LANG_SPECIFIC (type)
3358 && TYPE_NEEDS_CONSTRUCTING (type)
3359 && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
3361 error ("initializer ends prematurely");
3362 return error_mark_node;
3366 expand_start_cond (build (GE_EXPR, boolean_type_node,
3367 iterator, integer_zero_node), 0);
3368 expand_start_loop_continue_elsewhere (1);
3372 tree to = build1 (INDIRECT_REF, type, base);
3376 from = build1 (INDIRECT_REF, itype, base2);
3380 if (from_array == 2)
3381 expand_expr_stmt (build_modify_expr (to, NOP_EXPR, from));
3382 else if (TYPE_NEEDS_CONSTRUCTING (type))
3383 expand_aggr_init (to, from, 0, 0);
3385 expand_assignment (to, from, 0, 0);
3387 my_friendly_abort (57);
3389 else if (TREE_CODE (type) == ARRAY_TYPE)
3392 sorry ("cannot initialize multi-dimensional array with initializer");
3393 expand_vec_init (decl, build1 (NOP_EXPR, TYPE_POINTER_TO (TREE_TYPE (type)), base),
3394 array_type_nelts (type), 0, 0);
3397 expand_aggr_init (build1 (INDIRECT_REF, type, base), init, 0, 0);
3399 expand_assignment (base,
3400 build (PLUS_EXPR, TYPE_POINTER_TO (type), base, size),
3403 expand_assignment (base2,
3404 build (PLUS_EXPR, TYPE_POINTER_TO (type), base2, size), 0, 0);
3405 expand_loop_continue_here ();
3406 expand_exit_loop_if_false (0, build (NE_EXPR, boolean_type_node,
3407 build (PREDECREMENT_EXPR, integer_type_node, iterator, integer_one_node), minus_one));
3411 use_variable (DECL_RTL (base));
3413 use_variable (DECL_RTL (base2));
3418 use_variable (DECL_RTL (iterator));
3423 use_variable (DECL_RTL (rval));
3427 /* Free up storage of type TYPE, at address ADDR.
3429 TYPE is a POINTER_TYPE and can be ptr_type_node for no special type
3432 VIRTUAL_SIZE is the amount of storage that was allocated, and is
3433 used as the second argument to operator delete. It can include
3434 things like padding and magic size cookies. It has virtual in it,
3435 because if you have a base pointer and you delete through a virtual
3436 destructor, it should be the size of the dynamic object, not the
3437 static object, see Free Store 12.5 ANSI C++ WP.
3439 This does not call any destructors. */
3441 build_x_delete (type, addr, which_delete, virtual_size)
3446 int use_global_delete = which_delete & 1;
3447 int use_vec_delete = !!(which_delete & 2);
3449 enum tree_code code = use_vec_delete ? VEC_DELETE_EXPR : DELETE_EXPR;
3451 if (! use_global_delete && TYPE_LANG_SPECIFIC (TREE_TYPE (type))
3452 && (TYPE_GETS_DELETE (TREE_TYPE (type)) & (1 << use_vec_delete)))
3453 rval = build_opfncall (code, LOOKUP_NORMAL, addr, virtual_size, NULL_TREE);
3455 rval = build_builtin_call (void_type_node, use_vec_delete ? BIVD : BID,
3456 build_tree_list (NULL_TREE, addr));
3460 /* Generate a call to a destructor. TYPE is the type to cast ADDR to.
3461 ADDR is an expression which yields the store to be destroyed.
3462 AUTO_DELETE is nonzero if a call to DELETE should be made or not.
3463 If in the program, (AUTO_DELETE & 2) is non-zero, we tear down the
3464 virtual baseclasses.
3465 If in the program, (AUTO_DELETE & 1) is non-zero, then we deallocate.
3467 FLAGS is the logical disjunction of zero or more LOOKUP_
3468 flags. See cp-tree.h for more info.
3470 This function does not delete an object's virtual base classes. */
3472 build_delete (type, addr, auto_delete, flags, use_global_delete)
3476 int use_global_delete;
3478 tree function, parms;
3484 if (addr == error_mark_node)
3485 return error_mark_node;
3487 /* Can happen when CURRENT_EXCEPTION_OBJECT gets its type
3488 set to `error_mark_node' before it gets properly cleaned up. */
3489 if (type == error_mark_node)
3490 return error_mark_node;
3492 type = TYPE_MAIN_VARIANT (type);
3494 if (TREE_CODE (type) == POINTER_TYPE)
3496 type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
3497 if (TYPE_SIZE (type) == 0)
3499 incomplete_type_error (0, type);
3500 return error_mark_node;
3502 if (TREE_CODE (type) == ARRAY_TYPE)
3504 if (! IS_AGGR_TYPE (type))
3506 /* Call the builtin operator delete. */
3507 return build_builtin_call (void_type_node, BID,
3508 build_tree_list (NULL_TREE, addr));
3510 if (TREE_SIDE_EFFECTS (addr))
3511 addr = save_expr (addr);
3513 /* throw away const and volatile on target type of addr */
3514 addr = convert_force (build_pointer_type (type), addr, 0);
3515 ref = build_indirect_ref (addr, NULL_PTR);
3518 else if (TREE_CODE (type) == ARRAY_TYPE)
3521 if (TREE_SIDE_EFFECTS (addr))
3522 addr = save_expr (addr);
3523 return build_vec_delete (addr, array_type_nelts (type),
3524 c_sizeof_nowarn (TREE_TYPE (type)),
3525 auto_delete, integer_two_node,
3530 /* Don't check PROTECT here; leave that decision to the
3531 destructor. If the destructor is accessible, call it,
3532 else report error. */
3533 addr = build_unary_op (ADDR_EXPR, addr, 0);
3534 if (TREE_SIDE_EFFECTS (addr))
3535 addr = save_expr (addr);
3537 if (TREE_CONSTANT (addr))
3538 addr = convert_pointer_to (type, addr);
3540 addr = convert_force (build_pointer_type (type), addr, 0);
3542 if (TREE_CODE (addr) == NOP_EXPR
3543 && TREE_OPERAND (addr, 0) == current_class_decl)
3546 ref = build_indirect_ref (addr, NULL_PTR);
3550 my_friendly_assert (IS_AGGR_TYPE (type), 220);
3552 if (! TYPE_NEEDS_DESTRUCTOR (type))
3554 if (auto_delete == integer_zero_node)
3555 return void_zero_node;
3557 /* Pass the size of the object down to the operator delete() in
3558 addition to the ADDR. */
3559 if (TYPE_GETS_REG_DELETE (type) && !use_global_delete)
3561 tree virtual_size = c_sizeof_nowarn (type);
3562 return build_opfncall (DELETE_EXPR, LOOKUP_NORMAL, addr,
3563 virtual_size, NULL_TREE);
3566 /* Call the builtin operator delete. */
3567 return build_builtin_call (void_type_node, BID,
3568 build_tree_list (NULL_TREE, addr));
3570 parms = build_tree_list (NULL_TREE, addr);
3572 /* Below, we will reverse the order in which these calls are made.
3573 If we have a destructor, then that destructor will take care
3574 of the base classes; otherwise, we must do that here. */
3575 if (TYPE_HAS_DESTRUCTOR (type))
3577 tree dtor = DECL_MAIN_VARIANT (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type), 0));
3578 tree basetypes = TYPE_BINFO (type);
3579 tree passed_auto_delete;
3580 tree do_delete = NULL_TREE;
3582 if (use_global_delete)
3584 tree cond = fold (build (BIT_AND_EXPR, integer_type_node,
3585 auto_delete, integer_one_node));
3586 tree call = build_builtin_call
3587 (void_type_node, BID, build_tree_list (NULL_TREE, addr));
3589 cond = fold (build (COND_EXPR, void_type_node, cond,
3590 call, void_zero_node));
3591 if (cond != void_zero_node)
3594 passed_auto_delete = fold (build (BIT_AND_EXPR, integer_type_node,
3595 auto_delete, integer_two_node));
3599 if (TYPE_GETS_REG_DELETE (type))
3601 /* Only do access checking here; we'll be calling op delete
3602 from the destructor. */
3603 tree t = build_opfncall (DELETE_EXPR, LOOKUP_NORMAL, addr,
3604 size_zero_node, NULL_TREE);
3605 if (t == error_mark_node)
3606 return error_mark_node;
3608 passed_auto_delete = auto_delete;
3611 if (flags & LOOKUP_PROTECT)
3613 enum access_type access = compute_access (basetypes, dtor);
3615 if (access == access_private)
3617 if (flags & LOOKUP_COMPLAIN)
3618 cp_error ("destructor for type `%T' is private in this scope", type);
3619 return error_mark_node;
3621 else if (access == access_protected)
3623 if (flags & LOOKUP_COMPLAIN)
3624 cp_error ("destructor for type `%T' is protected in this scope", type);
3625 return error_mark_node;
3629 /* Once we are in a destructor, try not going through
3630 the virtual function table to find the next destructor. */
3631 if (DECL_VINDEX (dtor)
3632 && ! (flags & LOOKUP_NONVIRTUAL)
3633 && TREE_CODE (auto_delete) != PARM_DECL
3634 && (ptr == 1 || ! resolves_to_fixed_type_p (ref, 0)))
3636 tree binfo, basetype;
3637 /* The code below is probably all broken. See call.c for the
3638 complete right way to do this. this offsets may not be right
3639 in the below. (mrs) */
3640 /* This destructor must be called via virtual function table. */
3641 dtor = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (DECL_CONTEXT (dtor)), 0);
3642 basetype = DECL_CLASS_CONTEXT (dtor);
3643 binfo = get_binfo (basetype,
3644 TREE_TYPE (TREE_TYPE (TREE_VALUE (parms))),
3646 expr = convert_pointer_to_real (binfo, TREE_VALUE (parms));
3647 if (expr != TREE_VALUE (parms))
3650 ref = build_indirect_ref (expr, NULL_PTR);
3651 TREE_VALUE (parms) = expr;
3653 function = build_vfn_ref (&TREE_VALUE (parms), ref, DECL_VINDEX (dtor));
3654 if (function == error_mark_node)
3655 return error_mark_node;
3656 TREE_TYPE (function) = build_pointer_type (TREE_TYPE (dtor));
3657 TREE_CHAIN (parms) = build_tree_list (NULL_TREE, passed_auto_delete);
3658 expr = build_function_call (function, parms);
3660 expr = build (COMPOUND_EXPR, void_type_node, expr, do_delete);
3661 if (ptr && (flags & LOOKUP_DESTRUCTOR) == 0)
3663 /* Handle the case where a virtual destructor is
3664 being called on an item that is 0.
3666 @@ Does this really need to be done? */
3667 tree ifexp = build_binary_op(NE_EXPR, addr, integer_zero_node,1);
3669 if (TREE_CODE (ref) == VAR_DECL
3670 || TREE_CODE (ref) == COMPONENT_REF)
3671 warning ("losing in build_delete");
3673 expr = build (COND_EXPR, void_type_node,
3674 ifexp, expr, void_zero_node);
3681 if ((flags & LOOKUP_DESTRUCTOR)
3682 || TREE_CODE (ref) == VAR_DECL
3683 || TREE_CODE (ref) == PARM_DECL
3684 || TREE_CODE (ref) == COMPONENT_REF
3685 || TREE_CODE (ref) == ARRAY_REF)
3686 /* These can't be 0. */
3687 ifexp = integer_one_node;
3689 /* Handle the case where a non-virtual destructor is
3690 being called on an item that is 0. */
3691 ifexp = build_binary_op (NE_EXPR, addr, integer_zero_node, 1);
3693 /* Used to mean that this destructor was known to be empty,
3694 but that's now obsolete. */
3695 my_friendly_assert (DECL_INITIAL (dtor) != void_type_node, 221);
3697 TREE_CHAIN (parms) = build_tree_list (NULL_TREE, passed_auto_delete);
3698 expr = build_function_call (dtor, parms);
3700 expr = build (COMPOUND_EXPR, void_type_node, expr, do_delete);
3702 if (ifexp != integer_one_node)
3703 expr = build (COND_EXPR, void_type_node,
3704 ifexp, expr, void_zero_node);
3710 /* This can get visibilities wrong. */
3711 tree binfos = BINFO_BASETYPES (TYPE_BINFO (type));
3712 int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
3713 tree base_binfo = n_baseclasses > 0 ? TREE_VEC_ELT (binfos, 0) : NULL_TREE;
3714 tree exprstmt = NULL_TREE;
3715 tree parent_auto_delete = auto_delete;
3718 /* If this type does not have a destructor, but does have
3719 operator delete, call the parent parent destructor (if any),
3720 but let this node do the deleting. Otherwise, it is ok
3721 to let the parent destructor do the deleting. */
3722 if (TYPE_GETS_REG_DELETE (type) && !use_global_delete)
3724 parent_auto_delete = integer_zero_node;
3725 if (auto_delete == integer_zero_node)
3731 /* This is probably wrong. It should be the size of the
3732 virtual object being deleted. */
3733 virtual_size = c_sizeof_nowarn (type);
3735 expr = build_opfncall (DELETE_EXPR, LOOKUP_NORMAL, addr,
3736 virtual_size, NULL_TREE);
3737 if (expr == error_mark_node)
3738 return error_mark_node;
3739 if (auto_delete != integer_one_node)
3740 cond = build (COND_EXPR, void_type_node,
3741 build (BIT_AND_EXPR, integer_type_node,
3742 auto_delete, integer_one_node),
3743 expr, void_zero_node);
3748 else if (base_binfo == NULL_TREE
3749 || (TREE_VIA_VIRTUAL (base_binfo) == 0
3750 && ! TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo))))
3754 /* This is probably wrong. It should be the size of the virtual
3755 object being deleted. */
3756 virtual_size = c_sizeof_nowarn (type);
3758 cond = build (COND_EXPR, void_type_node,
3759 build (BIT_AND_EXPR, integer_type_node, auto_delete, integer_one_node),
3760 build_builtin_call (void_type_node, BID,
3761 build_tree_list (NULL_TREE, addr)),
3768 exprstmt = build_tree_list (NULL_TREE, cond);
3771 && ! TREE_VIA_VIRTUAL (base_binfo)
3772 && TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo)))
3774 tree this_auto_delete;
3776 if (BINFO_OFFSET_ZEROP (base_binfo))
3777 this_auto_delete = parent_auto_delete;
3779 this_auto_delete = integer_zero_node;
3781 expr = build_delete (TYPE_POINTER_TO (BINFO_TYPE (base_binfo)), addr,
3782 this_auto_delete, flags, 0);
3783 exprstmt = tree_cons (NULL_TREE, expr, exprstmt);
3786 /* Take care of the remaining baseclasses. */
3787 for (i = 1; i < n_baseclasses; i++)
3789 base_binfo = TREE_VEC_ELT (binfos, i);
3790 if (! TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo))
3791 || TREE_VIA_VIRTUAL (base_binfo))
3794 /* May be zero offset if other baseclasses are virtual. */
3795 expr = fold (build (PLUS_EXPR, TYPE_POINTER_TO (BINFO_TYPE (base_binfo)),
3796 addr, BINFO_OFFSET (base_binfo)));
3798 expr = build_delete (TYPE_POINTER_TO (BINFO_TYPE (base_binfo)), expr,
3802 exprstmt = tree_cons (NULL_TREE, expr, exprstmt);
3805 for (member = TYPE_FIELDS (type); member; member = TREE_CHAIN (member))
3807 if (TREE_CODE (member) != FIELD_DECL)
3809 if (TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (member)))
3811 tree this_member = build_component_ref (ref, DECL_NAME (member), 0, 0);
3812 tree this_type = TREE_TYPE (member);
3813 expr = build_delete (this_type, this_member, integer_two_node, flags, 0);
3814 exprstmt = tree_cons (NULL_TREE, expr, exprstmt);
3819 return build_compound_expr (exprstmt);
3820 /* Virtual base classes make this function do nothing. */
3821 return void_zero_node;
3825 /* For type TYPE, delete the virtual baseclass objects of DECL. */
3828 build_vbase_delete (type, decl)
3831 tree vbases = CLASSTYPE_VBASECLASSES (type);
3832 tree result = NULL_TREE;
3833 tree addr = build_unary_op (ADDR_EXPR, decl, 0);
3835 my_friendly_assert (addr != error_mark_node, 222);
3839 tree this_addr = convert_force (TYPE_POINTER_TO (BINFO_TYPE (vbases)),
3841 result = tree_cons (NULL_TREE,
3842 build_delete (TREE_TYPE (this_addr), this_addr,
3844 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 0),
3846 vbases = TREE_CHAIN (vbases);
3848 return build_compound_expr (nreverse (result));
3851 /* Build a C++ vector delete expression.
3852 MAXINDEX is the number of elements to be deleted.
3853 ELT_SIZE is the nominal size of each element in the vector.
3854 BASE is the expression that should yield the store to be deleted.
3855 This function expands (or synthesizes) these calls itself.
3856 AUTO_DELETE_VEC says whether the container (vector) should be deallocated.
3857 AUTO_DELETE say whether each item in the container should be deallocated.
3859 This also calls delete for virtual baseclasses of elements of the vector.
3861 Update: MAXINDEX is no longer needed. The size can be extracted from the
3862 start of the vector for pointers, and from the type for arrays. We still
3863 use MAXINDEX for arrays because it happens to already have one of the
3864 values we'd have to extract. (We could use MAXINDEX with pointers to
3865 confirm the size, and trap if the numbers differ; not clear that it'd
3866 be worth bothering.) */
3868 build_vec_delete (base, maxindex, elt_size, auto_delete_vec, auto_delete,
3870 tree base, maxindex, elt_size;
3871 tree auto_delete_vec, auto_delete;
3872 int use_global_delete;
3874 tree ptype = TREE_TYPE (base);
3877 /* Temporary variables used by the loop. */
3878 tree tbase, size_exp, tbase_init;
3880 /* This is the body of the loop that implements the deletion of a
3881 single element, and moves temp variables to next elements. */
3884 /* This is the LOOP_EXPR that governs the deletion of the elements. */
3887 /* This is the thing that governs what to do after the loop has run. */
3888 tree deallocate_expr = 0;
3890 /* This is the BIND_EXPR which holds the outermost iterator of the
3891 loop. It is convenient to set this variable up and test it before
3892 executing any other code in the loop.
3893 This is also the containing expression returned by this function. */
3894 tree controller = NULL_TREE;
3896 /* This is the BLOCK to record the symbol binding for debugging. */
3899 base = stabilize_reference (base);
3901 /* Since we can use base many times, save_expr it. */
3902 if (TREE_SIDE_EFFECTS (base))
3903 base = save_expr (base);
3905 if (TREE_CODE (ptype) == POINTER_TYPE)
3907 /* Step back one from start of vector, and read dimension. */
3908 tree cookie_addr = build (MINUS_EXPR, TYPE_POINTER_TO (BI_header_type),
3909 base, BI_header_size);
3910 tree cookie = build_indirect_ref (cookie_addr, NULL_PTR);
3911 maxindex = build_component_ref (cookie, nc_nelts_field_id, 0, 0);
3913 ptype = TREE_TYPE (ptype);
3914 while (TREE_CODE (ptype) == ARRAY_TYPE);
3916 else if (TREE_CODE (ptype) == ARRAY_TYPE)
3918 /* get the total number of things in the array, maxindex is a bad name */
3919 maxindex = array_type_nelts_total (ptype);
3920 while (TREE_CODE (ptype) == ARRAY_TYPE)
3921 ptype = TREE_TYPE (ptype);
3922 base = build_unary_op (ADDR_EXPR, base, 1);
3926 error ("type to vector delete is neither pointer or array type");
3927 return error_mark_node;
3930 ptype = TYPE_POINTER_TO (type);
3932 size_exp = size_in_bytes (type);
3934 if (! IS_AGGR_TYPE (type) || ! TYPE_NEEDS_DESTRUCTOR (type))
3936 loop = integer_zero_node;
3940 /* The below is short by BI_header_size */
3941 virtual_size = fold (size_binop (MULT_EXPR, size_exp, maxindex));
3943 tbase = build_decl (VAR_DECL, NULL_TREE, ptype);
3944 tbase_init = build_modify_expr (tbase, NOP_EXPR,
3945 fold (build (PLUS_EXPR, ptype,
3948 DECL_REGISTER (tbase) = 1;
3949 controller = build (BIND_EXPR, void_type_node, tbase, 0, 0);
3950 TREE_SIDE_EFFECTS (controller) = 1;
3951 block = build_block (tbase, 0, 0, 0, 0);
3952 add_block_current_level (block);
3954 if (auto_delete != integer_zero_node
3955 && auto_delete != integer_two_node)
3957 tree base_tbd = convert (ptype,
3958 build_binary_op (MINUS_EXPR,
3959 convert (ptr_type_node, base),
3962 /* This is the real size */
3963 virtual_size = size_binop (PLUS_EXPR, virtual_size, BI_header_size);
3964 body = build_tree_list (NULL_TREE,
3965 build_x_delete (ptype, base_tbd,
3966 2 | use_global_delete,
3968 body = build (COND_EXPR, void_type_node,
3969 build (BIT_AND_EXPR, integer_type_node,
3970 auto_delete, integer_one_node),
3971 body, integer_zero_node);
3976 body = tree_cons (NULL_TREE,
3977 build_delete (ptype, tbase, auto_delete,
3978 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1),
3981 body = tree_cons (NULL_TREE,
3982 build_modify_expr (tbase, NOP_EXPR, build (MINUS_EXPR, ptype, tbase, size_exp)),
3985 body = tree_cons (NULL_TREE,
3986 build (EXIT_EXPR, void_type_node,
3987 build (EQ_EXPR, boolean_type_node, base, tbase)),
3990 loop = build (LOOP_EXPR, void_type_node, build_compound_expr (body));
3992 loop = tree_cons (NULL_TREE, tbase_init,
3993 tree_cons (NULL_TREE, loop, NULL_TREE));
3994 loop = build_compound_expr (loop);
3997 /* If the delete flag is one, or anything else with the low bit set,
3998 delete the storage. */
3999 if (auto_delete_vec == integer_zero_node
4000 || auto_delete_vec == integer_two_node)
4001 deallocate_expr = integer_zero_node;
4006 /* The below is short by BI_header_size */
4007 virtual_size = fold (size_binop (MULT_EXPR, size_exp, maxindex));
4009 if (! TYPE_VEC_NEW_USES_COOKIE (type))
4014 base_tbd = convert (ptype,
4015 build_binary_op (MINUS_EXPR,
4016 convert (string_type_node, base),
4019 /* True size with header. */
4020 virtual_size = size_binop (PLUS_EXPR, virtual_size, BI_header_size);
4022 deallocate_expr = build_x_delete (ptype, base_tbd,
4023 2 | use_global_delete,
4025 if (auto_delete_vec != integer_one_node)
4026 deallocate_expr = build (COND_EXPR, void_type_node,
4027 build (BIT_AND_EXPR, integer_type_node,
4028 auto_delete_vec, integer_one_node),
4029 deallocate_expr, integer_zero_node);
4032 if (loop && deallocate_expr != integer_zero_node)
4034 body = tree_cons (NULL_TREE, loop,
4035 tree_cons (NULL_TREE, deallocate_expr, NULL_TREE));
4036 body = build_compound_expr (body);
4041 /* Outermost wrapper: If pointer is null, punt. */
4042 body = build (COND_EXPR, void_type_node,
4043 build (NE_EXPR, boolean_type_node, base, integer_zero_node),
4044 body, integer_zero_node);
4045 body = build1 (NOP_EXPR, void_type_node, body);
4049 TREE_OPERAND (controller, 1) = body;
4053 return convert (void_type_node, body);