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_real (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);
1984 for (t = TREE_VALUE (fnfields); t; t = DECL_CHAIN (t))
1985 assemble_external (t);
1987 t = build_tree_list (error_mark_node, fnfields);
1988 TREE_TYPE (t) = build_offset_type (type, unknown_type_node);
1993 /* Now that we know we are looking for a field, see if we
1994 have access to that field. Lookup_field will give us the
1997 t = lookup_field (basetypes, name, 1, 0);
1999 if (t == error_mark_node)
2000 return error_mark_node;
2004 cp_error ("`%D' is not a member of type `%T'", name, type);
2005 return error_mark_node;
2008 if (TREE_CODE (t) == TYPE_DECL)
2013 /* static class members and class-specific enum
2014 values can be returned without further ado. */
2015 if (TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == CONST_DECL)
2017 assemble_external (t);
2022 if (TREE_CODE (t) == FIELD_DECL && DECL_BIT_FIELD (t))
2024 cp_error ("illegal pointer to bit field `%D'", t);
2025 return error_mark_node;
2028 /* static class functions too. */
2029 if (TREE_CODE (t) == FUNCTION_DECL && TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
2030 my_friendly_abort (53);
2032 /* In member functions, the form `cname::name' is no longer
2033 equivalent to `this->cname::name'. */
2034 return build (OFFSET_REF, build_offset_type (type, TREE_TYPE (t)), decl, t);
2037 /* Given an object EXP and a member function reference MEMBER,
2038 return the address of the actual member function. */
2040 get_member_function (exp_addr_ptr, exp, member)
2044 tree ctype = TREE_TYPE (exp);
2045 tree function = save_expr (build_unary_op (ADDR_EXPR, member, 0));
2047 if (TYPE_VIRTUAL_P (ctype)
2048 || (flag_all_virtual == 1 && TYPE_OVERLOADS_METHOD_CALL_EXPR (ctype)))
2053 /* Save away the unadulterated `this' pointer. */
2054 exp_addr = save_expr (*exp_addr_ptr);
2056 /* Cast function to signed integer. */
2057 e0 = build1 (NOP_EXPR, integer_type_node, function);
2059 /* There is a hack here that takes advantage of
2060 twos complement arithmetic, and the fact that
2061 there are more than one UNITS to the WORD.
2062 If the high bit is set for the `function',
2063 then we pretend it is a virtual function,
2064 and the array indexing will knock this bit
2065 out the top, leaving a valid index. */
2066 if (UNITS_PER_WORD <= 1)
2067 my_friendly_abort (54);
2069 e1 = build (GT_EXPR, boolean_type_node, e0, integer_zero_node);
2070 e1 = build_compound_expr (tree_cons (NULL_TREE, exp_addr,
2071 build_tree_list (NULL_TREE, e1)));
2072 e1 = save_expr (e1);
2074 if (TREE_SIDE_EFFECTS (*exp_addr_ptr))
2076 exp = build_indirect_ref (exp_addr, NULL_PTR);
2077 *exp_addr_ptr = exp_addr;
2080 /* This is really hairy: if the function pointer is a pointer
2081 to a non-virtual member function, then we can't go mucking
2082 with the `this' pointer (any more than we already have to
2083 this point). If it is a pointer to a virtual member function,
2084 then we have to adjust the `this' pointer according to
2085 what the virtual function table tells us. */
2087 e3 = build_vfn_ref (exp_addr_ptr, exp, e0);
2088 my_friendly_assert (e3 != error_mark_node, 213);
2090 /* Change this pointer type from `void *' to the
2091 type it is really supposed to be. */
2092 TREE_TYPE (e3) = TREE_TYPE (function);
2094 /* If non-virtual, use what we had originally. Otherwise,
2095 use the value we get from the virtual function table. */
2096 *exp_addr_ptr = build_conditional_expr (e1, exp_addr, *exp_addr_ptr);
2098 function = build_conditional_expr (e1, function, e3);
2100 return build_indirect_ref (function, NULL_PTR);
2103 /* If a OFFSET_REF made it through to here, then it did
2104 not have its address taken. */
2107 resolve_offset_ref (exp)
2110 tree type = TREE_TYPE (exp);
2111 tree base = NULL_TREE;
2113 tree basetype, addr;
2115 if (TREE_CODE (exp) == TREE_LIST)
2116 return build_unary_op (ADDR_EXPR, exp, 0);
2118 if (TREE_CODE (exp) != OFFSET_REF)
2120 my_friendly_assert (TREE_CODE (type) == OFFSET_TYPE, 214);
2121 if (TYPE_OFFSET_BASETYPE (type) != current_class_type)
2123 error ("object missing in use of pointer-to-member construct");
2124 return error_mark_node;
2127 type = TREE_TYPE (type);
2132 member = TREE_OPERAND (exp, 1);
2133 base = TREE_OPERAND (exp, 0);
2136 if ((TREE_CODE (member) == VAR_DECL
2137 && ! TYPE_PTRMEMFUNC_P (TREE_TYPE (member)))
2138 || TREE_CODE (TREE_TYPE (member)) == FUNCTION_TYPE)
2140 /* These were static members. */
2141 if (mark_addressable (member) == 0)
2142 return error_mark_node;
2146 /* Syntax error can cause a member which should
2147 have been seen as static to be grok'd as non-static. */
2148 if (TREE_CODE (member) == FIELD_DECL && C_C_D == NULL_TREE)
2150 if (TREE_ADDRESSABLE (member) == 0)
2152 cp_error_at ("member `%D' is non-static in static member function context", member);
2153 error ("at this point in file");
2154 TREE_ADDRESSABLE (member) = 1;
2156 return error_mark_node;
2159 /* The first case is really just a reference to a member of `this'. */
2160 if (TREE_CODE (member) == FIELD_DECL
2162 || (TREE_CODE (base) == NOP_EXPR
2163 && TREE_OPERAND (base, 0) == error_mark_node)))
2166 enum access_type access;
2168 if (TREE_CODE (exp) == OFFSET_REF && TREE_CODE (type) == OFFSET_TYPE)
2169 basetype = TYPE_OFFSET_BASETYPE (type);
2171 basetype = DECL_CONTEXT (member);
2173 base = current_class_decl;
2175 if (get_base_distance (basetype, TREE_TYPE (TREE_TYPE (base)), 0, &basetype_path) < 0)
2177 error_not_base_type (basetype, TREE_TYPE (TREE_TYPE (base)));
2178 return error_mark_node;
2180 addr = convert_pointer_to (basetype, base);
2181 access = compute_access (basetype_path, member);
2182 if (access == access_public)
2183 return build (COMPONENT_REF, TREE_TYPE (member),
2184 build_indirect_ref (addr, NULL_PTR), member);
2185 if (access == access_protected)
2187 cp_error_at ("member `%D' is protected", member);
2188 error ("in this context");
2189 return error_mark_node;
2191 if (access == access_private)
2193 cp_error_at ("member `%D' is private", member);
2194 error ("in this context");
2195 return error_mark_node;
2197 my_friendly_abort (55);
2200 /* If this is a reference to a member function, then return
2201 the address of the member function (which may involve going
2202 through the object's vtable), otherwise, return an expression
2203 for the dereferenced pointer-to-member construct. */
2204 addr = build_unary_op (ADDR_EXPR, base, 0);
2206 if (TREE_CODE (TREE_TYPE (member)) == METHOD_TYPE)
2208 basetype = DECL_CLASS_CONTEXT (member);
2209 addr = convert_pointer_to (basetype, addr);
2210 return build_unary_op (ADDR_EXPR, get_member_function (&addr, build_indirect_ref (addr, NULL_PTR), member), 0);
2212 else if (TREE_CODE (TREE_TYPE (member)) == OFFSET_TYPE)
2214 basetype = TYPE_OFFSET_BASETYPE (TREE_TYPE (member));
2215 addr = convert_pointer_to (basetype, addr);
2216 member = convert (ptrdiff_type_node,
2217 build_unary_op (ADDR_EXPR, member, 0));
2218 return build1 (INDIRECT_REF, type,
2219 build (PLUS_EXPR, build_pointer_type (type),
2222 else if (TYPE_PTRMEMFUNC_P (TREE_TYPE (member)))
2224 return get_member_function_from_ptrfunc (&addr, member);
2226 my_friendly_abort (56);
2231 /* Return either DECL or its known constant value (if it has one). */
2234 decl_constant_value (decl)
2237 if (! TREE_THIS_VOLATILE (decl)
2239 /* These may be necessary for C, but they break C++. */
2240 ! TREE_PUBLIC (decl)
2241 /* Don't change a variable array bound or initial value to a constant
2242 in a place where a variable is invalid. */
2245 && DECL_INITIAL (decl) != 0
2246 && TREE_CODE (DECL_INITIAL (decl)) != ERROR_MARK
2247 /* This is invalid if initial value is not constant.
2248 If it has either a function call, a memory reference,
2249 or a variable, then re-evaluating it could give different results. */
2250 && TREE_CONSTANT (DECL_INITIAL (decl))
2251 /* Check for cases where this is sub-optimal, even though valid. */
2252 && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR
2254 /* We must allow this to work outside of functions so that
2255 static constants can be used for array sizes. */
2256 && current_function_decl != 0
2257 && DECL_MODE (decl) != BLKmode
2260 return DECL_INITIAL (decl);
2264 /* Friend handling routines. */
2265 /* Friend data structures:
2267 Lists of friend functions come from TYPE_DECL nodes. Since all
2268 aggregate types are automatically typedef'd, these nodes are guaranteed
2271 The TREE_PURPOSE of a friend list is the name of the friend,
2272 and its TREE_VALUE is another list.
2274 For each element of that list, either the TREE_VALUE or the TREE_PURPOSE
2275 will be filled in, but not both. The TREE_VALUE of that list is an
2276 individual function which is a friend. The TREE_PURPOSE of that list
2277 indicates a type in which all functions by that name are friends.
2279 Lists of friend classes come from _TYPE nodes. Love that consistency
2283 is_friend_type (type1, type2)
2286 return is_friend (type1, type2);
2290 is_friend (type, supplicant)
2291 tree type, supplicant;
2296 if (supplicant == NULL_TREE || type == NULL_TREE)
2299 declp = (TREE_CODE_CLASS (TREE_CODE (supplicant)) == 'd');
2302 /* It's a function decl. */
2304 tree list = DECL_FRIENDLIST (TYPE_NAME (type));
2305 tree name = DECL_NAME (supplicant);
2308 if (DECL_FUNCTION_MEMBER_P (supplicant))
2309 ctype = DECL_CLASS_CONTEXT (supplicant);
2313 for (; list ; list = TREE_CHAIN (list))
2315 if (name == TREE_PURPOSE (list))
2317 tree friends = TREE_VALUE (list);
2318 name = DECL_ASSEMBLER_NAME (supplicant);
2319 for (; friends ; friends = TREE_CHAIN (friends))
2321 if (ctype == TREE_PURPOSE (friends))
2323 if (name == DECL_ASSEMBLER_NAME (TREE_VALUE (friends)))
2333 if (type == supplicant)
2336 list = CLASSTYPE_FRIEND_CLASSES (TREE_TYPE (TYPE_NAME (type)));
2337 for (; list ; list = TREE_CHAIN (list))
2338 if (supplicant == TREE_VALUE (list))
2346 context = DECL_CONTEXT (TYPE_NAME (supplicant));
2347 else if (DECL_FUNCTION_MEMBER_P (supplicant))
2348 context = DECL_CLASS_CONTEXT (supplicant);
2350 context = NULL_TREE;
2353 return is_friend (type, context);
2359 /* Add a new friend to the friends of the aggregate type TYPE.
2360 DECL is the FUNCTION_DECL of the friend being added. */
2362 add_friend (type, decl)
2365 tree typedecl = TYPE_NAME (type);
2366 tree list = DECL_FRIENDLIST (typedecl);
2367 tree name = DECL_NAME (decl);
2371 if (name == TREE_PURPOSE (list))
2373 tree friends = TREE_VALUE (list);
2374 for (; friends ; friends = TREE_CHAIN (friends))
2376 if (decl == TREE_VALUE (friends))
2378 cp_warning ("`%D' is already a friend of class `%T'",
2380 cp_warning_at ("previous friend declaration of `%D'",
2381 TREE_VALUE (friends));
2385 TREE_VALUE (list) = tree_cons (error_mark_node, decl,
2389 list = TREE_CHAIN (list);
2391 DECL_FRIENDLIST (typedecl)
2392 = tree_cons (DECL_NAME (decl), build_tree_list (error_mark_node, decl),
2393 DECL_FRIENDLIST (typedecl));
2394 if (DECL_NAME (decl) == ansi_opname[(int) MODIFY_EXPR])
2396 tree parmtypes = TYPE_ARG_TYPES (TREE_TYPE (decl));
2397 TYPE_HAS_ASSIGNMENT (TREE_TYPE (typedecl)) = 1;
2398 if (parmtypes && TREE_CHAIN (parmtypes))
2400 tree parmtype = TREE_VALUE (TREE_CHAIN (parmtypes));
2401 if (TREE_CODE (parmtype) == REFERENCE_TYPE
2402 && TREE_TYPE (parmtypes) == TREE_TYPE (typedecl))
2403 TYPE_HAS_ASSIGN_REF (TREE_TYPE (typedecl)) = 1;
2408 /* Declare that every member function NAME in FRIEND_TYPE
2409 (which may be NULL_TREE) is a friend of type TYPE. */
2411 add_friends (type, name, friend_type)
2412 tree type, name, friend_type;
2414 tree typedecl = TYPE_NAME (type);
2415 tree list = DECL_FRIENDLIST (typedecl);
2419 if (name == TREE_PURPOSE (list))
2421 tree friends = TREE_VALUE (list);
2422 while (friends && TREE_PURPOSE (friends) != friend_type)
2423 friends = TREE_CHAIN (friends);
2426 warning ("method `%s::%s' is already a friend of class",
2427 TYPE_NAME_STRING (friend_type),
2428 IDENTIFIER_POINTER (name));
2430 warning ("function `%s' is already a friend of class `%s'",
2431 IDENTIFIER_POINTER (name),
2432 IDENTIFIER_POINTER (DECL_NAME (typedecl)));
2434 TREE_VALUE (list) = tree_cons (friend_type, NULL_TREE,
2438 list = TREE_CHAIN (list);
2440 DECL_FRIENDLIST (typedecl) =
2442 build_tree_list (friend_type, NULL_TREE),
2443 DECL_FRIENDLIST (typedecl));
2444 if (! strncmp (IDENTIFIER_POINTER (name),
2445 IDENTIFIER_POINTER (ansi_opname[(int) MODIFY_EXPR]),
2446 strlen (IDENTIFIER_POINTER (ansi_opname[(int) MODIFY_EXPR]))))
2448 TYPE_HAS_ASSIGNMENT (TREE_TYPE (typedecl)) = 1;
2449 sorry ("declaring \"friend operator =\" will not find \"operator = (X&)\" if it exists");
2453 /* Set up a cross reference so that type TYPE will make member function
2454 CTYPE::DECL a friend when CTYPE is finally defined. For more than
2455 one, set up a cross reference so that functions with the name DECL
2456 and type CTYPE know that they are friends of TYPE. */
2458 xref_friend (type, decl, ctype)
2459 tree type, decl, ctype;
2461 tree friend_decl = TYPE_NAME (ctype);
2463 tree typedecl = TYPE_NAME (type);
2464 tree t = tree_cons (NULL_TREE, ctype, DECL_UNDEFINED_FRIENDS (typedecl));
2466 DECL_UNDEFINED_FRIENDS (typedecl) = t;
2470 SET_DECL_WAITING_FRIENDS (friend_decl,
2472 DECL_WAITING_FRIENDS (friend_decl)));
2473 TREE_TYPE (DECL_WAITING_FRIENDS (friend_decl)) = decl;
2476 /* Make FRIEND_TYPE a friend class to TYPE. If FRIEND_TYPE has already
2477 been defined, we make all of its member functions friends of
2478 TYPE. If not, we make it a pending friend, which can later be added
2479 when its definition is seen. If a type is defined, then its TYPE_DECL's
2480 DECL_UNDEFINED_FRIENDS contains a (possibly empty) list of friend
2481 classes that are not defined. If a type has not yet been defined,
2482 then the DECL_WAITING_FRIENDS contains a list of types
2483 waiting to make it their friend. Note that these two can both
2484 be in use at the same time! */
2486 make_friend_class (type, friend_type)
2487 tree type, friend_type;
2491 if (IS_SIGNATURE (type))
2493 error ("`friend' declaration in signature definition");
2496 if (IS_SIGNATURE (friend_type))
2498 error ("signature type `%s' declared `friend'",
2499 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (friend_type))));
2502 if (type == friend_type)
2504 pedwarn ("class `%s' is implicitly friends with itself",
2505 TYPE_NAME_STRING (type));
2509 GNU_xref_hier (TYPE_NAME_STRING (type),
2510 TYPE_NAME_STRING (friend_type), 0, 0, 1);
2512 classes = CLASSTYPE_FRIEND_CLASSES (type);
2513 while (classes && TREE_VALUE (classes) != friend_type)
2514 classes = TREE_CHAIN (classes);
2516 warning ("class `%s' is already friends with class `%s'",
2517 TYPE_NAME_STRING (TREE_VALUE (classes)), TYPE_NAME_STRING (type));
2520 CLASSTYPE_FRIEND_CLASSES (type)
2521 = tree_cons (NULL_TREE, friend_type, CLASSTYPE_FRIEND_CLASSES (type));
2525 /* Main friend processor. This is large, and for modularity purposes,
2526 has been removed from grokdeclarator. It returns `void_type_node'
2527 to indicate that something happened, though a FIELD_DECL is
2530 CTYPE is the class this friend belongs to.
2532 DECLARATOR is the name of the friend.
2534 DECL is the FUNCTION_DECL that the friend is.
2536 In case we are parsing a friend which is part of an inline
2537 definition, we will need to store PARM_DECL chain that comes
2538 with it into the DECL_ARGUMENTS slot of the FUNCTION_DECL.
2540 FLAGS is just used for `grokclassfn'.
2542 QUALS say what special qualifies should apply to the object
2543 pointed to by `this'. */
2545 do_friend (ctype, declarator, decl, parmdecls, flags, quals)
2546 tree ctype, declarator, decl, parmdecls;
2547 enum overload_flags flags;
2550 /* Every decl that gets here is a friend of something. */
2551 DECL_FRIEND_P (decl) = 1;
2555 tree cname = TYPE_NAME (ctype);
2556 if (TREE_CODE (cname) == TYPE_DECL)
2557 cname = DECL_NAME (cname);
2559 /* A method friend. */
2560 if (TREE_CODE (decl) == FUNCTION_DECL)
2562 if (flags == NO_SPECIAL && ctype && declarator == cname)
2563 DECL_CONSTRUCTOR_P (decl) = 1;
2565 /* This will set up DECL_ARGUMENTS for us. */
2566 grokclassfn (ctype, cname, decl, flags, quals);
2567 if (TYPE_SIZE (ctype) != 0)
2568 check_classfn (ctype, cname, decl);
2570 if (TREE_TYPE (decl) != error_mark_node)
2572 if (TYPE_SIZE (ctype))
2574 /* We don't call pushdecl here yet, or ever on this
2575 actual FUNCTION_DECL. We must preserve its TREE_CHAIN
2577 make_decl_rtl (decl, NULL_PTR, 1);
2578 add_friend (current_class_type, decl);
2582 register char *classname
2583 = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (ctype)));
2585 error ("member declared as friend before type `%s' defined",
2592 /* Possibly a bunch of method friends. */
2594 /* Get the class they belong to. */
2595 tree ctype = IDENTIFIER_TYPE_VALUE (cname);
2597 /* This class is defined, use its methods now. */
2598 if (TYPE_SIZE (ctype))
2600 tree fields = lookup_fnfields (TYPE_BINFO (ctype), declarator, 0);
2602 add_friends (current_class_type, declarator, ctype);
2604 error ("method `%s' is not a member of class `%s'",
2605 IDENTIFIER_POINTER (declarator),
2606 IDENTIFIER_POINTER (cname));
2609 /* Note: DECLARATOR actually has more than one; in this
2610 case, we're making sure that fns with the name DECLARATOR
2611 and type CTYPE know they are friends of the current
2613 xref_friend (current_class_type, declarator, ctype);
2614 decl = void_type_node;
2617 else if (TREE_CODE (decl) == FUNCTION_DECL
2618 && ((IDENTIFIER_LENGTH (declarator) == 4
2619 && IDENTIFIER_POINTER (declarator)[0] == 'm'
2620 && ! strcmp (IDENTIFIER_POINTER (declarator), "main"))
2621 || (IDENTIFIER_LENGTH (declarator) > 10
2622 && IDENTIFIER_POINTER (declarator)[0] == '_'
2623 && IDENTIFIER_POINTER (declarator)[1] == '_'
2624 && strncmp (IDENTIFIER_POINTER (declarator)+2,
2625 "builtin_", 8) == 0)))
2627 /* raw "main", and builtin functions never gets overloaded,
2628 but they can become friends. */
2629 add_friend (current_class_type, decl);
2630 DECL_FRIEND_P (decl) = 1;
2631 decl = void_type_node;
2634 @@ or possibly a friend from a base class ?!? */
2635 else if (TREE_CODE (decl) == FUNCTION_DECL)
2637 /* Friends must all go through the overload machinery,
2638 even though they may not technically be overloaded.
2640 Note that because classes all wind up being top-level
2641 in their scope, their friend wind up in top-level scope as well. */
2642 DECL_ASSEMBLER_NAME (decl)
2643 = build_decl_overload (declarator, TYPE_ARG_TYPES (TREE_TYPE (decl)),
2644 TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE);
2645 DECL_ARGUMENTS (decl) = parmdecls;
2646 DECL_CLASS_CONTEXT (decl) = current_class_type;
2648 /* We can call pushdecl here, because the TREE_CHAIN of this
2649 FUNCTION_DECL is not needed for other purposes. */
2650 decl = pushdecl (decl);
2652 make_decl_rtl (decl, NULL_PTR, 1);
2653 add_friend (current_class_type, decl);
2655 DECL_FRIEND_P (decl) = 1;
2657 TREE_OVERLOADED (declarator) = 1;
2662 /* @@ Should be able to ingest later definitions of this function
2664 tree decl = lookup_name_nonclass (declarator);
2665 if (decl == NULL_TREE)
2667 warning ("implicitly declaring `%s' as struct",
2668 IDENTIFIER_POINTER (declarator));
2669 decl = xref_tag (record_type_node, declarator, NULL_TREE, 1);
2670 decl = TYPE_NAME (decl);
2673 /* Allow abbreviated declarations of overloaded functions,
2674 but not if those functions are really class names. */
2675 if (TREE_CODE (decl) == TREE_LIST && TREE_TYPE (TREE_PURPOSE (decl)))
2677 warning ("`friend %s' archaic, use `friend class %s' instead",
2678 IDENTIFIER_POINTER (declarator),
2679 IDENTIFIER_POINTER (declarator));
2680 decl = TREE_TYPE (TREE_PURPOSE (decl));
2683 if (TREE_CODE (decl) == TREE_LIST)
2684 add_friends (current_class_type, TREE_PURPOSE (decl), NULL_TREE);
2686 make_friend_class (current_class_type, TREE_TYPE (decl));
2687 decl = void_type_node;
2692 /* TYPE has now been defined. It may, however, have a number of things
2693 waiting make make it their friend. We resolve these references
2696 embrace_waiting_friends (type)
2699 tree decl = TYPE_NAME (type);
2702 if (TREE_CODE (decl) != TYPE_DECL)
2705 for (waiters = DECL_WAITING_FRIENDS (decl); waiters;
2706 waiters = TREE_CHAIN (waiters))
2708 tree waiter = TREE_PURPOSE (waiters);
2710 tree waiter_prev = TREE_VALUE (waiters);
2712 tree decl = TREE_TYPE (waiters);
2713 tree name = decl ? (TREE_CODE (decl) == IDENTIFIER_NODE
2714 ? decl : DECL_NAME (decl)) : NULL_TREE;
2717 /* @@ There may be work to be done since we have not verified
2718 @@ consistency between original and friend declarations
2719 @@ of the functions waiting to become friends. */
2720 tree field = lookup_fnfields (TYPE_BINFO (type), name, 0);
2723 add_friends (waiter, name, type);
2725 add_friend (waiter, decl);
2727 error_with_file_and_line (DECL_SOURCE_FILE (TYPE_NAME (waiter)),
2728 DECL_SOURCE_LINE (TYPE_NAME (waiter)),
2729 "no method `%s' defined in class `%s' to be friend",
2730 IDENTIFIER_POINTER (DECL_NAME (TREE_TYPE (waiters))),
2731 TYPE_NAME_STRING (type));
2734 make_friend_class (type, waiter);
2737 if (TREE_CHAIN (waiter_prev))
2738 TREE_CHAIN (waiter_prev) = TREE_CHAIN (TREE_CHAIN (waiter_prev));
2740 DECL_UNDEFINED_FRIENDS (TYPE_NAME (waiter)) = NULL_TREE;
2745 /* Common subroutines of build_new and build_vec_delete. */
2747 /* Common interface for calling "builtin" functions that are not
2751 build_builtin_call (type, node, arglist)
2756 tree rval = build (CALL_EXPR, type, node, arglist, 0);
2757 TREE_SIDE_EFFECTS (rval) = 1;
2758 assemble_external (TREE_OPERAND (node, 0));
2759 TREE_USED (TREE_OPERAND (node, 0)) = 1;
2763 /* Generate a C++ "new" expression. DECL is either a TREE_LIST
2764 (which needs to go through some sort of groktypename) or it
2765 is the name of the class we are newing. INIT is an initialization value.
2766 It is either an EXPRLIST, an EXPR_NO_COMMAS, or something in braces.
2767 If INIT is void_type_node, it means do *not* call a constructor
2770 For types with constructors, the data returned is initialized
2771 by the appropriate constructor.
2773 Whether the type has a constructor or not, if it has a pointer
2774 to a virtual function table, then that pointer is set up
2777 Unless I am mistaken, a call to new () will return initialized
2778 data regardless of whether the constructor itself is private or
2779 not. NOPE; new fails if the constructor is private (jcm).
2781 Note that build_new does nothing to assure that any special
2782 alignment requirements of the type are met. Rather, it leaves
2783 it up to malloc to do the right thing. Otherwise, folding to
2784 the right alignment cal cause problems if the user tries to later
2785 free the memory returned by `new'.
2787 PLACEMENT is the `placement' list for user-defined operator new (). */
2789 extern int flag_check_new;
2792 build_new (placement, decl, init, use_global_new)
2797 tree type, true_type, size, rval;
2799 tree alloc_expr, alloc_temp;
2801 enum tree_code code = NEW_EXPR;
2803 tree pending_sizes = NULL_TREE;
2805 if (decl == error_mark_node)
2806 return error_mark_node;
2808 if (TREE_CODE (decl) == TREE_LIST)
2810 tree absdcl = TREE_VALUE (decl);
2811 tree last_absdcl = NULL_TREE;
2812 int old_immediate_size_expand;
2814 if (current_function_decl
2815 && DECL_CONSTRUCTOR_P (current_function_decl))
2817 old_immediate_size_expand = immediate_size_expand;
2818 immediate_size_expand = 0;
2821 nelts = integer_one_node;
2823 if (absdcl && TREE_CODE (absdcl) == CALL_EXPR)
2824 my_friendly_abort (215);
2825 while (absdcl && TREE_CODE (absdcl) == INDIRECT_REF)
2827 last_absdcl = absdcl;
2828 absdcl = TREE_OPERAND (absdcl, 0);
2831 if (absdcl && TREE_CODE (absdcl) == ARRAY_REF)
2833 /* probably meant to be a vec new */
2836 while (TREE_OPERAND (absdcl, 0)
2837 && TREE_CODE (TREE_OPERAND (absdcl, 0)) == ARRAY_REF)
2839 last_absdcl = absdcl;
2840 absdcl = TREE_OPERAND (absdcl, 0);
2844 this_nelts = TREE_OPERAND (absdcl, 1);
2845 if (this_nelts != error_mark_node)
2847 if (this_nelts == NULL_TREE)
2848 error ("new of array type fails to specify size");
2851 this_nelts = save_expr (convert (sizetype, this_nelts));
2852 absdcl = TREE_OPERAND (absdcl, 0);
2853 if (this_nelts == integer_zero_node)
2855 warning ("zero size array reserves no space");
2856 nelts = integer_zero_node;
2859 nelts = build_binary_op (MULT_EXPR, nelts, this_nelts, 1);
2863 nelts = integer_zero_node;
2867 TREE_OPERAND (last_absdcl, 0) = absdcl;
2869 TREE_VALUE (decl) = absdcl;
2871 type = true_type = groktypename (decl);
2872 if (! type || type == error_mark_node)
2874 immediate_size_expand = old_immediate_size_expand;
2875 return error_mark_node;
2878 if (current_function_decl
2879 && DECL_CONSTRUCTOR_P (current_function_decl))
2881 pending_sizes = get_pending_sizes ();
2882 immediate_size_expand = old_immediate_size_expand;
2885 else if (TREE_CODE (decl) == IDENTIFIER_NODE)
2887 if (IDENTIFIER_HAS_TYPE_VALUE (decl))
2889 /* An aggregate type. */
2890 type = IDENTIFIER_TYPE_VALUE (decl);
2891 decl = TYPE_NAME (type);
2895 /* A builtin type. */
2896 decl = lookup_name (decl, 1);
2897 my_friendly_assert (TREE_CODE (decl) == TYPE_DECL, 215);
2898 type = TREE_TYPE (decl);
2902 else if (TREE_CODE (decl) == TYPE_DECL)
2904 type = TREE_TYPE (decl);
2911 decl = TYPE_NAME (type);
2914 /* ``A reference cannot be created by the new operator. A reference
2915 is not an object (8.2.2, 8.4.3), so a pointer to it could not be
2916 returned by new.'' ARM 5.3.3 */
2917 if (TREE_CODE (type) == REFERENCE_TYPE)
2919 error ("new cannot be applied to a reference type");
2920 type = true_type = TREE_TYPE (type);
2923 if (TREE_CODE (type) == FUNCTION_TYPE)
2925 error ("new cannot be applied to a function type");
2926 return error_mark_node;
2929 /* When the object being created is an array, the new-expression yields a
2930 pointer to the initial element (if any) of the array. For example,
2931 both new int and new int[10] return an int*. 5.3.4. */
2932 if (TREE_CODE (type) == ARRAY_TYPE && has_array == 0)
2934 nelts = array_type_nelts_top (type);
2936 type = true_type = TREE_TYPE (type);
2939 if (TYPE_READONLY (type) || TYPE_VOLATILE (type))
2940 type = TYPE_MAIN_VARIANT (type);
2942 /* If our base type is an array, then make sure we know how many elements
2944 while (TREE_CODE (true_type) == ARRAY_TYPE)
2946 tree this_nelts = array_type_nelts_top (true_type);
2947 nelts = build_binary_op (MULT_EXPR, nelts, this_nelts, 1);
2948 true_type = TREE_TYPE (true_type);
2951 size = fold (build_binary_op (MULT_EXPR, size_in_bytes (true_type),
2954 size = size_in_bytes (type);
2956 if (true_type == void_type_node)
2958 error ("invalid type `void' for new");
2959 return error_mark_node;
2962 if (TYPE_SIZE (true_type) == 0)
2964 incomplete_type_error (0, true_type);
2965 return error_mark_node;
2968 if (TYPE_LANG_SPECIFIC (true_type)
2969 && CLASSTYPE_ABSTRACT_VIRTUALS (true_type))
2971 abstract_virtuals_error (NULL_TREE, true_type);
2972 return error_mark_node;
2975 if (TYPE_LANG_SPECIFIC (true_type) && IS_SIGNATURE (true_type))
2977 signature_error (NULL_TREE, true_type);
2978 return error_mark_node;
2981 /* Get a little extra space to store a couple of things before the new'ed
2983 if (has_array && TYPE_VEC_NEW_USES_COOKIE (true_type))
2985 tree extra = BI_header_size;
2987 size = size_binop (PLUS_EXPR, size, extra);
2991 code = VEC_NEW_EXPR;
2993 /* Allocate the object. */
2994 if (! use_global_new && TYPE_LANG_SPECIFIC (true_type)
2995 && (TYPE_GETS_NEW (true_type) & (1 << has_array)))
2996 rval = build_opfncall (code, LOOKUP_NORMAL,
2997 TYPE_POINTER_TO (true_type), size, placement);
3000 rval = build_opfncall (code, LOOKUP_GLOBAL|LOOKUP_COMPLAIN,
3001 ptr_type_node, size, placement);
3002 rval = convert (TYPE_POINTER_TO (true_type), rval);
3004 else if (! has_array && flag_this_is_variable > 0
3005 && TYPE_NEEDS_CONSTRUCTING (true_type) && init != void_type_node)
3007 if (init == NULL_TREE || TREE_CODE (init) == TREE_LIST)
3011 error ("constructors take parameter lists");
3012 return error_mark_node;
3017 rval = build_builtin_call (build_pointer_type (true_type),
3018 has_array ? BIVN : BIN,
3019 build_tree_list (NULL_TREE, size));
3021 /* See comment above as to why this is disabled. */
3024 rval = build (PLUS_EXPR, TYPE_POINTER_TO (true_type), rval,
3026 rval = build (BIT_AND_EXPR, TYPE_POINTER_TO (true_type),
3027 rval, build1 (BIT_NOT_EXPR, integer_type_node,
3031 TREE_CALLS_NEW (rval) = 1;
3034 if (flag_check_new && rval)
3036 /* For array new, we need to make sure that the call to new is
3037 not expanded as part of the RTL_EXPR for the initialization,
3038 so we can't just use save_expr here. */
3040 alloc_temp = get_temp_name (TREE_TYPE (rval), 0);
3041 alloc_expr = build (MODIFY_EXPR, TREE_TYPE (rval), alloc_temp, rval);
3042 TREE_SIDE_EFFECTS (alloc_expr) = 1;
3046 alloc_expr = NULL_TREE;
3048 /* if rval is NULL_TREE I don't have to allocate it, but are we totally
3049 sure we have some extra bytes in that case for the BI_header_size
3050 cookies? And how does that interact with the code below? (mrs) */
3051 /* Finish up some magic for new'ed arrays */
3052 if (has_array && TYPE_VEC_NEW_USES_COOKIE (true_type) && rval != NULL_TREE)
3054 tree extra = BI_header_size;
3056 rval = convert (ptr_type_node, rval); /* convert to void * first */
3057 rval = convert (string_type_node, rval); /* lets not add void* and ints */
3058 rval = save_expr (build_binary_op (PLUS_EXPR, rval, extra, 1));
3059 /* Store header info. */
3060 cookie = build_indirect_ref (build (MINUS_EXPR, TYPE_POINTER_TO (BI_header_type),
3061 rval, extra), NULL_PTR);
3062 exp1 = build (MODIFY_EXPR, void_type_node,
3063 build_component_ref (cookie, nc_nelts_field_id, 0, 0),
3065 TREE_SIDE_EFFECTS (exp1) = 1;
3066 rval = convert (build_pointer_type (true_type), rval);
3067 TREE_CALLS_NEW (rval) = 1;
3068 TREE_SIDE_EFFECTS (rval) = 1;
3069 rval = build_compound_expr (tree_cons (NULL_TREE, exp1,
3070 build_tree_list (NULL_TREE, rval)));
3073 if (rval == error_mark_node)
3074 return error_mark_node;
3076 /* Don't call any constructors or do any initialization. */
3077 if (init == void_type_node)
3080 if (TYPE_NEEDS_CONSTRUCTING (type) || init)
3082 if (! TYPE_NEEDS_CONSTRUCTING (type) && ! IS_AGGR_TYPE (type))
3084 /* New 2.0 interpretation: `new int (10)' means
3085 allocate an int, and initialize it with 10. */
3088 rval = save_expr (rval);
3089 deref = build_indirect_ref (rval, NULL_PTR);
3090 TREE_READONLY (deref) = 0;
3092 if (TREE_CHAIN (init) != NULL_TREE)
3093 pedwarn ("initializer list being treated as compound expression");
3094 init = build_compound_expr (init);
3096 init = convert_for_initialization (deref, type, init, LOOKUP_NORMAL,
3097 "new", NULL_TREE, 0);
3098 rval = build (COMPOUND_EXPR, TREE_TYPE (rval),
3099 build_modify_expr (deref, NOP_EXPR, init),
3101 TREE_NO_UNUSED_WARNING (rval) = 1;
3102 TREE_SIDE_EFFECTS (rval) = 1;
3103 TREE_CALLS_NEW (rval) = 1;
3105 else if (! has_array)
3108 /* Constructors are never virtual. If it has an initialization, we
3109 need to complain if we aren't allowed to use the ctor that took
3111 int flags = LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_COMPLAIN;
3113 if (rval && TYPE_USES_VIRTUAL_BASECLASSES (true_type))
3115 init = tree_cons (NULL_TREE, integer_one_node, init);
3116 flags |= LOOKUP_HAS_IN_CHARGE;
3121 if (newrval && TREE_CODE (TREE_TYPE (newrval)) == POINTER_TYPE)
3122 newrval = build_indirect_ref (newrval, NULL_PTR);
3124 newrval = build_method_call (newrval, constructor_name_full (true_type),
3125 init, NULL_TREE, flags);
3130 TREE_HAS_CONSTRUCTOR (rval) = 1;
3133 rval = error_mark_node;
3135 else if (current_function_decl == NULL_TREE)
3137 extern tree static_aggregates;
3139 /* In case of static initialization, SAVE_EXPR is good enough. */
3140 rval = save_expr (rval);
3141 init = copy_to_permanent (init);
3142 rval = copy_to_permanent (rval);
3143 static_aggregates = perm_tree_cons (init, rval, static_aggregates);
3147 /* Have to wrap this in RTL_EXPR for two cases:
3148 in base or member initialization and if we
3149 are a branch of a ?: operator. Since we
3150 can't easily know the latter, just do it always. */
3151 tree xval = make_node (RTL_EXPR);
3153 TREE_TYPE (xval) = TREE_TYPE (rval);
3154 do_pending_stack_adjust ();
3155 start_sequence_for_rtl_expr (xval);
3157 /* As a matter of principle, `start_sequence' should do this. */
3160 rval = save_expr (rval);
3161 rval = expand_vec_init (decl, rval,
3162 build_binary_op (MINUS_EXPR, nelts,
3163 integer_one_node, 1),
3166 do_pending_stack_adjust ();
3168 TREE_SIDE_EFFECTS (xval) = 1;
3169 TREE_CALLS_NEW (xval) = 1;
3170 RTL_EXPR_SEQUENCE (xval) = get_insns ();
3173 if (TREE_CODE (rval) == SAVE_EXPR)
3175 /* Errors may cause this to not get evaluated. */
3176 if (SAVE_EXPR_RTL (rval) == 0)
3177 SAVE_EXPR_RTL (rval) = const0_rtx;
3178 RTL_EXPR_RTL (xval) = SAVE_EXPR_RTL (rval);
3182 my_friendly_assert (TREE_CODE (rval) == VAR_DECL, 217);
3183 RTL_EXPR_RTL (xval) = DECL_RTL (rval);
3188 else if (TYPE_READONLY (true_type))
3189 cp_error ("uninitialized const in `new' of `%#T'", true_type);
3195 /* Did we modify the storage? */
3196 if (rval != alloc_temp)
3198 tree ifexp = build_binary_op (NE_EXPR, alloc_expr,
3199 integer_zero_node, 1);
3200 rval = build_conditional_expr (ifexp, rval, alloc_temp);
3206 if (rval && TREE_TYPE (rval) != build_pointer_type (type))
3208 /* The type of new int [3][3] is not int *, but int [3] * */
3209 rval = build_c_cast (build_pointer_type (type), rval, 0);
3213 rval = build_compound_expr (chainon (pending_sizes,
3214 build_tree_list (NULL_TREE, rval)));
3218 extern tree gc_visible;
3222 rval = save_expr (rval);
3223 /* We don't need a `headof' operation to do this because
3224 we know where the object starts. */
3225 objbits = build1 (INDIRECT_REF, unsigned_type_node,
3226 build (MINUS_EXPR, ptr_type_node,
3227 rval, c_sizeof_nowarn (unsigned_type_node)));
3228 update_expr = build_modify_expr (objbits, BIT_IOR_EXPR, gc_visible);
3229 rval = build_compound_expr (tree_cons (NULL_TREE, rval,
3230 tree_cons (NULL_TREE, update_expr,
3231 build_tree_list (NULL_TREE, rval))));
3237 /* `expand_vec_init' performs initialization of a vector of aggregate
3240 DECL is passed only for error reporting, and provides line number
3241 and source file name information.
3242 BASE is the space where the vector will be.
3243 MAXINDEX is the maximum index of the array (one less than the
3244 number of elements).
3245 INIT is the (possibly NULL) initializer.
3247 FROM_ARRAY is 0 if we should init everything with INIT
3248 (i.e., every element initialized from INIT).
3249 FROM_ARRAY is 1 if we should index into INIT in parallel
3250 with initialization of DECL.
3251 FROM_ARRAY is 2 if we should index into INIT in parallel,
3252 but use assignment instead of initialization. */
3255 expand_vec_init (decl, base, maxindex, init, from_array)
3256 tree decl, base, maxindex, init;
3260 tree iterator, base2 = NULL_TREE;
3261 tree type = TREE_TYPE (TREE_TYPE (base));
3264 maxindex = convert (integer_type_node, maxindex);
3265 if (maxindex == error_mark_node)
3266 return error_mark_node;
3268 if (current_function_decl == NULL_TREE)
3270 rval = make_tree_vec (3);
3271 TREE_VEC_ELT (rval, 0) = base;
3272 TREE_VEC_ELT (rval, 1) = maxindex;
3273 TREE_VEC_ELT (rval, 2) = init;
3277 size = size_in_bytes (type);
3279 /* Set to zero in case size is <= 0. Optimizer will delete this if
3280 it is not needed. */
3281 rval = get_temp_regvar (TYPE_POINTER_TO (type),
3282 convert (TYPE_POINTER_TO (type), null_pointer_node));
3283 base = default_conversion (base);
3284 base = convert (TYPE_POINTER_TO (type), base);
3285 expand_assignment (rval, base, 0, 0);
3286 base = get_temp_regvar (TYPE_POINTER_TO (type), base);
3288 if (init != NULL_TREE
3289 && TREE_CODE (init) == CONSTRUCTOR
3290 && TREE_TYPE (init) == TREE_TYPE (decl))
3292 /* Initialization of array from {...}. */
3293 tree elts = CONSTRUCTOR_ELTS (init);
3294 tree baseref = build1 (INDIRECT_REF, type, base);
3295 tree baseinc = build (PLUS_EXPR, TYPE_POINTER_TO (type), base, size);
3296 int host_i = TREE_INT_CST_LOW (maxindex);
3298 if (IS_AGGR_TYPE (type))
3303 expand_aggr_init (baseref, TREE_VALUE (elts), 0, 0);
3305 expand_assignment (base, baseinc, 0, 0);
3306 elts = TREE_CHAIN (elts);
3308 /* Initialize any elements by default if possible. */
3311 if (TYPE_NEEDS_CONSTRUCTING (type) == 0)
3314 use_variable (DECL_RTL (base));
3318 iterator = get_temp_regvar (integer_type_node,
3319 build_int_2 (host_i, 0));
3321 goto init_by_default;
3327 expand_assignment (baseref, TREE_VALUE (elts), 0, 0);
3329 expand_assignment (base, baseinc, 0, 0);
3330 elts = TREE_CHAIN (elts);
3334 use_variable (DECL_RTL (base));
3340 iterator = get_temp_regvar (integer_type_node, maxindex);
3344 /* If initializing one array from another,
3345 initialize element by element. */
3348 /* We rely upon the below calls the do argument checking */
3349 if (decl == NULL_TREE)
3351 sorry ("initialization of array from dissimilar array type");
3352 return error_mark_node;
3356 base2 = default_conversion (init);
3357 itype = TREE_TYPE (base2);
3358 base2 = get_temp_regvar (itype, base2);
3359 itype = TREE_TYPE (itype);
3361 else if (TYPE_LANG_SPECIFIC (type)
3362 && TYPE_NEEDS_CONSTRUCTING (type)
3363 && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
3365 error ("initializer ends prematurely");
3366 return error_mark_node;
3370 expand_start_cond (build (GE_EXPR, boolean_type_node,
3371 iterator, integer_zero_node), 0);
3372 expand_start_loop_continue_elsewhere (1);
3376 tree to = build1 (INDIRECT_REF, type, base);
3380 from = build1 (INDIRECT_REF, itype, base2);
3384 if (from_array == 2)
3385 expand_expr_stmt (build_modify_expr (to, NOP_EXPR, from));
3386 else if (TYPE_NEEDS_CONSTRUCTING (type))
3387 expand_aggr_init (to, from, 0, 0);
3389 expand_assignment (to, from, 0, 0);
3391 my_friendly_abort (57);
3393 else if (TREE_CODE (type) == ARRAY_TYPE)
3396 sorry ("cannot initialize multi-dimensional array with initializer");
3397 expand_vec_init (decl, build1 (NOP_EXPR, TYPE_POINTER_TO (TREE_TYPE (type)), base),
3398 array_type_nelts (type), 0, 0);
3401 expand_aggr_init (build1 (INDIRECT_REF, type, base), init, 0, 0);
3403 expand_assignment (base,
3404 build (PLUS_EXPR, TYPE_POINTER_TO (type), base, size),
3407 expand_assignment (base2,
3408 build (PLUS_EXPR, TYPE_POINTER_TO (type), base2, size), 0, 0);
3409 expand_loop_continue_here ();
3410 expand_exit_loop_if_false (0, build (NE_EXPR, boolean_type_node,
3411 build (PREDECREMENT_EXPR, integer_type_node, iterator, integer_one_node), minus_one));
3415 use_variable (DECL_RTL (base));
3417 use_variable (DECL_RTL (base2));
3422 use_variable (DECL_RTL (iterator));
3427 use_variable (DECL_RTL (rval));
3431 /* Free up storage of type TYPE, at address ADDR.
3433 TYPE is a POINTER_TYPE and can be ptr_type_node for no special type
3436 VIRTUAL_SIZE is the amount of storage that was allocated, and is
3437 used as the second argument to operator delete. It can include
3438 things like padding and magic size cookies. It has virtual in it,
3439 because if you have a base pointer and you delete through a virtual
3440 destructor, it should be the size of the dynamic object, not the
3441 static object, see Free Store 12.5 ANSI C++ WP.
3443 This does not call any destructors. */
3445 build_x_delete (type, addr, which_delete, virtual_size)
3450 int use_global_delete = which_delete & 1;
3451 int use_vec_delete = !!(which_delete & 2);
3453 enum tree_code code = use_vec_delete ? VEC_DELETE_EXPR : DELETE_EXPR;
3455 if (! use_global_delete && TYPE_LANG_SPECIFIC (TREE_TYPE (type))
3456 && (TYPE_GETS_DELETE (TREE_TYPE (type)) & (1 << use_vec_delete)))
3457 rval = build_opfncall (code, LOOKUP_NORMAL, addr, virtual_size, NULL_TREE);
3459 rval = build_builtin_call (void_type_node, use_vec_delete ? BIVD : BID,
3460 build_tree_list (NULL_TREE, addr));
3464 /* Generate a call to a destructor. TYPE is the type to cast ADDR to.
3465 ADDR is an expression which yields the store to be destroyed.
3466 AUTO_DELETE is nonzero if a call to DELETE should be made or not.
3467 If in the program, (AUTO_DELETE & 2) is non-zero, we tear down the
3468 virtual baseclasses.
3469 If in the program, (AUTO_DELETE & 1) is non-zero, then we deallocate.
3471 FLAGS is the logical disjunction of zero or more LOOKUP_
3472 flags. See cp-tree.h for more info.
3474 This function does not delete an object's virtual base classes. */
3476 build_delete (type, addr, auto_delete, flags, use_global_delete)
3480 int use_global_delete;
3482 tree function, parms;
3488 if (addr == error_mark_node)
3489 return error_mark_node;
3491 /* Can happen when CURRENT_EXCEPTION_OBJECT gets its type
3492 set to `error_mark_node' before it gets properly cleaned up. */
3493 if (type == error_mark_node)
3494 return error_mark_node;
3496 type = TYPE_MAIN_VARIANT (type);
3498 if (TREE_CODE (type) == POINTER_TYPE)
3500 type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
3501 if (TYPE_SIZE (type) == 0)
3503 incomplete_type_error (0, type);
3504 return error_mark_node;
3506 if (TREE_CODE (type) == ARRAY_TYPE)
3508 if (! IS_AGGR_TYPE (type))
3510 /* Call the builtin operator delete. */
3511 return build_builtin_call (void_type_node, BID,
3512 build_tree_list (NULL_TREE, addr));
3514 if (TREE_SIDE_EFFECTS (addr))
3515 addr = save_expr (addr);
3517 /* throw away const and volatile on target type of addr */
3518 addr = convert_force (build_pointer_type (type), addr, 0);
3519 ref = build_indirect_ref (addr, NULL_PTR);
3522 else if (TREE_CODE (type) == ARRAY_TYPE)
3525 if (TREE_SIDE_EFFECTS (addr))
3526 addr = save_expr (addr);
3527 return build_vec_delete (addr, array_type_nelts (type),
3528 c_sizeof_nowarn (TREE_TYPE (type)),
3529 auto_delete, integer_two_node,
3534 /* Don't check PROTECT here; leave that decision to the
3535 destructor. If the destructor is accessible, call it,
3536 else report error. */
3537 addr = build_unary_op (ADDR_EXPR, addr, 0);
3538 if (TREE_SIDE_EFFECTS (addr))
3539 addr = save_expr (addr);
3541 if (TREE_CONSTANT (addr))
3542 addr = convert_pointer_to (type, addr);
3544 addr = convert_force (build_pointer_type (type), addr, 0);
3546 if (TREE_CODE (addr) == NOP_EXPR
3547 && TREE_OPERAND (addr, 0) == current_class_decl)
3550 ref = build_indirect_ref (addr, NULL_PTR);
3554 my_friendly_assert (IS_AGGR_TYPE (type), 220);
3556 if (! TYPE_NEEDS_DESTRUCTOR (type))
3558 if (auto_delete == integer_zero_node)
3559 return void_zero_node;
3561 /* Pass the size of the object down to the operator delete() in
3562 addition to the ADDR. */
3563 if (TYPE_GETS_REG_DELETE (type) && !use_global_delete)
3565 tree virtual_size = c_sizeof_nowarn (type);
3566 return build_opfncall (DELETE_EXPR, LOOKUP_NORMAL, addr,
3567 virtual_size, NULL_TREE);
3570 /* Call the builtin operator delete. */
3571 return build_builtin_call (void_type_node, BID,
3572 build_tree_list (NULL_TREE, addr));
3574 parms = build_tree_list (NULL_TREE, addr);
3576 /* Below, we will reverse the order in which these calls are made.
3577 If we have a destructor, then that destructor will take care
3578 of the base classes; otherwise, we must do that here. */
3579 if (TYPE_HAS_DESTRUCTOR (type))
3581 tree dtor = DECL_MAIN_VARIANT (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type), 0));
3582 tree basetypes = TYPE_BINFO (type);
3583 tree passed_auto_delete;
3584 tree do_delete = NULL_TREE;
3586 if (use_global_delete)
3588 tree cond = fold (build (BIT_AND_EXPR, integer_type_node,
3589 auto_delete, integer_one_node));
3590 tree call = build_builtin_call
3591 (void_type_node, BID, build_tree_list (NULL_TREE, addr));
3593 cond = fold (build (COND_EXPR, void_type_node, cond,
3594 call, void_zero_node));
3595 if (cond != void_zero_node)
3598 passed_auto_delete = fold (build (BIT_AND_EXPR, integer_type_node,
3599 auto_delete, integer_two_node));
3603 if (TYPE_GETS_REG_DELETE (type))
3605 /* Only do access checking here; we'll be calling op delete
3606 from the destructor. */
3607 tree t = build_opfncall (DELETE_EXPR, LOOKUP_NORMAL, addr,
3608 size_zero_node, NULL_TREE);
3609 if (t == error_mark_node)
3610 return error_mark_node;
3612 passed_auto_delete = auto_delete;
3615 if (flags & LOOKUP_PROTECT)
3617 enum access_type access = compute_access (basetypes, dtor);
3619 if (access == access_private)
3621 if (flags & LOOKUP_COMPLAIN)
3622 cp_error ("destructor for type `%T' is private in this scope", type);
3623 return error_mark_node;
3625 else if (access == access_protected)
3627 if (flags & LOOKUP_COMPLAIN)
3628 cp_error ("destructor for type `%T' is protected in this scope", type);
3629 return error_mark_node;
3633 /* Once we are in a destructor, try not going through
3634 the virtual function table to find the next destructor. */
3635 if (DECL_VINDEX (dtor)
3636 && ! (flags & LOOKUP_NONVIRTUAL)
3637 && TREE_CODE (auto_delete) != PARM_DECL
3638 && (ptr == 1 || ! resolves_to_fixed_type_p (ref, 0)))
3640 tree binfo, basetype;
3641 /* The code below is probably all broken. See call.c for the
3642 complete right way to do this. this offsets may not be right
3643 in the below. (mrs) */
3644 /* This destructor must be called via virtual function table. */
3645 dtor = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (DECL_CONTEXT (dtor)), 0);
3646 basetype = DECL_CLASS_CONTEXT (dtor);
3647 binfo = get_binfo (basetype,
3648 TREE_TYPE (TREE_TYPE (TREE_VALUE (parms))),
3650 expr = convert_pointer_to_real (binfo, TREE_VALUE (parms));
3651 if (expr != TREE_VALUE (parms))
3654 ref = build_indirect_ref (expr, NULL_PTR);
3655 TREE_VALUE (parms) = expr;
3657 function = build_vfn_ref (&TREE_VALUE (parms), ref, DECL_VINDEX (dtor));
3658 if (function == error_mark_node)
3659 return error_mark_node;
3660 TREE_TYPE (function) = build_pointer_type (TREE_TYPE (dtor));
3661 TREE_CHAIN (parms) = build_tree_list (NULL_TREE, passed_auto_delete);
3662 expr = build_function_call (function, parms);
3664 expr = build (COMPOUND_EXPR, void_type_node, expr, do_delete);
3665 if (ptr && (flags & LOOKUP_DESTRUCTOR) == 0)
3667 /* Handle the case where a virtual destructor is
3668 being called on an item that is 0.
3670 @@ Does this really need to be done? */
3671 tree ifexp = build_binary_op(NE_EXPR, addr, integer_zero_node,1);
3673 if (TREE_CODE (ref) == VAR_DECL
3674 || TREE_CODE (ref) == COMPONENT_REF)
3675 warning ("losing in build_delete");
3677 expr = build (COND_EXPR, void_type_node,
3678 ifexp, expr, void_zero_node);
3685 if ((flags & LOOKUP_DESTRUCTOR)
3686 || TREE_CODE (ref) == VAR_DECL
3687 || TREE_CODE (ref) == PARM_DECL
3688 || TREE_CODE (ref) == COMPONENT_REF
3689 || TREE_CODE (ref) == ARRAY_REF)
3690 /* These can't be 0. */
3691 ifexp = integer_one_node;
3693 /* Handle the case where a non-virtual destructor is
3694 being called on an item that is 0. */
3695 ifexp = build_binary_op (NE_EXPR, addr, integer_zero_node, 1);
3697 /* Used to mean that this destructor was known to be empty,
3698 but that's now obsolete. */
3699 my_friendly_assert (DECL_INITIAL (dtor) != void_type_node, 221);
3701 TREE_CHAIN (parms) = build_tree_list (NULL_TREE, passed_auto_delete);
3702 expr = build_function_call (dtor, parms);
3704 expr = build (COMPOUND_EXPR, void_type_node, expr, do_delete);
3706 if (ifexp != integer_one_node)
3707 expr = build (COND_EXPR, void_type_node,
3708 ifexp, expr, void_zero_node);
3714 /* This can get visibilities wrong. */
3715 tree binfos = BINFO_BASETYPES (TYPE_BINFO (type));
3716 int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
3717 tree base_binfo = n_baseclasses > 0 ? TREE_VEC_ELT (binfos, 0) : NULL_TREE;
3718 tree exprstmt = NULL_TREE;
3719 tree parent_auto_delete = auto_delete;
3722 /* If this type does not have a destructor, but does have
3723 operator delete, call the parent parent destructor (if any),
3724 but let this node do the deleting. Otherwise, it is ok
3725 to let the parent destructor do the deleting. */
3726 if (TYPE_GETS_REG_DELETE (type) && !use_global_delete)
3728 parent_auto_delete = integer_zero_node;
3729 if (auto_delete == integer_zero_node)
3735 /* This is probably wrong. It should be the size of the
3736 virtual object being deleted. */
3737 virtual_size = c_sizeof_nowarn (type);
3739 expr = build_opfncall (DELETE_EXPR, LOOKUP_NORMAL, addr,
3740 virtual_size, NULL_TREE);
3741 if (expr == error_mark_node)
3742 return error_mark_node;
3743 if (auto_delete != integer_one_node)
3744 cond = build (COND_EXPR, void_type_node,
3745 build (BIT_AND_EXPR, integer_type_node,
3746 auto_delete, integer_one_node),
3747 expr, void_zero_node);
3752 else if (base_binfo == NULL_TREE
3753 || (TREE_VIA_VIRTUAL (base_binfo) == 0
3754 && ! TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo))))
3758 /* This is probably wrong. It should be the size of the virtual
3759 object being deleted. */
3760 virtual_size = c_sizeof_nowarn (type);
3762 cond = build (COND_EXPR, void_type_node,
3763 build (BIT_AND_EXPR, integer_type_node, auto_delete, integer_one_node),
3764 build_builtin_call (void_type_node, BID,
3765 build_tree_list (NULL_TREE, addr)),
3772 exprstmt = build_tree_list (NULL_TREE, cond);
3775 && ! TREE_VIA_VIRTUAL (base_binfo)
3776 && TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo)))
3778 tree this_auto_delete;
3780 if (BINFO_OFFSET_ZEROP (base_binfo))
3781 this_auto_delete = parent_auto_delete;
3783 this_auto_delete = integer_zero_node;
3785 expr = build_delete (TYPE_POINTER_TO (BINFO_TYPE (base_binfo)), addr,
3786 this_auto_delete, flags, 0);
3787 exprstmt = tree_cons (NULL_TREE, expr, exprstmt);
3790 /* Take care of the remaining baseclasses. */
3791 for (i = 1; i < n_baseclasses; i++)
3793 base_binfo = TREE_VEC_ELT (binfos, i);
3794 if (! TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo))
3795 || TREE_VIA_VIRTUAL (base_binfo))
3798 /* May be zero offset if other baseclasses are virtual. */
3799 expr = fold (build (PLUS_EXPR, TYPE_POINTER_TO (BINFO_TYPE (base_binfo)),
3800 addr, BINFO_OFFSET (base_binfo)));
3802 expr = build_delete (TYPE_POINTER_TO (BINFO_TYPE (base_binfo)), expr,
3806 exprstmt = tree_cons (NULL_TREE, expr, exprstmt);
3809 for (member = TYPE_FIELDS (type); member; member = TREE_CHAIN (member))
3811 if (TREE_CODE (member) != FIELD_DECL)
3813 if (TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (member)))
3815 tree this_member = build_component_ref (ref, DECL_NAME (member), 0, 0);
3816 tree this_type = TREE_TYPE (member);
3817 expr = build_delete (this_type, this_member, integer_two_node, flags, 0);
3818 exprstmt = tree_cons (NULL_TREE, expr, exprstmt);
3823 return build_compound_expr (exprstmt);
3824 /* Virtual base classes make this function do nothing. */
3825 return void_zero_node;
3829 /* For type TYPE, delete the virtual baseclass objects of DECL. */
3832 build_vbase_delete (type, decl)
3835 tree vbases = CLASSTYPE_VBASECLASSES (type);
3836 tree result = NULL_TREE;
3837 tree addr = build_unary_op (ADDR_EXPR, decl, 0);
3839 my_friendly_assert (addr != error_mark_node, 222);
3843 tree this_addr = convert_force (TYPE_POINTER_TO (BINFO_TYPE (vbases)),
3845 result = tree_cons (NULL_TREE,
3846 build_delete (TREE_TYPE (this_addr), this_addr,
3848 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 0),
3850 vbases = TREE_CHAIN (vbases);
3852 return build_compound_expr (nreverse (result));
3855 /* Build a C++ vector delete expression.
3856 MAXINDEX is the number of elements to be deleted.
3857 ELT_SIZE is the nominal size of each element in the vector.
3858 BASE is the expression that should yield the store to be deleted.
3859 This function expands (or synthesizes) these calls itself.
3860 AUTO_DELETE_VEC says whether the container (vector) should be deallocated.
3861 AUTO_DELETE say whether each item in the container should be deallocated.
3863 This also calls delete for virtual baseclasses of elements of the vector.
3865 Update: MAXINDEX is no longer needed. The size can be extracted from the
3866 start of the vector for pointers, and from the type for arrays. We still
3867 use MAXINDEX for arrays because it happens to already have one of the
3868 values we'd have to extract. (We could use MAXINDEX with pointers to
3869 confirm the size, and trap if the numbers differ; not clear that it'd
3870 be worth bothering.) */
3872 build_vec_delete (base, maxindex, elt_size, auto_delete_vec, auto_delete,
3874 tree base, maxindex, elt_size;
3875 tree auto_delete_vec, auto_delete;
3876 int use_global_delete;
3878 tree ptype = TREE_TYPE (base);
3881 /* Temporary variables used by the loop. */
3882 tree tbase, size_exp, tbase_init;
3884 /* This is the body of the loop that implements the deletion of a
3885 single element, and moves temp variables to next elements. */
3888 /* This is the LOOP_EXPR that governs the deletion of the elements. */
3891 /* This is the thing that governs what to do after the loop has run. */
3892 tree deallocate_expr = 0;
3894 /* This is the BIND_EXPR which holds the outermost iterator of the
3895 loop. It is convenient to set this variable up and test it before
3896 executing any other code in the loop.
3897 This is also the containing expression returned by this function. */
3898 tree controller = NULL_TREE;
3900 /* This is the BLOCK to record the symbol binding for debugging. */
3903 base = stabilize_reference (base);
3905 /* Since we can use base many times, save_expr it. */
3906 if (TREE_SIDE_EFFECTS (base))
3907 base = save_expr (base);
3909 if (TREE_CODE (ptype) == POINTER_TYPE)
3911 /* Step back one from start of vector, and read dimension. */
3912 tree cookie_addr = build (MINUS_EXPR, TYPE_POINTER_TO (BI_header_type),
3913 base, BI_header_size);
3914 tree cookie = build_indirect_ref (cookie_addr, NULL_PTR);
3915 maxindex = build_component_ref (cookie, nc_nelts_field_id, 0, 0);
3917 ptype = TREE_TYPE (ptype);
3918 while (TREE_CODE (ptype) == ARRAY_TYPE);
3920 else if (TREE_CODE (ptype) == ARRAY_TYPE)
3922 /* get the total number of things in the array, maxindex is a bad name */
3923 maxindex = array_type_nelts_total (ptype);
3924 while (TREE_CODE (ptype) == ARRAY_TYPE)
3925 ptype = TREE_TYPE (ptype);
3926 base = build_unary_op (ADDR_EXPR, base, 1);
3930 error ("type to vector delete is neither pointer or array type");
3931 return error_mark_node;
3934 ptype = TYPE_POINTER_TO (type);
3936 size_exp = size_in_bytes (type);
3938 if (! IS_AGGR_TYPE (type) || ! TYPE_NEEDS_DESTRUCTOR (type))
3940 loop = integer_zero_node;
3944 /* The below is short by BI_header_size */
3945 virtual_size = fold (size_binop (MULT_EXPR, size_exp, maxindex));
3947 tbase = build_decl (VAR_DECL, NULL_TREE, ptype);
3948 tbase_init = build_modify_expr (tbase, NOP_EXPR,
3949 fold (build (PLUS_EXPR, ptype,
3952 DECL_REGISTER (tbase) = 1;
3953 controller = build (BIND_EXPR, void_type_node, tbase, 0, 0);
3954 TREE_SIDE_EFFECTS (controller) = 1;
3955 block = build_block (tbase, 0, 0, 0, 0);
3956 add_block_current_level (block);
3958 if (auto_delete != integer_zero_node
3959 && auto_delete != integer_two_node)
3961 tree base_tbd = convert (ptype,
3962 build_binary_op (MINUS_EXPR,
3963 convert (ptr_type_node, base),
3966 /* This is the real size */
3967 virtual_size = size_binop (PLUS_EXPR, virtual_size, BI_header_size);
3968 body = build_tree_list (NULL_TREE,
3969 build_x_delete (ptype, base_tbd,
3970 2 | use_global_delete,
3972 body = build (COND_EXPR, void_type_node,
3973 build (BIT_AND_EXPR, integer_type_node,
3974 auto_delete, integer_one_node),
3975 body, integer_zero_node);
3980 body = tree_cons (NULL_TREE,
3981 build_delete (ptype, tbase, auto_delete,
3982 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1),
3985 body = tree_cons (NULL_TREE,
3986 build_modify_expr (tbase, NOP_EXPR, build (MINUS_EXPR, ptype, tbase, size_exp)),
3989 body = tree_cons (NULL_TREE,
3990 build (EXIT_EXPR, void_type_node,
3991 build (EQ_EXPR, boolean_type_node, base, tbase)),
3994 loop = build (LOOP_EXPR, void_type_node, build_compound_expr (body));
3996 loop = tree_cons (NULL_TREE, tbase_init,
3997 tree_cons (NULL_TREE, loop, NULL_TREE));
3998 loop = build_compound_expr (loop);
4001 /* If the delete flag is one, or anything else with the low bit set,
4002 delete the storage. */
4003 if (auto_delete_vec == integer_zero_node
4004 || auto_delete_vec == integer_two_node)
4005 deallocate_expr = integer_zero_node;
4010 /* The below is short by BI_header_size */
4011 virtual_size = fold (size_binop (MULT_EXPR, size_exp, maxindex));
4013 if (! TYPE_VEC_NEW_USES_COOKIE (type))
4018 base_tbd = convert (ptype,
4019 build_binary_op (MINUS_EXPR,
4020 convert (string_type_node, base),
4023 /* True size with header. */
4024 virtual_size = size_binop (PLUS_EXPR, virtual_size, BI_header_size);
4026 deallocate_expr = build_x_delete (ptype, base_tbd,
4027 2 | use_global_delete,
4029 if (auto_delete_vec != integer_one_node)
4030 deallocate_expr = build (COND_EXPR, void_type_node,
4031 build (BIT_AND_EXPR, integer_type_node,
4032 auto_delete_vec, integer_one_node),
4033 deallocate_expr, integer_zero_node);
4036 if (loop && deallocate_expr != integer_zero_node)
4038 body = tree_cons (NULL_TREE, loop,
4039 tree_cons (NULL_TREE, deallocate_expr, NULL_TREE));
4040 body = build_compound_expr (body);
4045 /* Outermost wrapper: If pointer is null, punt. */
4046 body = build (COND_EXPR, void_type_node,
4047 build (NE_EXPR, boolean_type_node, base, integer_zero_node),
4048 body, integer_zero_node);
4049 body = build1 (NOP_EXPR, void_type_node, body);
4053 TREE_OPERAND (controller, 1) = body;
4057 return convert (void_type_node, body);