1 /* Handle initialization things in C++.
2 Copyright (C) 1987, 89, 92-98, 1999 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, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 /* High-level class interface. */
36 static void expand_aggr_vbase_init_1 PROTO((tree, tree, tree, tree));
37 static void construct_virtual_bases PROTO((tree, tree, tree, tree, tree));
38 static void expand_aggr_init_1 PROTO((tree, tree, tree, tree, int));
39 static void expand_default_init PROTO((tree, tree, tree, tree, int));
40 static tree build_vec_delete_1 PROTO((tree, tree, tree, tree, tree,
42 static void perform_member_init PROTO((tree, tree, tree, int));
43 static void sort_base_init PROTO((tree, tree *, tree *));
44 static tree build_builtin_delete_call PROTO((tree));
45 static int member_init_ok_or_else PROTO((tree, tree, const char *));
46 static void expand_virtual_init PROTO((tree, tree));
47 static tree sort_member_init PROTO((tree));
48 static tree initializing_context PROTO((tree));
49 static tree build_java_class_ref PROTO((tree));
50 static void expand_cleanup_for_base PROTO((tree, tree));
51 static tree get_temp_regvar PROTO((tree, tree));
53 /* Set up local variable for this file. MUST BE CALLED AFTER
54 INIT_DECL_PROCESSING. */
56 static tree BI_header_type, BI_header_size;
58 void init_init_processing ()
62 minus_one_node = build_int_2 (-1, -1);
64 /* Define the structure that holds header information for
65 arrays allocated via operator new. */
66 BI_header_type = make_lang_type (RECORD_TYPE);
67 nelts_identifier = get_identifier ("nelts");
68 fields[0] = build_lang_decl (FIELD_DECL, nelts_identifier, sizetype);
69 finish_builtin_type (BI_header_type, "__new_cookie", fields,
71 BI_header_size = size_in_bytes (BI_header_type);
73 ggc_add_tree_root (&BI_header_type, 1);
74 ggc_add_tree_root (&BI_header_size, 1);
77 /* Subroutine of emit_base_init. For BINFO, initialize all the
78 virtual function table pointers, except those that come from
79 virtual base classes. Initialize binfo's vtable pointer, if
80 INIT_SELF is true. CAN_ELIDE is true when we know that all virtual
81 function table pointers in all bases have been initialized already,
82 probably because their constructors have just be run. ADDR is the
83 pointer to the object whos vtables we are going to initialize.
85 REAL_BINFO is usually the same as BINFO, except when addr is not of
86 pointer to the type of the real derived type that we want to
87 initialize for. This is the case when addr is a pointer to a sub
88 object of a complete object, and we only want to do part of the
89 complete object's initialization of vtable pointers. This is done
90 for all virtual table pointers in virtual base classes. REAL_BINFO
91 is used to find the BINFO_VTABLE that we initialize with. BINFO is
92 used for conversions of addr to subobjects.
94 BINFO_TYPE (real_binfo) must be BINFO_TYPE (binfo).
96 Relies upon binfo being inside TYPE_BINFO (TREE_TYPE (TREE_TYPE
100 expand_direct_vtbls_init (real_binfo, binfo, init_self, can_elide, addr)
101 tree real_binfo, binfo, addr;
102 int init_self, can_elide;
104 tree real_binfos = BINFO_BASETYPES (real_binfo);
105 tree binfos = BINFO_BASETYPES (binfo);
106 int i, n_baselinks = real_binfos ? TREE_VEC_LENGTH (real_binfos) : 0;
109 for (i = 0; i < n_baselinks; i++)
111 tree real_base_binfo = TREE_VEC_ELT (real_binfos, i);
112 tree base_binfo = TREE_VEC_ELT (binfos, i);
113 int is_not_base_vtable
114 = i != CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (real_binfo));
115 if (! TREE_VIA_VIRTUAL (real_base_binfo))
116 expand_direct_vtbls_init (real_base_binfo, base_binfo,
117 is_not_base_vtable, can_elide, addr);
120 /* Before turning this on, make sure it is correct. */
121 if (can_elide && ! BINFO_MODIFIED (binfo))
124 /* Should we use something besides CLASSTYPE_VFIELDS? */
125 if (init_self && CLASSTYPE_VFIELDS (BINFO_TYPE (real_binfo)))
127 tree base_ptr = convert_pointer_to_real (binfo, addr);
128 expand_virtual_init (real_binfo, base_ptr);
134 /* Subroutine of emit_base_init. */
137 perform_member_init (member, name, init, explicit)
138 tree member, name, init;
142 tree type = TREE_TYPE (member);
144 decl = build_component_ref (current_class_ref, name, NULL_TREE, explicit);
146 /* Deal with this here, as we will get confused if we try to call the
147 assignment op for an anonymous union. This can happen in a
148 synthesized copy constructor. */
149 if (ANON_AGGR_TYPE_P (type))
151 init = build (INIT_EXPR, type, decl, TREE_VALUE (init));
152 TREE_SIDE_EFFECTS (init) = 1;
153 finish_expr_stmt (init);
155 else if (TYPE_NEEDS_CONSTRUCTING (type)
156 || (init && TYPE_HAS_CONSTRUCTOR (type)))
158 /* Since `init' is already a TREE_LIST on the current_member_init_list,
159 only build it into one if we aren't already a list. */
160 if (init != NULL_TREE && TREE_CODE (init) != TREE_LIST)
161 init = build_expr_list (NULL_TREE, init);
164 && TREE_CODE (type) == ARRAY_TYPE
166 && TREE_CHAIN (init) == NULL_TREE
167 && TREE_CODE (TREE_TYPE (TREE_VALUE (init))) == ARRAY_TYPE)
169 /* Initialization of one array from another. */
171 (build_vec_init (TREE_OPERAND (decl, 1), decl,
172 array_type_nelts (type), TREE_VALUE (init), 1));
175 finish_expr_stmt (build_aggr_init (decl, init, 0));
179 if (init == NULL_TREE)
183 /* default-initialization. */
184 if (AGGREGATE_TYPE_P (type))
186 /* This is a default initialization of an aggregate,
187 but not one of non-POD class type. We cleverly
188 notice that the initialization rules in such a
189 case are the same as for initialization with an
190 empty brace-initialization list. We don't want
191 to call build_modify_expr as that will go looking
192 for constructors and such. */
193 tree e = build (CONSTRUCTOR, type, NULL_TREE, NULL_TREE);
194 TREE_SIDE_EFFECTS (e) = 1;
195 finish_expr_stmt (build (INIT_EXPR, type, decl, e));
197 else if (TREE_CODE (type) == REFERENCE_TYPE)
198 cp_error ("default-initialization of `%#D', which has reference type",
201 init = integer_zero_node;
203 /* member traversal: note it leaves init NULL */
204 else if (TREE_CODE (TREE_TYPE (member)) == REFERENCE_TYPE)
205 cp_pedwarn ("uninitialized reference member `%D'", member);
207 else if (TREE_CODE (init) == TREE_LIST)
209 /* There was an explicit member initialization. Do some
210 work in that case. */
211 if (TREE_CHAIN (init))
213 warning ("initializer list treated as compound expression");
214 init = build_compound_expr (init);
217 init = TREE_VALUE (init);
221 finish_expr_stmt (build_modify_expr (decl, INIT_EXPR, init));
224 if (TYPE_NEEDS_DESTRUCTOR (type))
228 expr = build_component_ref (current_class_ref, name, NULL_TREE,
230 expr = build_delete (type, expr, integer_zero_node,
231 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0);
233 if (expr != error_mark_node)
234 finish_subobject (expr);
238 extern int warn_reorder;
240 /* Subroutine of emit_member_init. */
246 tree x, member, name, field;
247 tree init_list = NULL_TREE;
249 tree last_field = NULL_TREE;
251 for (member = TYPE_FIELDS (t); member ; member = TREE_CHAIN (member))
255 /* member could be, for example, a CONST_DECL for an enumerated
256 tag; we don't want to try to initialize that, since it already
258 if (TREE_CODE (member) != FIELD_DECL || !DECL_NAME (member))
261 for (x = current_member_init_list, pos = 0; x; x = TREE_CHAIN (x), ++pos)
263 /* If we cleared this out, then pay no attention to it. */
264 if (TREE_PURPOSE (x) == NULL_TREE)
266 name = TREE_PURPOSE (x);
268 if (TREE_CODE (name) == IDENTIFIER_NODE)
269 field = IDENTIFIER_CLASS_VALUE (name);
272 my_friendly_assert (TREE_CODE (name) == FIELD_DECL, 348);
276 /* If one member shadows another, get the outermost one. */
277 if (TREE_CODE (field) == TREE_LIST)
278 field = TREE_VALUE (field);
286 cp_warning_at ("member initializers for `%#D'", last_field);
287 cp_warning_at (" and `%#D'", field);
288 warning (" will be re-ordered to match declaration order");
294 /* Make sure we won't try to work on this init again. */
295 TREE_PURPOSE (x) = NULL_TREE;
296 x = build_tree_list (name, TREE_VALUE (x));
301 /* If we didn't find MEMBER in the list, create a dummy entry
302 so the two lists (INIT_LIST and the list of members) will be
304 x = build_tree_list (NULL_TREE, NULL_TREE);
306 init_list = chainon (init_list, x);
309 /* Initializers for base members go at the end. */
310 for (x = current_member_init_list ; x ; x = TREE_CHAIN (x))
312 name = TREE_PURPOSE (x);
315 if (purpose_member (name, init_list))
317 cp_error ("multiple initializations given for member `%D'",
318 IDENTIFIER_CLASS_VALUE (name));
322 init_list = chainon (init_list,
323 build_tree_list (name, TREE_VALUE (x)));
324 TREE_PURPOSE (x) = NULL_TREE;
332 sort_base_init (t, rbase_ptr, vbase_ptr)
333 tree t, *rbase_ptr, *vbase_ptr;
335 tree binfos = BINFO_BASETYPES (TYPE_BINFO (t));
336 int n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
342 /* For warn_reorder. */
344 tree last_base = NULL_TREE;
346 tree rbases = NULL_TREE;
347 tree vbases = NULL_TREE;
349 /* First walk through and splice out vbase and invalid initializers.
350 Also replace names with binfos. */
352 last = tree_cons (NULL_TREE, NULL_TREE, current_base_init_list);
353 for (x = TREE_CHAIN (last); x; x = TREE_CHAIN (x))
355 tree basetype = TREE_PURPOSE (x);
356 tree binfo = NULL_TREE;
358 if (basetype == NULL_TREE)
360 /* Initializer for single base class. Must not
361 use multiple inheritance or this is ambiguous. */
362 switch (n_baseclasses)
365 cp_error ("`%T' does not have a base class to initialize",
371 cp_error ("unnamed initializer ambiguous for `%T' which uses multiple inheritance",
375 binfo = TREE_VEC_ELT (binfos, 0);
377 else if (is_aggr_type (basetype, 1))
379 binfo = binfo_or_else (basetype, t);
380 if (binfo == NULL_TREE)
383 /* Virtual base classes are special cases. Their initializers
384 are recorded with this constructor, and they are used when
385 this constructor is the top-level constructor called. */
386 if (TREE_VIA_VIRTUAL (binfo))
388 tree v = CLASSTYPE_VBASECLASSES (t);
389 while (BINFO_TYPE (v) != BINFO_TYPE (binfo))
392 vbases = tree_cons (v, TREE_VALUE (x), vbases);
397 /* Otherwise, if it is not an immediate base class, complain. */
398 for (i = n_baseclasses-1; i >= 0; i--)
399 if (BINFO_TYPE (binfo) == BINFO_TYPE (TREE_VEC_ELT (binfos, i)))
403 cp_error ("`%T' is not an immediate base class of `%T'",
404 basetype, current_class_type);
410 my_friendly_abort (365);
412 TREE_PURPOSE (x) = binfo;
413 TREE_CHAIN (last) = x;
416 TREE_CHAIN (last) = NULL_TREE;
418 /* Now walk through our regular bases and make sure they're initialized. */
420 for (i = 0; i < n_baseclasses; ++i)
422 tree base_binfo = TREE_VEC_ELT (binfos, i);
425 if (TREE_VIA_VIRTUAL (base_binfo))
428 for (x = current_base_init_list, pos = 0; x; x = TREE_CHAIN (x), ++pos)
430 tree binfo = TREE_PURPOSE (x);
432 if (binfo == NULL_TREE)
435 if (binfo == base_binfo)
441 cp_warning_at ("base initializers for `%#T'", last_base);
442 cp_warning_at (" and `%#T'", BINFO_TYPE (binfo));
443 warning (" will be re-ordered to match inheritance order");
446 last_base = BINFO_TYPE (binfo);
449 /* Make sure we won't try to work on this init again. */
450 TREE_PURPOSE (x) = NULL_TREE;
451 x = build_tree_list (binfo, TREE_VALUE (x));
456 /* If we didn't find BASE_BINFO in the list, create a dummy entry
457 so the two lists (RBASES and the list of bases) will be
459 x = build_tree_list (NULL_TREE, NULL_TREE);
461 rbases = chainon (rbases, x);
468 /* Perform whatever initializations have yet to be done on the base
469 class of the class variable. These actions are in the global
470 variable CURRENT_BASE_INIT_LIST. Such an action could be
471 NULL_TREE, meaning that the user has explicitly called the base
472 class constructor with no arguments.
474 If there is a need for a call to a constructor, we must surround
475 that call with a pushlevel/poplevel pair, since we are technically
476 at the PARM level of scope.
478 Argument IMMEDIATELY, if zero, forces a new sequence to be
479 generated to contain these new insns, so it can be emitted later.
480 This sequence is saved in the global variable BASE_INIT_EXPR.
481 Otherwise, the insns are emitted into the current sequence.
483 Note that emit_base_init does *not* initialize virtual base
484 classes. That is done specially, elsewhere. */
492 tree rbase_init_list, vbase_init_list;
493 tree t_binfo = TYPE_BINFO (t);
494 tree binfos = BINFO_BASETYPES (t_binfo);
495 int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
499 mem_init_list = sort_member_init (t);
500 current_member_init_list = NULL_TREE;
502 sort_base_init (t, &rbase_init_list, &vbase_init_list);
503 current_base_init_list = NULL_TREE;
505 begin_init_stmts (&stmt_expr, &compound_stmt);
507 /* First, initialize the virtual base classes, if we are
508 constructing the most-derived object. */
509 if (TYPE_USES_VIRTUAL_BASECLASSES (t))
511 tree first_arg = TREE_CHAIN (DECL_ARGUMENTS (current_function_decl));
512 construct_virtual_bases (t, current_class_ref, current_class_ptr,
513 vbase_init_list, first_arg);
516 /* Now, perform initialization of non-virtual base classes. */
517 for (i = 0; i < n_baseclasses; i++)
519 tree base_binfo = TREE_VEC_ELT (binfos, i);
520 tree init = void_list_node;
522 if (TREE_VIA_VIRTUAL (base_binfo))
525 my_friendly_assert (BINFO_INHERITANCE_CHAIN (base_binfo) == t_binfo,
528 if (TREE_PURPOSE (rbase_init_list))
529 init = TREE_VALUE (rbase_init_list);
530 else if (TYPE_NEEDS_CONSTRUCTING (BINFO_TYPE (base_binfo)))
533 if (extra_warnings && copy_args_p (current_function_decl))
534 cp_warning ("base class `%#T' should be explicitly initialized in the copy constructor",
535 BINFO_TYPE (base_binfo));
538 if (init != void_list_node)
540 member = convert_pointer_to_real (base_binfo, current_class_ptr);
541 expand_aggr_init_1 (base_binfo, NULL_TREE,
542 build_indirect_ref (member, NULL_PTR), init,
546 expand_cleanup_for_base (base_binfo, NULL_TREE);
547 rbase_init_list = TREE_CHAIN (rbase_init_list);
550 /* Initialize all the virtual function table fields that
551 do come from virtual base classes. */
552 if (TYPE_USES_VIRTUAL_BASECLASSES (t))
553 expand_indirect_vtbls_init (t_binfo, current_class_ref, current_class_ptr);
555 /* Initialize all the virtual function table fields that
556 do not come from virtual base classes. */
557 expand_direct_vtbls_init (t_binfo, t_binfo, 1, 1, current_class_ptr);
559 for (member = TYPE_FIELDS (t); member; member = TREE_CHAIN (member))
564 /* member could be, for example, a CONST_DECL for an enumerated
565 tag; we don't want to try to initialize that, since it already
567 if (TREE_CODE (member) != FIELD_DECL || !DECL_NAME (member))
570 /* See if we had a user-specified member initialization. */
571 if (TREE_PURPOSE (mem_init_list))
573 name = TREE_PURPOSE (mem_init_list);
574 init = TREE_VALUE (mem_init_list);
577 my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE
578 || TREE_CODE (name) == FIELD_DECL, 349);
582 name = DECL_NAME (member);
583 init = DECL_INITIAL (member);
587 /* Effective C++ rule 12. */
588 if (warn_ecpp && init == NULL_TREE
589 && !DECL_ARTIFICIAL (member)
590 && TREE_CODE (TREE_TYPE (member)) != ARRAY_TYPE)
591 cp_warning ("`%D' should be initialized in the member initialization list", member);
594 perform_member_init (member, name, init, from_init_list);
595 mem_init_list = TREE_CHAIN (mem_init_list);
598 /* Now initialize any members from our bases. */
599 while (mem_init_list)
601 tree name, init, field;
603 if (TREE_PURPOSE (mem_init_list))
605 name = TREE_PURPOSE (mem_init_list);
606 init = TREE_VALUE (mem_init_list);
608 if (TREE_CODE (name) == IDENTIFIER_NODE)
609 field = IDENTIFIER_CLASS_VALUE (name);
613 /* If one member shadows another, get the outermost one. */
614 if (TREE_CODE (field) == TREE_LIST)
616 field = TREE_VALUE (field);
617 if (decl_type_context (field) != current_class_type)
618 cp_error ("field `%D' not in immediate context", field);
621 perform_member_init (field, name, init, 1);
623 mem_init_list = TREE_CHAIN (mem_init_list);
626 base_init_expr = finish_init_stmts (stmt_expr, compound_stmt);
628 /* All the implicit try blocks we built up will be zapped
629 when we come to a real binding contour boundary. */
632 /* Check that all fields are properly initialized after
633 an assignment to `this'. Called only when such an assignment
634 is actually noted. */
641 for (member = TYPE_FIELDS (t); member; member = TREE_CHAIN (member))
642 if (DECL_NAME (member) && TREE_USED (member))
643 cp_error ("field `%D' used before initialized (after assignment to `this')",
647 /* This code sets up the virtual function tables appropriate for
648 the pointer DECL. It is a one-ply initialization.
650 BINFO is the exact type that DECL is supposed to be. In
651 multiple inheritance, this might mean "C's A" if C : A, B. */
654 expand_virtual_init (binfo, decl)
657 tree type = BINFO_TYPE (binfo);
659 tree vtype, vtype_binfo;
661 /* This code is crusty. Should be simple, like:
662 vtbl = BINFO_VTABLE (binfo);
664 vtype = DECL_CONTEXT (CLASSTYPE_VFIELD (type));
665 vtype_binfo = get_binfo (vtype, TREE_TYPE (TREE_TYPE (decl)), 0);
666 vtbl = BINFO_VTABLE (binfo_value (DECL_FIELD_CONTEXT (CLASSTYPE_VFIELD (type)), binfo));
667 assemble_external (vtbl);
668 TREE_USED (vtbl) = 1;
669 vtbl = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (vtbl)), vtbl);
670 decl = convert_pointer_to_real (vtype_binfo, decl);
671 vtbl_ptr = build_vfield_ref (build_indirect_ref (decl, NULL_PTR), vtype);
672 if (vtbl_ptr == error_mark_node)
675 /* Have to convert VTBL since array sizes may be different. */
676 vtbl = convert_force (TREE_TYPE (vtbl_ptr), vtbl, 0);
677 finish_expr_stmt (build_modify_expr (vtbl_ptr, NOP_EXPR, vtbl));
680 /* If an exception is thrown in a constructor, those base classes already
681 constructed must be destroyed. This function creates the cleanup
682 for BINFO, which has just been constructed. If FLAG is non-NULL,
683 it is a DECL which is non-zero when this base needs to be
687 expand_cleanup_for_base (binfo, flag)
693 if (!TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (binfo)))
696 /* Call the destructor. */
697 expr = (build_scoped_method_call
698 (current_class_ref, binfo, dtor_identifier,
699 build_expr_list (NULL_TREE, integer_zero_node)));
701 expr = fold (build (COND_EXPR, void_type_node,
702 truthvalue_conversion (flag),
703 expr, integer_zero_node));
705 finish_subobject (expr);
708 /* Subroutine of `expand_aggr_vbase_init'.
709 BINFO is the binfo of the type that is being initialized.
710 INIT_LIST is the list of initializers for the virtual baseclass. */
713 expand_aggr_vbase_init_1 (binfo, exp, addr, init_list)
714 tree binfo, exp, addr, init_list;
716 tree init = purpose_member (binfo, init_list);
717 tree ref = build_indirect_ref (addr, NULL_PTR);
720 init = TREE_VALUE (init);
721 /* Call constructors, but don't set up vtables. */
722 expand_aggr_init_1 (binfo, exp, ref, init, LOOKUP_COMPLAIN);
725 /* Construct the virtual base-classes of THIS_REF (whose address is
726 THIS_PTR). The object has the indicated TYPE. The construction
727 actually takes place only if FLAG is non-zero. INIT_LIST is list
728 of initialization for constructor to perform. */
731 construct_virtual_bases (type, this_ref, this_ptr, init_list, flag)
742 /* If there are no virtual baseclasses, we shouldn't even be here. */
743 my_friendly_assert (TYPE_USES_VIRTUAL_BASECLASSES (type), 19990621);
745 /* First set the pointers in our object that tell us where to find
746 our virtual baseclasses. */
747 if_stmt = begin_if_stmt ();
748 finish_if_stmt_cond (flag, if_stmt);
749 result = init_vbase_pointers (type, this_ptr);
750 /* The RESULT will contain entries on the momentary obstack. They
751 must live until the end of this function; we use them in the loop
755 finish_expr_stmt (build_compound_expr (result));
756 finish_then_clause (if_stmt);
759 /* Now, run through the baseclasses, initializing each. */
760 for (vbases = CLASSTYPE_VBASECLASSES (type); vbases;
761 vbases = TREE_CHAIN (vbases))
763 tree tmp = purpose_member (vbases, result);
767 /* If there are virtual base classes with destructors, we need to
768 emit cleanups to destroy them if an exception is thrown during
769 the construction process. These exception regions (i.e., the
770 period during which the cleanups must occur) begin from the time
771 the construction is complete to the end of the function. If we
772 create a conditional block in which to initialize the
773 base-classes, then the cleanup region for the virtual base begins
774 inside a block, and ends outside of that block. This situation
775 confuses the sjlj exception-handling code. Therefore, we do not
776 create a single conditional block, but one for each
777 initialization. (That way the cleanup regions always begin
778 in the outer block.) We trust the back-end to figure out
779 that the FLAG will not change across initializations, and
780 avoid doing multiple tests. */
781 inner_if_stmt = begin_if_stmt ();
782 finish_if_stmt_cond (flag, inner_if_stmt);
783 compound_stmt = begin_compound_stmt (/*has_no_scope=*/1);
784 expand_aggr_vbase_init_1 (vbases, this_ref,
785 TREE_OPERAND (TREE_VALUE (tmp), 0),
787 finish_compound_stmt (/*has_no_scope=*/1, compound_stmt);
788 finish_then_clause (if_stmt);
791 expand_cleanup_for_base (vbases, flag);
794 /* Undo the call to push_momentary above. */
798 /* Find the context in which this FIELD can be initialized. */
801 initializing_context (field)
804 tree t = DECL_CONTEXT (field);
806 /* Anonymous union members can be initialized in the first enclosing
807 non-anonymous union context. */
808 while (t && ANON_AGGR_TYPE_P (t))
809 t = TYPE_CONTEXT (t);
813 /* Function to give error message if member initialization specification
814 is erroneous. FIELD is the member we decided to initialize.
815 TYPE is the type for which the initialization is being performed.
816 FIELD must be a member of TYPE.
818 MEMBER_NAME is the name of the member. */
821 member_init_ok_or_else (field, type, member_name)
824 const char *member_name;
826 if (field == error_mark_node)
828 if (field == NULL_TREE || initializing_context (field) != type)
830 cp_error ("class `%T' does not have any field named `%s'", type,
834 if (TREE_STATIC (field))
836 cp_error ("field `%#D' is static; only point of initialization is its declaration",
844 /* If NAME is a viable field name for the aggregate DECL,
845 and PARMS is a viable parameter list, then expand an _EXPR
846 which describes this initialization.
848 Note that we do not need to chase through the class's base classes
849 to look for NAME, because if it's in that list, it will be handled
850 by the constructor for that base class.
852 We do not yet have a fixed-point finder to instantiate types
853 being fed to overloaded constructors. If there is a unique
854 constructor, then argument types can be got from that one.
856 If INIT is non-NULL, then it the initialization should
857 be placed in `current_base_init_list', where it will be processed
858 by `emit_base_init'. */
861 expand_member_init (exp, name, init)
862 tree exp, name, init;
864 tree basetype = NULL_TREE, field;
867 if (exp == NULL_TREE)
868 return; /* complain about this later */
870 type = TYPE_MAIN_VARIANT (TREE_TYPE (exp));
872 if (name && TREE_CODE (name) == TYPE_DECL)
874 basetype = TYPE_MAIN_VARIANT (TREE_TYPE (name));
875 name = DECL_NAME (name);
878 if (name == NULL_TREE && IS_AGGR_TYPE (type))
879 switch (CLASSTYPE_N_BASECLASSES (type))
882 error ("base class initializer specified, but no base class to initialize");
885 basetype = TYPE_BINFO_BASETYPE (type, 0);
888 error ("initializer for unnamed base class ambiguous");
889 cp_error ("(type `%T' uses multiple inheritance)", type);
893 my_friendly_assert (init != NULL_TREE, 0);
895 /* The grammar should not allow fields which have names that are
896 TYPENAMEs. Therefore, if the field has a non-NULL TREE_TYPE, we
897 may assume that this is an attempt to initialize a base class
898 member of the current type. Otherwise, it is an attempt to
899 initialize a member field. */
901 if (init == void_type_node)
904 if (name == NULL_TREE || basetype)
908 if (name == NULL_TREE)
912 name = TYPE_IDENTIFIER (basetype);
915 error ("no base class to initialize");
920 else if (basetype != type
921 && ! current_template_parms
922 && ! vec_binfo_member (basetype,
923 TYPE_BINFO_BASETYPES (type))
924 && ! binfo_member (basetype, CLASSTYPE_VBASECLASSES (type)))
926 if (IDENTIFIER_CLASS_VALUE (name))
928 if (TYPE_USES_VIRTUAL_BASECLASSES (type))
929 cp_error ("type `%T' is not an immediate or virtual basetype for `%T'",
932 cp_error ("type `%T' is not an immediate basetype for `%T'",
937 if (purpose_member (basetype, current_base_init_list))
939 cp_error ("base class `%T' already initialized", basetype);
943 if (warn_reorder && current_member_init_list)
945 cp_warning ("base initializer for `%T'", basetype);
946 warning (" will be re-ordered to precede member initializations");
949 base_init = build_tree_list (basetype, init);
950 current_base_init_list = chainon (current_base_init_list, base_init);
957 field = lookup_field (type, name, 1, 0);
959 if (! member_init_ok_or_else (field, type, IDENTIFIER_POINTER (name)))
962 if (purpose_member (name, current_member_init_list))
964 cp_error ("field `%D' already initialized", field);
968 member_init = build_tree_list (name, init);
969 current_member_init_list = chainon (current_member_init_list, member_init);
973 /* We are about to generate some complex initialization code.
974 Conceptually, it is all a single expression. However, we may want
975 to include conditionals, loops, and other such statement-level
976 constructs. Therefore, we build the initialization code inside a
977 statement-expression. This function starts such an expression.
978 STMT_EXPR_P and COMPOUND_STMT_P are filled in by this function;
979 pass them back to finish_init_stmts when the expression is
983 begin_init_stmts (stmt_expr_p, compound_stmt_p)
985 tree *compound_stmt_p;
988 *stmt_expr_p = begin_stmt_expr ();
989 *compound_stmt_p = begin_compound_stmt (/*has_no_scope=*/1);
992 /* Finish out the statement-expression begun by the previous call to
993 begin_init_stmts. Returns the statement-expression itself. */
996 finish_init_stmts (stmt_expr, compound_stmt)
1002 = finish_stmt_expr (stmt_expr,
1003 finish_compound_stmt (/*has_no_scope=*/1,
1006 /* To avoid spurious warnings about unused values, we set
1009 TREE_USED (stmt_expr) = 1;
1014 /* This is like `expand_member_init', only it stores one aggregate
1017 INIT comes in two flavors: it is either a value which
1018 is to be stored in EXP, or it is a parameter list
1019 to go to a constructor, which will operate on EXP.
1020 If INIT is not a parameter list for a constructor, then set
1021 LOOKUP_ONLYCONVERTING.
1022 If FLAGS is LOOKUP_ONLYCONVERTING then it is the = init form of
1023 the initializer, if FLAGS is 0, then it is the (init) form.
1024 If `init' is a CONSTRUCTOR, then we emit a warning message,
1025 explaining that such initializations are invalid.
1027 ALIAS_THIS is nonzero iff we are initializing something which is
1028 essentially an alias for current_class_ref. In this case, the base
1029 constructor may move it on us, and we must keep track of such
1032 If INIT resolves to a CALL_EXPR which happens to return
1033 something of the type we are looking for, then we know
1034 that we can safely use that call to perform the
1037 The virtual function table pointer cannot be set up here, because
1038 we do not really know its type.
1040 Virtual baseclass pointers are also set up here.
1042 This never calls operator=().
1044 When initializing, nothing is CONST.
1046 A default copy constructor may have to be used to perform the
1049 A constructor or a conversion operator may have to be used to
1050 perform the initialization, but not both, as it would be ambiguous. */
1053 build_aggr_init (exp, init, flags)
1060 tree type = TREE_TYPE (exp);
1061 int was_const = TREE_READONLY (exp);
1062 int was_volatile = TREE_THIS_VOLATILE (exp);
1064 if (init == error_mark_node)
1065 return error_mark_node;
1067 TREE_READONLY (exp) = 0;
1068 TREE_THIS_VOLATILE (exp) = 0;
1070 if (init && TREE_CODE (init) != TREE_LIST)
1071 flags |= LOOKUP_ONLYCONVERTING;
1073 if (TREE_CODE (type) == ARRAY_TYPE)
1075 /* Must arrange to initialize each element of EXP
1076 from elements of INIT. */
1077 tree itype = init ? TREE_TYPE (init) : NULL_TREE;
1078 if (CP_TYPE_QUALS (type) != TYPE_UNQUALIFIED)
1080 TREE_TYPE (exp) = TYPE_MAIN_VARIANT (type);
1082 TREE_TYPE (init) = TYPE_MAIN_VARIANT (itype);
1084 if (init && TREE_TYPE (init) == NULL_TREE)
1086 /* Handle bad initializers like:
1090 COMPLEX(double r = 0.0, double i = 0.0) {re = r; im = i;};
1094 int main(int argc, char **argv) {
1095 COMPLEX zees(1.0, 0.0)[10];
1098 error ("bad array initializer");
1099 return error_mark_node;
1101 stmt_expr = build_vec_init (exp, exp, array_type_nelts (type), init,
1102 init && same_type_p (TREE_TYPE (init),
1104 TREE_READONLY (exp) = was_const;
1105 TREE_THIS_VOLATILE (exp) = was_volatile;
1106 TREE_TYPE (exp) = type;
1108 TREE_TYPE (init) = itype;
1112 if (TREE_CODE (exp) == VAR_DECL || TREE_CODE (exp) == PARM_DECL)
1113 /* just know that we've seen something for this node */
1114 TREE_USED (exp) = 1;
1116 TREE_TYPE (exp) = TYPE_MAIN_VARIANT (type);
1117 begin_init_stmts (&stmt_expr, &compound_stmt);
1118 destroy_temps = stmts_are_full_exprs_p;
1119 stmts_are_full_exprs_p = 0;
1120 expand_aggr_init_1 (TYPE_BINFO (type), exp, exp,
1121 init, LOOKUP_NORMAL|flags);
1122 stmt_expr = finish_init_stmts (stmt_expr, compound_stmt);
1123 stmts_are_full_exprs_p = destroy_temps;
1124 TREE_TYPE (exp) = type;
1125 TREE_READONLY (exp) = was_const;
1126 TREE_THIS_VOLATILE (exp) = was_volatile;
1132 expand_default_init (binfo, true_exp, exp, init, flags)
1138 tree type = TREE_TYPE (exp);
1140 /* It fails because there may not be a constructor which takes
1141 its own type as the first (or only parameter), but which does
1142 take other types via a conversion. So, if the thing initializing
1143 the expression is a unit element of type X, first try X(X&),
1144 followed by initialization by X. If neither of these work
1145 out, then look hard. */
1149 if (init && TREE_CODE (init) != TREE_LIST
1150 && (flags & LOOKUP_ONLYCONVERTING))
1152 /* Base subobjects should only get direct-initialization. */
1153 if (true_exp != exp)
1156 if (flags & DIRECT_BIND)
1157 /* Do nothing. We hit this in two cases: Reference initialization,
1158 where we aren't initializing a real variable, so we don't want
1159 to run a new constructor; and catching an exception, where we
1160 have already built up the constructor call so we could wrap it
1161 in an exception region. */;
1162 else if (TREE_CODE (init) == CONSTRUCTOR)
1163 /* A brace-enclosed initializer has whatever type is
1164 required. There's no need to convert it. */
1167 init = ocp_convert (type, init, CONV_IMPLICIT|CONV_FORCE_TEMP, flags);
1169 if (TREE_CODE (init) == TRY_CATCH_EXPR)
1170 /* We need to protect the initialization of a catch parm
1171 with a call to terminate(), which shows up as a TRY_CATCH_EXPR
1172 around the TARGET_EXPR for the copy constructor. See
1173 expand_start_catch_block. */
1174 TREE_OPERAND (init, 0) = build (INIT_EXPR, TREE_TYPE (exp), exp,
1175 TREE_OPERAND (init, 0));
1177 init = build (INIT_EXPR, TREE_TYPE (exp), exp, init);
1178 TREE_SIDE_EFFECTS (init) = 1;
1179 finish_expr_stmt (init);
1183 if (init == NULL_TREE
1184 || (TREE_CODE (init) == TREE_LIST && ! TREE_TYPE (init)))
1188 init = TREE_VALUE (parms);
1191 parms = build_expr_list (NULL_TREE, init);
1193 if (TYPE_USES_VIRTUAL_BASECLASSES (type))
1195 if (true_exp == exp)
1196 parms = tree_cons (NULL_TREE, integer_one_node, parms);
1198 parms = tree_cons (NULL_TREE, integer_zero_node, parms);
1199 flags |= LOOKUP_HAS_IN_CHARGE;
1202 rval = build_method_call (exp, ctor_identifier,
1203 parms, binfo, flags);
1204 if (TREE_SIDE_EFFECTS (rval))
1205 finish_expr_stmt (rval);
1208 /* This function is responsible for initializing EXP with INIT
1211 BINFO is the binfo of the type for who we are performing the
1212 initialization. For example, if W is a virtual base class of A and B,
1214 If we are initializing B, then W must contain B's W vtable, whereas
1215 were we initializing C, W must contain C's W vtable.
1217 TRUE_EXP is nonzero if it is the true expression being initialized.
1218 In this case, it may be EXP, or may just contain EXP. The reason we
1219 need this is because if EXP is a base element of TRUE_EXP, we
1220 don't necessarily know by looking at EXP where its virtual
1221 baseclass fields should really be pointing. But we do know
1222 from TRUE_EXP. In constructors, we don't know anything about
1223 the value being initialized.
1225 ALIAS_THIS serves the same purpose it serves for expand_aggr_init.
1227 FLAGS is just passes to `build_method_call'. See that function for
1231 expand_aggr_init_1 (binfo, true_exp, exp, init, flags)
1237 tree type = TREE_TYPE (exp);
1239 my_friendly_assert (init != error_mark_node && type != error_mark_node, 211);
1241 /* Use a function returning the desired type to initialize EXP for us.
1242 If the function is a constructor, and its first argument is
1243 NULL_TREE, know that it was meant for us--just slide exp on
1244 in and expand the constructor. Constructors now come
1247 if (init && TREE_CODE (exp) == VAR_DECL
1248 && TREE_CODE (init) == CONSTRUCTOR
1249 && TREE_HAS_CONSTRUCTOR (init))
1251 /* If store_init_value returns NULL_TREE, the INIT has been
1252 record in the DECL_INITIAL for EXP. That means there's
1253 nothing more we have to do. */
1254 if (!store_init_value (exp, init))
1256 if (!building_stmt_tree ())
1257 expand_decl_init (exp);
1261 tree t = build (INIT_EXPR, type, exp, init);
1262 TREE_SIDE_EFFECTS (t) = 1;
1263 finish_expr_stmt (t);
1268 /* We know that expand_default_init can handle everything we want
1270 expand_default_init (binfo, true_exp, exp, init, flags);
1273 /* Report an error if NAME is not the name of a user-defined,
1274 aggregate type. If OR_ELSE is nonzero, give an error message. */
1277 is_aggr_typedef (name, or_else)
1283 if (name == error_mark_node)
1286 if (IDENTIFIER_HAS_TYPE_VALUE (name))
1287 type = IDENTIFIER_TYPE_VALUE (name);
1291 cp_error ("`%T' is not an aggregate typedef", name);
1295 if (! IS_AGGR_TYPE (type)
1296 && TREE_CODE (type) != TEMPLATE_TYPE_PARM
1297 && TREE_CODE (type) != TEMPLATE_TEMPLATE_PARM)
1300 cp_error ("`%T' is not an aggregate type", type);
1306 /* Report an error if TYPE is not a user-defined, aggregate type. If
1307 OR_ELSE is nonzero, give an error message. */
1310 is_aggr_type (type, or_else)
1314 if (type == error_mark_node)
1317 if (! IS_AGGR_TYPE (type)
1318 && TREE_CODE (type) != TEMPLATE_TYPE_PARM
1319 && TREE_CODE (type) != TEMPLATE_TEMPLATE_PARM)
1322 cp_error ("`%T' is not an aggregate type", type);
1328 /* Like is_aggr_typedef, but returns typedef if successful. */
1331 get_aggr_from_typedef (name, or_else)
1337 if (name == error_mark_node)
1340 if (IDENTIFIER_HAS_TYPE_VALUE (name))
1341 type = IDENTIFIER_TYPE_VALUE (name);
1345 cp_error ("`%T' fails to be an aggregate typedef", name);
1349 if (! IS_AGGR_TYPE (type)
1350 && TREE_CODE (type) != TEMPLATE_TYPE_PARM
1351 && TREE_CODE (type) != TEMPLATE_TEMPLATE_PARM)
1354 cp_error ("type `%T' is of non-aggregate type", type);
1361 get_type_value (name)
1364 if (name == error_mark_node)
1367 if (IDENTIFIER_HAS_TYPE_VALUE (name))
1368 return IDENTIFIER_TYPE_VALUE (name);
1374 /* This code could just as well go in `class.c', but is placed here for
1377 /* For an expression of the form TYPE :: NAME (PARMLIST), build
1378 the appropriate function call. */
1381 build_member_call (type, name, parmlist)
1382 tree type, name, parmlist;
1387 tree basetype_path, decl;
1389 if (TREE_CODE (name) == TEMPLATE_ID_EXPR
1390 && TREE_CODE (type) == NAMESPACE_DECL)
1392 /* 'name' already refers to the decls from the namespace, since we
1393 hit do_identifier for template_ids. */
1394 method_name = TREE_OPERAND (name, 0);
1395 /* FIXME: Since we don't do independent names right yet, the
1396 name might also be a LOOKUP_EXPR. Once we resolve this to a
1397 real decl earlier, this can go. This may happen during
1399 if (TREE_CODE (method_name) == LOOKUP_EXPR)
1401 method_name = lookup_namespace_name
1402 (type, TREE_OPERAND (method_name, 0));
1403 TREE_OPERAND (name, 0) = method_name;
1405 my_friendly_assert (is_overloaded_fn (method_name), 980519);
1406 return build_x_function_call (name, parmlist, current_class_ref);
1409 if (type == std_node)
1410 return build_x_function_call (do_scoped_id (name, 0), parmlist,
1412 if (TREE_CODE (type) == NAMESPACE_DECL)
1413 return build_x_function_call (lookup_namespace_name (type, name),
1414 parmlist, current_class_ref);
1416 if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
1418 method_name = TREE_OPERAND (name, 0);
1419 if (TREE_CODE (method_name) == COMPONENT_REF)
1420 method_name = TREE_OPERAND (method_name, 1);
1421 if (is_overloaded_fn (method_name))
1422 method_name = DECL_NAME (OVL_CURRENT (method_name));
1423 TREE_OPERAND (name, 0) = method_name;
1428 if (TREE_CODE (method_name) == BIT_NOT_EXPR)
1430 method_name = TREE_OPERAND (method_name, 0);
1434 /* This shouldn't be here, and build_member_call shouldn't appear in
1436 if (type && TREE_CODE (type) == IDENTIFIER_NODE
1437 && get_aggr_from_typedef (type, 0) == 0)
1439 tree ns = lookup_name (type, 0);
1440 if (ns && TREE_CODE (ns) == NAMESPACE_DECL)
1442 return build_x_function_call (build_offset_ref (type, name), parmlist, current_class_ref);
1446 if (type == NULL_TREE || ! is_aggr_type (type, 1))
1447 return error_mark_node;
1449 /* An operator we did not like. */
1450 if (name == NULL_TREE)
1451 return error_mark_node;
1455 cp_error ("cannot call destructor `%T::~%T' without object", type,
1457 return error_mark_node;
1460 decl = maybe_dummy_object (type, &basetype_path);
1462 /* Convert 'this' to the specified type to disambiguate conversion
1463 to the function's context. Apparently Standard C++ says that we
1464 shouldn't do this. */
1465 if (decl == current_class_ref
1467 && ACCESSIBLY_UNIQUELY_DERIVED_P (type, current_class_type))
1469 tree olddecl = current_class_ptr;
1470 tree oldtype = TREE_TYPE (TREE_TYPE (olddecl));
1471 if (oldtype != type)
1473 tree newtype = build_qualified_type (type, TYPE_QUALS (oldtype));
1474 decl = convert_force (build_pointer_type (newtype), olddecl, 0);
1475 decl = build_indirect_ref (decl, NULL_PTR);
1479 if (method_name == constructor_name (type)
1480 || method_name == constructor_name_full (type))
1481 return build_functional_cast (type, parmlist);
1482 if (lookup_fnfields (basetype_path, method_name, 0))
1483 return build_method_call (decl,
1484 TREE_CODE (name) == TEMPLATE_ID_EXPR
1485 ? name : method_name,
1486 parmlist, basetype_path,
1487 LOOKUP_NORMAL|LOOKUP_NONVIRTUAL);
1488 if (TREE_CODE (name) == IDENTIFIER_NODE
1489 && ((t = lookup_field (TYPE_BINFO (type), name, 1, 0))))
1491 if (t == error_mark_node)
1492 return error_mark_node;
1493 if (TREE_CODE (t) == FIELD_DECL)
1495 if (is_dummy_object (decl))
1497 cp_error ("invalid use of non-static field `%D'", t);
1498 return error_mark_node;
1500 decl = build (COMPONENT_REF, TREE_TYPE (t), decl, t);
1502 else if (TREE_CODE (t) == VAR_DECL)
1506 cp_error ("invalid use of member `%D'", t);
1507 return error_mark_node;
1509 if (TYPE_LANG_SPECIFIC (TREE_TYPE (decl)))
1510 return build_opfncall (CALL_EXPR, LOOKUP_NORMAL, decl,
1511 parmlist, NULL_TREE);
1512 return build_function_call (decl, parmlist);
1516 cp_error ("no method `%T::%D'", type, name);
1517 return error_mark_node;
1521 /* Build a reference to a member of an aggregate. This is not a
1522 C++ `&', but really something which can have its address taken,
1523 and then act as a pointer to member, for example TYPE :: FIELD
1524 can have its address taken by saying & TYPE :: FIELD.
1526 @@ Prints out lousy diagnostics for operator <typename>
1529 @@ This function should be rewritten and placed in search.c. */
1532 build_offset_ref (type, name)
1535 tree decl, t = error_mark_node;
1537 tree basebinfo = NULL_TREE;
1538 tree orig_name = name;
1540 /* class templates can come in as TEMPLATE_DECLs here. */
1541 if (TREE_CODE (name) == TEMPLATE_DECL)
1544 if (type == std_node)
1545 return do_scoped_id (name, 0);
1547 if (processing_template_decl || uses_template_parms (type))
1548 return build_min_nt (SCOPE_REF, type, name);
1550 /* Handle namespace names fully here. */
1551 if (TREE_CODE (type) == NAMESPACE_DECL)
1553 t = lookup_namespace_name (type, name);
1554 if (t != error_mark_node && ! type_unknown_p (t))
1557 t = convert_from_reference (t);
1562 if (type == NULL_TREE || ! is_aggr_type (type, 1))
1563 return error_mark_node;
1565 if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
1567 /* If the NAME is a TEMPLATE_ID_EXPR, we are looking at
1568 something like `a.template f<int>' or the like. For the most
1569 part, we treat this just like a.f. We do remember, however,
1570 the template-id that was used. */
1571 name = TREE_OPERAND (orig_name, 0);
1573 if (TREE_CODE (name) == LOOKUP_EXPR)
1574 /* This can happen during tsubst'ing. */
1575 name = TREE_OPERAND (name, 0);
1577 my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 0);
1580 if (TREE_CODE (name) == BIT_NOT_EXPR)
1582 if (! check_dtor_name (type, name))
1583 cp_error ("qualified type `%T' does not match destructor name `~%T'",
1584 type, TREE_OPERAND (name, 0));
1585 name = dtor_identifier;
1588 /* I think this is wrong, but the draft is unclear. --jason 6/15/98 */
1589 else if (name == constructor_name_full (type)
1590 || name == constructor_name (type))
1591 name = ctor_identifier;
1594 if (TYPE_SIZE (complete_type (type)) == 0
1595 && !TYPE_BEING_DEFINED (type))
1597 cp_error ("incomplete type `%T' does not have member `%D'", type,
1599 return error_mark_node;
1602 decl = maybe_dummy_object (type, &basebinfo);
1604 member = lookup_member (basebinfo, name, 1, 0);
1606 if (member == error_mark_node)
1607 return error_mark_node;
1609 /* A lot of this logic is now handled in lookup_field and
1611 if (member && BASELINK_P (member))
1613 /* Go from the TREE_BASELINK to the member function info. */
1614 tree fnfields = member;
1615 t = TREE_VALUE (fnfields);
1617 if (TREE_CODE (orig_name) == TEMPLATE_ID_EXPR)
1619 /* The FNFIELDS are going to contain functions that aren't
1620 necessarily templates, and templates that don't
1621 necessarily match the explicit template parameters. We
1622 save all the functions, and the explicit parameters, and
1623 then figure out exactly what to instantiate with what
1624 arguments in instantiate_type. */
1626 if (TREE_CODE (t) != OVERLOAD)
1627 /* The code in instantiate_type which will process this
1628 expects to encounter OVERLOADs, not raw functions. */
1629 t = ovl_cons (t, NULL_TREE);
1631 return build (OFFSET_REF,
1634 build (TEMPLATE_ID_EXPR,
1637 TREE_OPERAND (orig_name, 1)));
1640 if (!really_overloaded_fn (t))
1642 /* Get rid of a potential OVERLOAD around it */
1643 t = OVL_CURRENT (t);
1645 /* unique functions are handled easily. */
1646 basebinfo = TREE_PURPOSE (fnfields);
1647 if (!enforce_access (basebinfo, t))
1648 return error_mark_node;
1650 if (DECL_STATIC_FUNCTION_P (t))
1652 return build (OFFSET_REF, TREE_TYPE (t), decl, t);
1655 TREE_TYPE (fnfields) = unknown_type_node;
1656 return build (OFFSET_REF, unknown_type_node, decl, fnfields);
1663 cp_error ("`%D' is not a member of type `%T'", name, type);
1664 return error_mark_node;
1667 if (TREE_CODE (t) == TYPE_DECL)
1672 /* static class members and class-specific enum
1673 values can be returned without further ado. */
1674 if (TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == CONST_DECL)
1677 return convert_from_reference (t);
1680 if (TREE_CODE (t) == FIELD_DECL && DECL_C_BIT_FIELD (t))
1682 cp_error ("illegal pointer to bit field `%D'", t);
1683 return error_mark_node;
1686 /* static class functions too. */
1687 if (TREE_CODE (t) == FUNCTION_DECL
1688 && TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
1689 my_friendly_abort (53);
1691 /* In member functions, the form `type::name' is no longer
1692 equivalent to `this->type::name', at least not until
1693 resolve_offset_ref. */
1694 return build (OFFSET_REF, build_offset_type (type, TREE_TYPE (t)), decl, t);
1697 /* If a OFFSET_REF made it through to here, then it did
1698 not have its address taken. */
1701 resolve_offset_ref (exp)
1704 tree type = TREE_TYPE (exp);
1705 tree base = NULL_TREE;
1707 tree basetype, addr;
1709 if (TREE_CODE (exp) == OFFSET_REF)
1711 member = TREE_OPERAND (exp, 1);
1712 base = TREE_OPERAND (exp, 0);
1716 my_friendly_assert (TREE_CODE (type) == OFFSET_TYPE, 214);
1717 if (TYPE_OFFSET_BASETYPE (type) != current_class_type)
1719 error ("object missing in use of pointer-to-member construct");
1720 return error_mark_node;
1723 type = TREE_TYPE (type);
1724 base = current_class_ref;
1727 if (BASELINK_P (member))
1729 if (! flag_ms_extensions)
1730 cp_pedwarn ("assuming & on overloaded member function");
1731 return build_unary_op (ADDR_EXPR, exp, 0);
1734 if (TREE_CODE (TREE_TYPE (member)) == METHOD_TYPE)
1736 if (! flag_ms_extensions)
1737 cp_pedwarn ("assuming & on `%E'", member);
1738 return build_unary_op (ADDR_EXPR, exp, 0);
1741 if ((TREE_CODE (member) == VAR_DECL
1742 && ! TYPE_PTRMEMFUNC_P (TREE_TYPE (member))
1743 && ! TYPE_PTRMEM_P (TREE_TYPE (member)))
1744 || TREE_CODE (TREE_TYPE (member)) == FUNCTION_TYPE)
1746 /* These were static members. */
1747 if (mark_addressable (member) == 0)
1748 return error_mark_node;
1752 if (TREE_CODE (TREE_TYPE (member)) == POINTER_TYPE
1753 && TREE_CODE (TREE_TYPE (TREE_TYPE (member))) == METHOD_TYPE)
1756 /* Syntax error can cause a member which should
1757 have been seen as static to be grok'd as non-static. */
1758 if (TREE_CODE (member) == FIELD_DECL && current_class_ref == NULL_TREE)
1760 if (TREE_ADDRESSABLE (member) == 0)
1762 cp_error_at ("member `%D' is non-static but referenced as a static member",
1764 error ("at this point in file");
1765 TREE_ADDRESSABLE (member) = 1;
1767 return error_mark_node;
1770 /* The first case is really just a reference to a member of `this'. */
1771 if (TREE_CODE (member) == FIELD_DECL
1772 && (base == current_class_ref || is_dummy_object (base)))
1777 if (TREE_CODE (exp) == OFFSET_REF && TREE_CODE (type) == OFFSET_TYPE)
1778 basetype = TYPE_OFFSET_BASETYPE (type);
1780 basetype = DECL_CONTEXT (member);
1782 base = current_class_ptr;
1784 if (get_base_distance (basetype, TREE_TYPE (TREE_TYPE (base)), 0, &basetype_path) < 0)
1786 error_not_base_type (basetype, TREE_TYPE (TREE_TYPE (base)));
1787 return error_mark_node;
1789 /* Kludge: we need to use basetype_path now, because
1790 convert_pointer_to will bash it. */
1791 enforce_access (basetype_path, member);
1792 addr = convert_pointer_to (basetype, base);
1794 /* Even in the case of illegal access, we form the
1795 COMPONENT_REF; that will allow better error recovery than
1796 just feeding back error_mark_node. */
1797 expr = build (COMPONENT_REF, TREE_TYPE (member),
1798 build_indirect_ref (addr, NULL_PTR), member);
1799 return convert_from_reference (expr);
1802 /* Ensure that we have an object. */
1803 if (is_dummy_object (base))
1804 addr = error_mark_node;
1806 /* If this is a reference to a member function, then return the
1807 address of the member function (which may involve going
1808 through the object's vtable), otherwise, return an expression
1809 for the dereferenced pointer-to-member construct. */
1810 addr = build_unary_op (ADDR_EXPR, base, 0);
1812 if (TYPE_PTRMEM_P (TREE_TYPE (member)))
1814 if (addr == error_mark_node)
1816 cp_error ("object missing in `%E'", exp);
1817 return error_mark_node;
1820 basetype = TYPE_OFFSET_BASETYPE (TREE_TYPE (TREE_TYPE (member)));
1821 addr = convert_pointer_to (basetype, addr);
1822 member = cp_convert (ptrdiff_type_node, member);
1824 /* Pointer to data members are offset by one, so that a null
1825 pointer with a real value of 0 is distinguishable from an
1826 offset of the first member of a structure. */
1827 member = build_binary_op (MINUS_EXPR, member,
1828 cp_convert (ptrdiff_type_node, integer_one_node));
1830 return build1 (INDIRECT_REF, type,
1831 build (PLUS_EXPR, build_pointer_type (type),
1834 else if (TYPE_PTRMEMFUNC_P (TREE_TYPE (member)))
1836 return get_member_function_from_ptrfunc (&addr, member);
1838 my_friendly_abort (56);
1843 /* Return either DECL or its known constant value (if it has one). */
1846 decl_constant_value (decl)
1849 if (! TREE_THIS_VOLATILE (decl)
1850 && DECL_INITIAL (decl)
1851 && DECL_INITIAL (decl) != error_mark_node
1852 /* This is invalid if initial value is not constant.
1853 If it has either a function call, a memory reference,
1854 or a variable, then re-evaluating it could give different results. */
1855 && TREE_CONSTANT (DECL_INITIAL (decl))
1856 /* Check for cases where this is sub-optimal, even though valid. */
1857 && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR)
1858 return DECL_INITIAL (decl);
1862 /* Common subroutines of build_new and build_vec_delete. */
1864 /* Call the global __builtin_delete to delete ADDR. */
1867 build_builtin_delete_call (addr)
1870 mark_used (global_delete_fndecl);
1871 return build_call (global_delete_fndecl,
1872 void_type_node, build_expr_list (NULL_TREE, addr));
1875 /* Generate a C++ "new" expression. DECL is either a TREE_LIST
1876 (which needs to go through some sort of groktypename) or it
1877 is the name of the class we are newing. INIT is an initialization value.
1878 It is either an EXPRLIST, an EXPR_NO_COMMAS, or something in braces.
1879 If INIT is void_type_node, it means do *not* call a constructor
1882 For types with constructors, the data returned is initialized
1883 by the appropriate constructor.
1885 Whether the type has a constructor or not, if it has a pointer
1886 to a virtual function table, then that pointer is set up
1889 Unless I am mistaken, a call to new () will return initialized
1890 data regardless of whether the constructor itself is private or
1891 not. NOPE; new fails if the constructor is private (jcm).
1893 Note that build_new does nothing to assure that any special
1894 alignment requirements of the type are met. Rather, it leaves
1895 it up to malloc to do the right thing. Otherwise, folding to
1896 the right alignment cal cause problems if the user tries to later
1897 free the memory returned by `new'.
1899 PLACEMENT is the `placement' list for user-defined operator new (). */
1901 extern int flag_check_new;
1904 build_new (placement, decl, init, use_global_new)
1910 tree nelts = NULL_TREE, t;
1913 tree pending_sizes = NULL_TREE;
1915 if (decl == error_mark_node)
1916 return error_mark_node;
1918 if (TREE_CODE (decl) == TREE_LIST)
1920 tree absdcl = TREE_VALUE (decl);
1921 tree last_absdcl = NULL_TREE;
1922 int old_immediate_size_expand = 0;
1924 if (current_function_decl
1925 && DECL_CONSTRUCTOR_P (current_function_decl))
1927 old_immediate_size_expand = immediate_size_expand;
1928 immediate_size_expand = 0;
1931 nelts = integer_one_node;
1933 if (absdcl && TREE_CODE (absdcl) == CALL_EXPR)
1934 my_friendly_abort (215);
1935 while (absdcl && TREE_CODE (absdcl) == INDIRECT_REF)
1937 last_absdcl = absdcl;
1938 absdcl = TREE_OPERAND (absdcl, 0);
1941 if (absdcl && TREE_CODE (absdcl) == ARRAY_REF)
1943 /* probably meant to be a vec new */
1946 while (TREE_OPERAND (absdcl, 0)
1947 && TREE_CODE (TREE_OPERAND (absdcl, 0)) == ARRAY_REF)
1949 last_absdcl = absdcl;
1950 absdcl = TREE_OPERAND (absdcl, 0);
1954 this_nelts = TREE_OPERAND (absdcl, 1);
1955 if (this_nelts != error_mark_node)
1957 if (this_nelts == NULL_TREE)
1958 error ("new of array type fails to specify size");
1959 else if (processing_template_decl)
1962 absdcl = TREE_OPERAND (absdcl, 0);
1966 int flags = pedantic ? WANT_INT : (WANT_INT | WANT_ENUM);
1967 if (build_expr_type_conversion (flags, this_nelts, 0)
1969 pedwarn ("size in array new must have integral type");
1971 this_nelts = save_expr (cp_convert (sizetype, this_nelts));
1972 absdcl = TREE_OPERAND (absdcl, 0);
1973 if (this_nelts == integer_zero_node)
1975 warning ("zero size array reserves no space");
1976 nelts = integer_zero_node;
1979 nelts = build_binary_op (MULT_EXPR, nelts, this_nelts);
1983 nelts = integer_zero_node;
1987 TREE_OPERAND (last_absdcl, 0) = absdcl;
1989 TREE_VALUE (decl) = absdcl;
1991 type = groktypename (decl);
1992 if (! type || type == error_mark_node)
1994 immediate_size_expand = old_immediate_size_expand;
1995 return error_mark_node;
1998 if (current_function_decl
1999 && DECL_CONSTRUCTOR_P (current_function_decl))
2001 pending_sizes = get_pending_sizes ();
2002 immediate_size_expand = old_immediate_size_expand;
2005 else if (TREE_CODE (decl) == IDENTIFIER_NODE)
2007 if (IDENTIFIER_HAS_TYPE_VALUE (decl))
2009 /* An aggregate type. */
2010 type = IDENTIFIER_TYPE_VALUE (decl);
2011 decl = TYPE_MAIN_DECL (type);
2015 /* A builtin type. */
2016 decl = lookup_name (decl, 1);
2017 my_friendly_assert (TREE_CODE (decl) == TYPE_DECL, 215);
2018 type = TREE_TYPE (decl);
2021 else if (TREE_CODE (decl) == TYPE_DECL)
2023 type = TREE_TYPE (decl);
2028 decl = TYPE_MAIN_DECL (type);
2031 if (processing_template_decl)
2034 t = min_tree_cons (min_tree_cons (NULL_TREE, type, NULL_TREE),
2035 build_min_nt (ARRAY_REF, NULL_TREE, nelts),
2040 rval = build_min_nt (NEW_EXPR, placement, t, init);
2041 NEW_EXPR_USE_GLOBAL (rval) = use_global_new;
2045 /* ``A reference cannot be created by the new operator. A reference
2046 is not an object (8.2.2, 8.4.3), so a pointer to it could not be
2047 returned by new.'' ARM 5.3.3 */
2048 if (TREE_CODE (type) == REFERENCE_TYPE)
2050 error ("new cannot be applied to a reference type");
2051 type = TREE_TYPE (type);
2054 if (TREE_CODE (type) == FUNCTION_TYPE)
2056 error ("new cannot be applied to a function type");
2057 return error_mark_node;
2060 /* When the object being created is an array, the new-expression yields a
2061 pointer to the initial element (if any) of the array. For example,
2062 both new int and new int[10] return an int*. 5.3.4. */
2063 if (TREE_CODE (type) == ARRAY_TYPE && has_array == 0)
2065 nelts = array_type_nelts_top (type);
2067 type = TREE_TYPE (type);
2071 t = build_nt (ARRAY_REF, type, nelts);
2075 rval = build (NEW_EXPR, build_pointer_type (type), placement, t, init);
2076 NEW_EXPR_USE_GLOBAL (rval) = use_global_new;
2077 TREE_SIDE_EFFECTS (rval) = 1;
2079 /* Wrap it in a NOP_EXPR so warn_if_unused_value doesn't complain. */
2080 rval = build1 (NOP_EXPR, TREE_TYPE (rval), rval);
2081 TREE_NO_UNUSED_WARNING (rval) = 1;
2084 rval = build_compound_expr (chainon (pending_sizes,
2085 build_expr_list (NULL_TREE, rval)));
2090 /* Given a Java class, return a decl for the corresponding java.lang.Class. */
2093 build_java_class_ref (type)
2096 tree name, class_decl;
2097 static tree CL_prefix = NULL_TREE;
2098 if (CL_prefix == NULL_TREE)
2099 CL_prefix = get_identifier("_CL_");
2100 if (jclass_node == NULL_TREE)
2102 jclass_node = IDENTIFIER_GLOBAL_VALUE (get_identifier("jclass"));
2103 if (jclass_node == NULL_TREE)
2104 fatal("call to Java constructor, while `jclass' undefined");
2105 jclass_node = TREE_TYPE (jclass_node);
2107 name = build_overload_with_type (CL_prefix, type);
2108 class_decl = IDENTIFIER_GLOBAL_VALUE (name);
2109 if (class_decl == NULL_TREE)
2111 push_permanent_obstack ();
2112 class_decl = build_decl (VAR_DECL, name, TREE_TYPE (jclass_node));
2113 TREE_STATIC (class_decl) = 1;
2114 DECL_EXTERNAL (class_decl) = 1;
2115 TREE_PUBLIC (class_decl) = 1;
2116 DECL_ARTIFICIAL (class_decl) = 1;
2117 DECL_IGNORED_P (class_decl) = 1;
2118 pushdecl_top_level (class_decl);
2119 make_decl_rtl (class_decl, NULL_PTR, 1);
2125 /* Called from cplus_expand_expr when expanding a NEW_EXPR. The return
2126 value is immediately handed to expand_expr. */
2132 tree placement, init;
2133 tree type, true_type, size, rval;
2134 tree nelts = NULL_TREE;
2135 tree alloc_expr, alloc_node = NULL_TREE;
2137 enum tree_code code = NEW_EXPR;
2138 int use_cookie, nothrow, check_new;
2140 int use_java_new = 0;
2142 placement = TREE_OPERAND (exp, 0);
2143 type = TREE_OPERAND (exp, 1);
2144 init = TREE_OPERAND (exp, 2);
2145 use_global_new = NEW_EXPR_USE_GLOBAL (exp);
2147 if (TREE_CODE (type) == ARRAY_REF)
2150 nelts = TREE_OPERAND (type, 1);
2151 type = TREE_OPERAND (type, 0);
2155 if (CP_TYPE_QUALS (type))
2156 type = TYPE_MAIN_VARIANT (type);
2158 /* If our base type is an array, then make sure we know how many elements
2160 while (TREE_CODE (true_type) == ARRAY_TYPE)
2162 tree this_nelts = array_type_nelts_top (true_type);
2163 nelts = build_binary_op (MULT_EXPR, nelts, this_nelts);
2164 true_type = TREE_TYPE (true_type);
2167 if (!complete_type_or_else (true_type, exp))
2168 return error_mark_node;
2171 size = fold (build_binary_op (MULT_EXPR, size_in_bytes (true_type),
2174 size = size_in_bytes (type);
2176 if (TREE_CODE (true_type) == VOID_TYPE)
2178 error ("invalid type `void' for new");
2179 return error_mark_node;
2182 if (abstract_virtuals_error (NULL_TREE, true_type))
2183 return error_mark_node;
2185 /* When we allocate an array, and the corresponding deallocation
2186 function takes a second argument of type size_t, and that's the
2187 "usual deallocation function", we allocate some extra space at
2188 the beginning of the array to store the size of the array.
2190 Well, that's what we should do. For backwards compatibility, we
2191 have to do this whenever there's a two-argument array-delete
2194 FIXME: For -fnew-abi, we don't have to maintain backwards
2195 compatibility and we should fix this. */
2196 use_cookie = (has_array && TYPE_VEC_NEW_USES_COOKIE (true_type)
2197 && ! (placement && ! TREE_CHAIN (placement)
2198 && TREE_TYPE (TREE_VALUE (placement)) == ptr_type_node));
2202 tree extra = BI_header_size;
2204 size = size_binop (PLUS_EXPR, size, extra);
2209 code = VEC_NEW_EXPR;
2211 if (init && pedantic)
2212 cp_pedwarn ("initialization in array new");
2215 /* Allocate the object. */
2217 if (! has_array && ! placement && flag_this_is_variable > 0
2218 && TYPE_NEEDS_CONSTRUCTING (true_type) && init != void_type_node)
2220 if (init == NULL_TREE || TREE_CODE (init) == TREE_LIST)
2224 error ("constructors take parameter lists");
2225 return error_mark_node;
2228 else if (! placement && TYPE_FOR_JAVA (true_type))
2230 tree class_addr, alloc_decl;
2231 tree class_decl = build_java_class_ref (true_type);
2232 tree class_size = size_in_bytes (true_type);
2233 static char alloc_name[] = "_Jv_AllocObject";
2235 alloc_decl = IDENTIFIER_GLOBAL_VALUE (get_identifier (alloc_name));
2236 if (alloc_decl == NULL_TREE)
2237 fatal("call to Java constructor, while `%s' undefined", alloc_name);
2238 class_addr = build1 (ADDR_EXPR, jclass_node, class_decl);
2239 rval = build_function_call (alloc_decl,
2240 tree_cons (NULL_TREE, class_addr,
2241 build_tree_list (NULL_TREE,
2243 rval = cp_convert (build_pointer_type (true_type), rval);
2249 if (flag_exceptions)
2250 /* We will use RVAL when generating an exception handler for
2251 this new-expression, so we must save it. */
2252 susp = suspend_momentary ();
2254 rval = build_op_new_call
2255 (code, true_type, tree_cons (NULL_TREE, size, placement),
2256 LOOKUP_NORMAL | (use_global_new * LOOKUP_GLOBAL));
2257 rval = cp_convert (build_pointer_type (true_type), rval);
2259 if (flag_exceptions)
2260 resume_momentary (susp);
2263 /* unless an allocation function is declared with an empty excep-
2264 tion-specification (_except.spec_), throw(), it indicates failure to
2265 allocate storage by throwing a bad_alloc exception (clause _except_,
2266 _lib.bad.alloc_); it returns a non-null pointer otherwise If the allo-
2267 cation function is declared with an empty exception-specification,
2268 throw(), it returns null to indicate failure to allocate storage and a
2269 non-null pointer otherwise.
2271 So check for a null exception spec on the op new we just called. */
2276 /* The CALL_EXPR. */
2277 tree t = TREE_OPERAND (rval, 0);
2279 t = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
2280 nothrow = TYPE_NOTHROW_P (TREE_TYPE (t));
2282 check_new = (flag_check_new || nothrow) && ! use_java_new;
2284 if ((check_new || flag_exceptions) && rval)
2286 alloc_expr = get_target_expr (rval);
2287 alloc_node = rval = TREE_OPERAND (alloc_expr, 0);
2290 alloc_expr = NULL_TREE;
2292 /* if rval is NULL_TREE I don't have to allocate it, but are we totally
2293 sure we have some extra bytes in that case for the BI_header_size
2294 cookies? And how does that interact with the code below? (mrs) */
2295 /* Finish up some magic for new'ed arrays */
2296 if (use_cookie && rval != NULL_TREE)
2298 tree extra = BI_header_size;
2300 rval = convert (string_type_node, rval); /* for ptr arithmetic */
2301 rval = save_expr (build_binary_op (PLUS_EXPR, rval, extra));
2302 /* Store header info. */
2303 cookie = build_indirect_ref (build (MINUS_EXPR,
2304 build_pointer_type (BI_header_type),
2305 rval, extra), NULL_PTR);
2306 exp1 = build (MODIFY_EXPR, void_type_node,
2307 build_component_ref (cookie, nelts_identifier,
2310 TREE_SIDE_EFFECTS (exp1) = 1;
2311 rval = cp_convert (build_pointer_type (true_type), rval);
2312 rval = build_compound_expr
2313 (tree_cons (NULL_TREE, exp1,
2314 build_expr_list (NULL_TREE, rval)));
2317 if (rval == error_mark_node)
2318 return error_mark_node;
2320 /* Don't call any constructors or do any initialization. */
2321 if (init == void_type_node)
2324 if (TYPE_NEEDS_CONSTRUCTING (type) || init)
2326 if (! TYPE_NEEDS_CONSTRUCTING (type)
2327 && ! IS_AGGR_TYPE (type) && ! has_array)
2329 /* We are processing something like `new int (10)', which
2330 means allocate an int, and initialize it with 10. */
2334 /* At present RVAL is a temporary variable, created to hold
2335 the value from the call to `operator new'. We transform
2336 it to (*RVAL = INIT, RVAL). */
2337 rval = save_expr (rval);
2338 deref = build_indirect_ref (rval, NULL_PTR);
2340 /* Even for something like `new const int (10)' we must
2341 allow the expression to be non-const while we do the
2343 deref_type = TREE_TYPE (deref);
2344 if (CP_TYPE_CONST_P (deref_type))
2346 = cp_build_qualified_type (deref_type,
2347 CP_TYPE_QUALS (deref_type)
2348 & ~TYPE_QUAL_CONST);
2349 TREE_READONLY (deref) = 0;
2351 if (TREE_CHAIN (init) != NULL_TREE)
2352 pedwarn ("initializer list being treated as compound expression");
2353 else if (TREE_CODE (init) == CONSTRUCTOR)
2355 pedwarn ("initializer list appears where operand should be used");
2356 init = TREE_OPERAND (init, 1);
2358 init = build_compound_expr (init);
2360 init = convert_for_initialization (deref, type, init, LOOKUP_NORMAL,
2361 "new", NULL_TREE, 0);
2362 rval = build (COMPOUND_EXPR, TREE_TYPE (rval),
2363 build_modify_expr (deref, NOP_EXPR, init),
2365 TREE_NO_UNUSED_WARNING (rval) = 1;
2366 TREE_SIDE_EFFECTS (rval) = 1;
2368 else if (! has_array)
2371 /* Constructors are never virtual. If it has an initialization, we
2372 need to complain if we aren't allowed to use the ctor that took
2374 int flags = LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_COMPLAIN;
2376 if (rval && TYPE_USES_VIRTUAL_BASECLASSES (true_type))
2378 init = tree_cons (NULL_TREE, integer_one_node, init);
2379 flags |= LOOKUP_HAS_IN_CHARGE;
2383 rval = save_expr (rval);
2386 if (newrval && TREE_CODE (TREE_TYPE (newrval)) == POINTER_TYPE)
2387 newrval = build_indirect_ref (newrval, NULL_PTR);
2389 newrval = build_method_call (newrval, ctor_identifier,
2390 init, TYPE_BINFO (true_type), flags);
2392 if (newrval == NULL_TREE || newrval == error_mark_node)
2393 return error_mark_node;
2395 /* Java constructors compiled by jc1 do not return this. */
2397 newrval = build (COMPOUND_EXPR, TREE_TYPE (newrval),
2400 TREE_HAS_CONSTRUCTOR (rval) = 1;
2403 rval = build (VEC_INIT_EXPR, TREE_TYPE (rval),
2404 save_expr (rval), init, nelts);
2406 /* If any part of the object initialization terminates by throwing an
2407 exception and a suitable deallocation function can be found, the
2408 deallocation function is called to free the memory in which the
2409 object was being constructed, after which the exception continues
2410 to propagate in the context of the new-expression. If no
2411 unambiguous matching deallocation function can be found,
2412 propagating the exception does not cause the object's memory to be
2414 if (flag_exceptions && alloc_expr && ! use_java_new)
2416 enum tree_code dcode = has_array ? VEC_DELETE_EXPR : DELETE_EXPR;
2417 tree cleanup, fn = NULL_TREE;
2418 int flags = LOOKUP_NORMAL | (use_global_new * LOOKUP_GLOBAL);
2420 /* All cleanups must last longer than normal. */
2421 int yes = suspend_momentary ();
2423 /* The Standard is unclear here, but the right thing to do
2424 is to use the same method for finding deallocation
2425 functions that we use for finding allocation functions. */
2426 flags |= LOOKUP_SPECULATIVELY;
2428 /* We expect alloc_expr to look like a TARGET_EXPR around
2429 a NOP_EXPR around the CALL_EXPR we want. */
2430 fn = TREE_OPERAND (alloc_expr, 1);
2431 fn = TREE_OPERAND (fn, 0);
2433 cleanup = build_op_delete_call (dcode, alloc_node, size, flags, fn);
2435 resume_momentary (yes);
2437 /* Ack! First we allocate the memory. Then we set our sentry
2438 variable to true, and expand a cleanup that deletes the memory
2439 if sentry is true. Then we run the constructor and store the
2440 returned pointer in buf. Then we clear sentry and return buf. */
2444 tree end, sentry, begin, buf, t = TREE_TYPE (rval);
2446 begin = get_target_expr (boolean_true_node);
2447 sentry = TREE_OPERAND (begin, 0);
2449 yes = suspend_momentary ();
2450 TREE_OPERAND (begin, 2)
2451 = build (COND_EXPR, void_type_node, sentry,
2452 cleanup, void_zero_node);
2453 resume_momentary (yes);
2455 rval = get_target_expr (rval);
2457 end = build (MODIFY_EXPR, TREE_TYPE (sentry),
2458 sentry, boolean_false_node);
2459 TREE_SIDE_EFFECTS (end) = 1;
2461 buf = TREE_OPERAND (rval, 0);
2463 rval = build (COMPOUND_EXPR, t, begin,
2464 build (COMPOUND_EXPR, t, rval,
2465 build (COMPOUND_EXPR, t, end, buf)));
2469 else if (CP_TYPE_CONST_P (true_type))
2470 cp_error ("uninitialized const in `new' of `%#T'", true_type);
2474 if (alloc_expr && rval == alloc_node)
2476 rval = TREE_OPERAND (alloc_expr, 1);
2477 alloc_expr = NULL_TREE;
2480 if (check_new && alloc_expr)
2482 /* Did we modify the storage? */
2483 tree ifexp = build_binary_op (NE_EXPR, alloc_node,
2485 rval = build_conditional_expr (ifexp, rval, alloc_node);
2489 rval = build (COMPOUND_EXPR, TREE_TYPE (rval), alloc_expr, rval);
2491 if (rval && TREE_TYPE (rval) != build_pointer_type (type))
2493 /* The type of new int [3][3] is not int *, but int [3] * */
2494 rval = build_c_cast (build_pointer_type (type), rval);
2501 build_vec_delete_1 (base, maxindex, type, auto_delete_vec, auto_delete,
2503 tree base, maxindex, type;
2504 tree auto_delete_vec, auto_delete;
2505 int use_global_delete;
2508 tree ptype = build_pointer_type (type = complete_type (type));
2509 tree size_exp = size_in_bytes (type);
2511 /* Temporary variables used by the loop. */
2512 tree tbase, tbase_init;
2514 /* This is the body of the loop that implements the deletion of a
2515 single element, and moves temp variables to next elements. */
2518 /* This is the LOOP_EXPR that governs the deletion of the elements. */
2521 /* This is the thing that governs what to do after the loop has run. */
2522 tree deallocate_expr = 0;
2524 /* This is the BIND_EXPR which holds the outermost iterator of the
2525 loop. It is convenient to set this variable up and test it before
2526 executing any other code in the loop.
2527 This is also the containing expression returned by this function. */
2528 tree controller = NULL_TREE;
2530 if (! IS_AGGR_TYPE (type) || ! TYPE_NEEDS_DESTRUCTOR (type))
2532 loop = integer_zero_node;
2536 /* The below is short by BI_header_size */
2537 virtual_size = fold (size_binop (MULT_EXPR, size_exp, maxindex));
2539 tbase = build_decl (VAR_DECL, NULL_TREE, ptype);
2540 tbase_init = build_modify_expr (tbase, NOP_EXPR,
2541 fold (build (PLUS_EXPR, ptype,
2544 DECL_REGISTER (tbase) = 1;
2545 controller = build (BIND_EXPR, void_type_node, tbase, NULL_TREE, NULL_TREE);
2546 TREE_SIDE_EFFECTS (controller) = 1;
2548 if (auto_delete != integer_zero_node
2549 && auto_delete != integer_two_node)
2551 tree base_tbd = cp_convert (ptype,
2552 build_binary_op (MINUS_EXPR,
2553 cp_convert (ptr_type_node, base),
2555 /* This is the real size */
2556 virtual_size = size_binop (PLUS_EXPR, virtual_size, BI_header_size);
2557 body = build_expr_list (NULL_TREE,
2558 build_x_delete (base_tbd,
2559 2 | use_global_delete,
2561 body = build (COND_EXPR, void_type_node,
2562 build (BIT_AND_EXPR, integer_type_node,
2563 auto_delete, integer_one_node),
2564 body, integer_zero_node);
2569 body = tree_cons (NULL_TREE,
2570 build_delete (ptype, tbase, auto_delete,
2571 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1),
2574 body = tree_cons (NULL_TREE,
2575 build_modify_expr (tbase, NOP_EXPR, build (MINUS_EXPR, ptype, tbase, size_exp)),
2578 body = tree_cons (NULL_TREE,
2579 build (EXIT_EXPR, void_type_node,
2580 build (EQ_EXPR, boolean_type_node, base, tbase)),
2583 loop = build (LOOP_EXPR, void_type_node, build_compound_expr (body));
2585 loop = tree_cons (NULL_TREE, tbase_init,
2586 tree_cons (NULL_TREE, loop, NULL_TREE));
2587 loop = build_compound_expr (loop);
2590 /* If the delete flag is one, or anything else with the low bit set,
2591 delete the storage. */
2592 if (auto_delete_vec == integer_zero_node)
2593 deallocate_expr = integer_zero_node;
2598 /* The below is short by BI_header_size */
2599 virtual_size = fold (size_binop (MULT_EXPR, size_exp, maxindex));
2601 if (! TYPE_VEC_NEW_USES_COOKIE (type))
2606 base_tbd = cp_convert (ptype,
2607 build_binary_op (MINUS_EXPR,
2608 cp_convert (string_type_node, base),
2610 /* True size with header. */
2611 virtual_size = size_binop (PLUS_EXPR, virtual_size, BI_header_size);
2613 deallocate_expr = build_x_delete (base_tbd,
2614 2 | use_global_delete,
2616 if (auto_delete_vec != integer_one_node)
2617 deallocate_expr = build (COND_EXPR, void_type_node,
2618 build (BIT_AND_EXPR, integer_type_node,
2619 auto_delete_vec, integer_one_node),
2620 deallocate_expr, integer_zero_node);
2623 if (loop && deallocate_expr != integer_zero_node)
2625 body = tree_cons (NULL_TREE, loop,
2626 tree_cons (NULL_TREE, deallocate_expr, NULL_TREE));
2627 body = build_compound_expr (body);
2632 /* Outermost wrapper: If pointer is null, punt. */
2633 body = build (COND_EXPR, void_type_node,
2634 build (NE_EXPR, boolean_type_node, base, integer_zero_node),
2635 body, integer_zero_node);
2636 body = build1 (NOP_EXPR, void_type_node, body);
2640 TREE_OPERAND (controller, 1) = body;
2644 return cp_convert (void_type_node, body);
2648 create_temporary_var (type)
2653 decl = build_decl (VAR_DECL, NULL_TREE, type);
2654 TREE_USED (decl) = 1;
2655 DECL_ARTIFICIAL (decl) = 1;
2656 DECL_SOURCE_FILE (decl) = input_filename;
2657 DECL_SOURCE_LINE (decl) = lineno;
2658 DECL_IGNORED_P (decl) = 1;
2663 /* Create a new temporary variable of the indicated TYPE, initialized
2666 It is not entered into current_binding_level, because that breaks
2667 things when it comes time to do final cleanups (which take place
2668 "outside" the binding contour of the function). */
2671 get_temp_regvar (type, init)
2676 decl = create_temporary_var (type);
2677 if (building_stmt_tree ())
2678 add_decl_stmt (decl);
2679 DECL_REGISTER (decl) = 1;
2680 if (!building_stmt_tree ())
2681 DECL_RTL (decl) = assign_temp (type, 2, 0, 1);
2682 finish_expr_stmt (build_modify_expr (decl, INIT_EXPR, init));
2687 /* `build_vec_init' returns tree structure that performs
2688 initialization of a vector of aggregate types.
2690 DECL is passed only for error reporting, and provides line number
2691 and source file name information.
2692 BASE is the space where the vector will be. For a vector of Ts,
2693 the type of BASE is `T*'.
2694 MAXINDEX is the maximum index of the array (one less than the
2695 number of elements).
2696 INIT is the (possibly NULL) initializer.
2698 FROM_ARRAY is 0 if we should init everything with INIT
2699 (i.e., every element initialized from INIT).
2700 FROM_ARRAY is 1 if we should index into INIT in parallel
2701 with initialization of DECL.
2702 FROM_ARRAY is 2 if we should index into INIT in parallel,
2703 but use assignment instead of initialization. */
2706 build_vec_init (decl, base, maxindex, init, from_array)
2707 tree decl, base, maxindex, init;
2711 tree base2 = NULL_TREE;
2713 tree itype = NULL_TREE;
2715 /* The type of an element in the array. */
2717 /* The type of a pointer to an element in the array. */
2722 tree try_block = NULL_TREE;
2724 int num_initialized_elts = 0;
2726 maxindex = cp_convert (ptrdiff_type_node, maxindex);
2727 if (maxindex == error_mark_node)
2728 return error_mark_node;
2730 if (current_function_decl == NULL_TREE)
2732 rval = make_tree_vec (3);
2733 TREE_VEC_ELT (rval, 0) = base;
2734 TREE_VEC_ELT (rval, 1) = maxindex;
2735 TREE_VEC_ELT (rval, 2) = init;
2739 type = TREE_TYPE (TREE_TYPE (base));
2740 ptype = build_pointer_type (type);
2741 size = size_in_bytes (type);
2743 /* The code we are generating looks like:
2747 ptrdiff_t iterator = maxindex;
2749 ... initializations from CONSTRUCTOR ...
2750 if (iterator != -1) {
2752 ... initialize *base ...
2754 } while (--iterator != -1);
2757 ... destroy elements that were constructed ...
2760 We can omit the try and catch blocks if we know that the
2761 initialization will never throw an exception, or if the array
2762 elements do not have destructors. If we have a CONSTRUCTOR to
2763 give us initialization information, we emit code to initialize
2764 each of the elements before the loop in the try block, and then
2765 iterate over fewer elements. We can omit the loop completely if
2766 the elements of the array do not have constructors.
2768 We actually wrap the entire body of the above in a STMT_EXPR, for
2771 When copying from array to another, when the array elements have
2772 only trivial copy constructors, we should use __builtin_memcpy
2773 rather than generating a loop. That way, we could take advantage
2774 of whatever cleverness the back-end has for dealing with copies
2775 of blocks of memory. */
2777 begin_init_stmts (&stmt_expr, &compound_stmt);
2778 destroy_temps = stmts_are_full_exprs_p;
2779 stmts_are_full_exprs_p = 0;
2780 rval = get_temp_regvar (ptype,
2781 cp_convert (ptype, default_conversion (base)));
2782 base = get_temp_regvar (ptype, rval);
2783 iterator = get_temp_regvar (ptrdiff_type_node, maxindex);
2785 /* Protect the entire array initialization so that we can destroy
2786 the partially constructed array if an exception is thrown. */
2787 if (flag_exceptions && TYPE_NEEDS_DESTRUCTOR (type))
2789 try_block = begin_try_block ();
2790 try_body = begin_compound_stmt (/*has_no_scope=*/1);
2793 if (init != NULL_TREE && TREE_CODE (init) == CONSTRUCTOR
2794 && (!decl || same_type_p (TREE_TYPE (init), TREE_TYPE (decl))))
2796 /* Do non-default initialization resulting from brace-enclosed
2802 for (elts = CONSTRUCTOR_ELTS (init); elts; elts = TREE_CHAIN (elts))
2804 tree elt = TREE_VALUE (elts);
2805 tree baseref = build1 (INDIRECT_REF, type, base);
2807 num_initialized_elts++;
2809 if (IS_AGGR_TYPE (type) || TREE_CODE (type) == ARRAY_TYPE)
2810 finish_expr_stmt (build_aggr_init (baseref, elt, 0));
2812 finish_expr_stmt (build_modify_expr (baseref, NOP_EXPR,
2815 finish_expr_stmt (build_modify_expr
2818 build (PLUS_EXPR, build_pointer_type (type),
2820 finish_expr_stmt (build_modify_expr
2823 build (MINUS_EXPR, ptrdiff_type_node,
2824 iterator, integer_one_node)));
2827 /* Clear out INIT so that we don't get confused below. */
2830 if (obey_regdecls && !building_stmt_tree ())
2831 use_variable (DECL_RTL (base));
2833 else if (from_array)
2835 /* If initializing one array from another, initialize element by
2836 element. We rely upon the below calls the do argument
2838 if (decl == NULL_TREE)
2840 sorry ("initialization of array from dissimilar array type");
2841 return error_mark_node;
2845 base2 = default_conversion (init);
2846 itype = TREE_TYPE (base2);
2847 base2 = get_temp_regvar (itype, base2);
2848 itype = TREE_TYPE (itype);
2850 else if (TYPE_LANG_SPECIFIC (type)
2851 && TYPE_NEEDS_CONSTRUCTING (type)
2852 && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
2854 error ("initializer ends prematurely");
2855 return error_mark_node;
2859 /* Now, default-initialize any remaining elements. We don't need to
2860 do that if a) the type does not need constructing, or b) we've
2861 already initialized all the elements.
2863 We do need to keep going if we're copying an array. */
2866 || (TYPE_NEEDS_CONSTRUCTING (type)
2867 && !(TREE_CODE (maxindex) == INTEGER_CST
2868 && num_initialized_elts == TREE_INT_CST_LOW (maxindex) + 1)))
2870 /* If the ITERATOR is equal to -1, then we don't have to loop;
2871 we've already initialized all the elements. */
2877 if_stmt = begin_if_stmt ();
2878 finish_if_stmt_cond (build (NE_EXPR, boolean_type_node,
2879 iterator, minus_one_node),
2882 /* Otherwise, loop through the elements. */
2883 do_stmt = begin_do_stmt ();
2884 do_body = begin_compound_stmt (/*has_no_scope=*/1);
2886 /* When we're not building a statement-tree, things are a little
2887 complicated. If, when we recursively call build_aggr_init,
2888 an expression containing a TARGET_EXPR is expanded, then it
2889 may get a cleanup. Then, the result of that expression is
2890 passed to finish_expr_stmt, which will call
2891 expand_start_target_temps/expand_end_target_temps. However,
2892 the latter call will not cause the cleanup to run because
2893 that block will still be on the block stack. So, we call
2894 expand_start_target_temps here manually; the corresponding
2895 call to expand_end_target_temps below will cause the cleanup
2897 if (!building_stmt_tree ())
2898 expand_start_target_temps ();
2902 tree to = build1 (INDIRECT_REF, type, base);
2906 from = build1 (INDIRECT_REF, itype, base2);
2910 if (from_array == 2)
2911 elt_init = build_modify_expr (to, NOP_EXPR, from);
2912 else if (TYPE_NEEDS_CONSTRUCTING (type))
2913 elt_init = build_aggr_init (to, from, 0);
2915 elt_init = build_modify_expr (to, NOP_EXPR, from);
2917 my_friendly_abort (57);
2919 else if (TREE_CODE (type) == ARRAY_TYPE)
2922 sorry ("cannot initialize multi-dimensional array with initializer");
2923 elt_init = (build_vec_init
2926 build_pointer_type (TREE_TYPE (type)),
2928 array_type_nelts (type), 0, 0));
2931 elt_init = build_aggr_init (build1 (INDIRECT_REF, type, base),
2934 /* The initialization of each array element is a
2936 if (!building_stmt_tree ())
2938 finish_expr_stmt (elt_init);
2939 expand_end_target_temps ();
2943 stmts_are_full_exprs_p = 1;
2944 finish_expr_stmt (elt_init);
2945 stmts_are_full_exprs_p = 0;
2948 finish_expr_stmt (build_modify_expr
2951 build (PLUS_EXPR, build_pointer_type (type),
2954 finish_expr_stmt (build_modify_expr
2957 build (PLUS_EXPR, build_pointer_type (type),
2960 if (obey_regdecls && !building_stmt_tree ())
2962 use_variable (DECL_RTL (base));
2964 use_variable (DECL_RTL (base2));
2967 finish_compound_stmt (/*has_no_scope=*/1, do_body);
2968 finish_do_body (do_stmt);
2969 finish_do_stmt (build (NE_EXPR, boolean_type_node,
2970 build (PREDECREMENT_EXPR,
2977 finish_then_clause (if_stmt);
2981 /* Make sure to cleanup any partially constructed elements. */
2982 if (flag_exceptions && TYPE_NEEDS_DESTRUCTOR (type))
2986 finish_compound_stmt (/*has_no_scope=*/1, try_body);
2987 finish_cleanup_try_block (try_block);
2988 e = build_vec_delete_1 (rval,
2989 build_binary_op (MINUS_EXPR, maxindex,
2992 /*auto_delete_vec=*/integer_zero_node,
2993 /*auto_delete=*/integer_zero_node,
2994 /*use_global_delete=*/0);
2995 finish_cleanup (e, try_block);
2998 if (obey_regdecls && !building_stmt_tree ())
3000 use_variable (DECL_RTL (iterator));
3001 use_variable (DECL_RTL (rval));
3004 /* The value of the array initialization is the address of the
3005 first element in the array. */
3006 finish_expr_stmt (rval);
3008 stmt_expr = finish_init_stmts (stmt_expr, compound_stmt);
3009 stmts_are_full_exprs_p = destroy_temps;
3013 /* Free up storage of type TYPE, at address ADDR.
3015 TYPE is a POINTER_TYPE and can be ptr_type_node for no special type
3018 VIRTUAL_SIZE is the amount of storage that was allocated, and is
3019 used as the second argument to operator delete. It can include
3020 things like padding and magic size cookies. It has virtual in it,
3021 because if you have a base pointer and you delete through a virtual
3022 destructor, it should be the size of the dynamic object, not the
3023 static object, see Free Store 12.5 ANSI C++ WP.
3025 This does not call any destructors. */
3028 build_x_delete (addr, which_delete, virtual_size)
3033 int use_global_delete = which_delete & 1;
3034 int use_vec_delete = !!(which_delete & 2);
3035 enum tree_code code = use_vec_delete ? VEC_DELETE_EXPR : DELETE_EXPR;
3036 int flags = LOOKUP_NORMAL | (use_global_delete * LOOKUP_GLOBAL);
3038 return build_op_delete_call (code, addr, virtual_size, flags, NULL_TREE);
3041 /* Generate a call to a destructor. TYPE is the type to cast ADDR to.
3042 ADDR is an expression which yields the store to be destroyed.
3043 AUTO_DELETE is nonzero if a call to DELETE should be made or not.
3044 If in the program, (AUTO_DELETE & 2) is non-zero, we tear down the
3045 virtual baseclasses.
3046 If in the program, (AUTO_DELETE & 1) is non-zero, then we deallocate.
3048 FLAGS is the logical disjunction of zero or more LOOKUP_
3049 flags. See cp-tree.h for more info.
3051 This function does not delete an object's virtual base classes. */
3054 build_delete (type, addr, auto_delete, flags, use_global_delete)
3058 int use_global_delete;
3064 if (addr == error_mark_node)
3065 return error_mark_node;
3067 /* Can happen when CURRENT_EXCEPTION_OBJECT gets its type
3068 set to `error_mark_node' before it gets properly cleaned up. */
3069 if (type == error_mark_node)
3070 return error_mark_node;
3072 type = TYPE_MAIN_VARIANT (type);
3074 if (TREE_CODE (type) == POINTER_TYPE)
3076 type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
3077 if (type != void_type_node && !complete_type_or_else (type, addr))
3078 return error_mark_node;
3079 if (TREE_CODE (type) == ARRAY_TYPE)
3081 if (! IS_AGGR_TYPE (type))
3083 /* Call the builtin operator delete. */
3084 return build_builtin_delete_call (addr);
3086 if (TREE_SIDE_EFFECTS (addr))
3087 addr = save_expr (addr);
3089 /* throw away const and volatile on target type of addr */
3090 addr = convert_force (build_pointer_type (type), addr, 0);
3091 ref = build_indirect_ref (addr, NULL_PTR);
3093 else if (TREE_CODE (type) == ARRAY_TYPE)
3096 if (TREE_SIDE_EFFECTS (addr))
3097 addr = save_expr (addr);
3098 if (TYPE_DOMAIN (type) == NULL_TREE)
3100 error ("unknown array size in delete");
3101 return error_mark_node;
3103 return build_vec_delete (addr, array_type_nelts (type),
3104 auto_delete, integer_zero_node,
3109 /* Don't check PROTECT here; leave that decision to the
3110 destructor. If the destructor is accessible, call it,
3111 else report error. */
3112 addr = build_unary_op (ADDR_EXPR, addr, 0);
3113 if (TREE_SIDE_EFFECTS (addr))
3114 addr = save_expr (addr);
3116 if (TREE_CONSTANT (addr))
3117 addr = convert_pointer_to (type, addr);
3119 addr = convert_force (build_pointer_type (type), addr, 0);
3121 ref = build_indirect_ref (addr, NULL_PTR);
3124 my_friendly_assert (IS_AGGR_TYPE (type), 220);
3126 if (! TYPE_NEEDS_DESTRUCTOR (type))
3128 if (auto_delete == integer_zero_node)
3129 return void_zero_node;
3131 return build_op_delete_call
3132 (DELETE_EXPR, addr, c_sizeof_nowarn (type),
3133 LOOKUP_NORMAL | (use_global_delete * LOOKUP_GLOBAL),
3137 /* Below, we will reverse the order in which these calls are made.
3138 If we have a destructor, then that destructor will take care
3139 of the base classes; otherwise, we must do that here. */
3140 if (TYPE_HAS_DESTRUCTOR (type))
3142 tree passed_auto_delete;
3143 tree do_delete = NULL_TREE;
3146 if (use_global_delete)
3148 tree cond = fold (build (BIT_AND_EXPR, integer_type_node,
3149 auto_delete, integer_one_node));
3150 tree call = build_builtin_delete_call (addr);
3152 cond = fold (build (COND_EXPR, void_type_node, cond,
3153 call, void_zero_node));
3154 if (cond != void_zero_node)
3157 passed_auto_delete = fold (build (BIT_AND_EXPR, integer_type_node,
3158 auto_delete, integer_two_node));
3161 passed_auto_delete = auto_delete;
3163 expr = build_method_call
3164 (ref, dtor_identifier, build_expr_list (NULL_TREE, passed_auto_delete),
3168 expr = build (COMPOUND_EXPR, void_type_node, expr, do_delete);
3170 if (flags & LOOKUP_DESTRUCTOR)
3171 /* Explicit destructor call; don't check for null pointer. */
3172 ifexp = integer_one_node;
3174 /* Handle deleting a null pointer. */
3175 ifexp = fold (build_binary_op (NE_EXPR, addr, integer_zero_node));
3177 if (ifexp != integer_one_node)
3178 expr = build (COND_EXPR, void_type_node,
3179 ifexp, expr, void_zero_node);
3185 /* We only get here from finish_function for a destructor. */
3186 tree binfos = BINFO_BASETYPES (TYPE_BINFO (type));
3187 int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
3188 tree base_binfo = n_baseclasses > 0 ? TREE_VEC_ELT (binfos, 0) : NULL_TREE;
3189 tree exprstmt = NULL_TREE;
3190 tree parent_auto_delete = auto_delete;
3193 /* Set this again before we call anything, as we might get called
3195 TYPE_HAS_DESTRUCTOR (type) = 1;
3197 /* If we have member delete or vbases, we call delete in
3199 if (auto_delete == integer_zero_node)
3201 else if (base_binfo == NULL_TREE
3202 || ! TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo)))
3204 cond = build (COND_EXPR, void_type_node,
3205 build (BIT_AND_EXPR, integer_type_node, auto_delete, integer_one_node),
3206 build_builtin_delete_call (addr),
3213 exprstmt = build_expr_list (NULL_TREE, cond);
3216 && ! TREE_VIA_VIRTUAL (base_binfo)
3217 && TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo)))
3219 tree this_auto_delete;
3221 if (BINFO_OFFSET_ZEROP (base_binfo))
3222 this_auto_delete = parent_auto_delete;
3224 this_auto_delete = integer_zero_node;
3226 expr = build_scoped_method_call
3227 (ref, base_binfo, dtor_identifier,
3228 build_expr_list (NULL_TREE, this_auto_delete));
3229 exprstmt = tree_cons (NULL_TREE, expr, exprstmt);
3232 /* Take care of the remaining baseclasses. */
3233 for (i = 1; i < n_baseclasses; i++)
3235 base_binfo = TREE_VEC_ELT (binfos, i);
3236 if (! TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo))
3237 || TREE_VIA_VIRTUAL (base_binfo))
3240 expr = build_scoped_method_call
3241 (ref, base_binfo, dtor_identifier,
3242 build_expr_list (NULL_TREE, integer_zero_node));
3244 exprstmt = tree_cons (NULL_TREE, expr, exprstmt);
3247 for (member = TYPE_FIELDS (type); member; member = TREE_CHAIN (member))
3249 if (TREE_CODE (member) != FIELD_DECL)
3251 if (TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (member)))
3253 tree this_member = build_component_ref (ref, DECL_NAME (member), NULL_TREE, 0);
3254 tree this_type = TREE_TYPE (member);
3255 expr = build_delete (this_type, this_member, integer_two_node, flags, 0);
3256 exprstmt = tree_cons (NULL_TREE, expr, exprstmt);
3261 return build_compound_expr (exprstmt);
3262 /* Virtual base classes make this function do nothing. */
3263 return void_zero_node;
3267 /* For type TYPE, delete the virtual baseclass objects of DECL. */
3270 build_vbase_delete (type, decl)
3273 tree vbases = CLASSTYPE_VBASECLASSES (type);
3274 tree result = NULL_TREE;
3275 tree addr = build_unary_op (ADDR_EXPR, decl, 0);
3277 my_friendly_assert (addr != error_mark_node, 222);
3281 tree this_addr = convert_force (build_pointer_type (BINFO_TYPE (vbases)),
3283 result = tree_cons (NULL_TREE,
3284 build_delete (TREE_TYPE (this_addr), this_addr,
3286 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 0),
3288 vbases = TREE_CHAIN (vbases);
3290 return build_compound_expr (nreverse (result));
3293 /* Build a C++ vector delete expression.
3294 MAXINDEX is the number of elements to be deleted.
3295 ELT_SIZE is the nominal size of each element in the vector.
3296 BASE is the expression that should yield the store to be deleted.
3297 This function expands (or synthesizes) these calls itself.
3298 AUTO_DELETE_VEC says whether the container (vector) should be deallocated.
3299 AUTO_DELETE say whether each item in the container should be deallocated.
3301 This also calls delete for virtual baseclasses of elements of the vector.
3303 Update: MAXINDEX is no longer needed. The size can be extracted from the
3304 start of the vector for pointers, and from the type for arrays. We still
3305 use MAXINDEX for arrays because it happens to already have one of the
3306 values we'd have to extract. (We could use MAXINDEX with pointers to
3307 confirm the size, and trap if the numbers differ; not clear that it'd
3308 be worth bothering.) */
3311 build_vec_delete (base, maxindex, auto_delete_vec, auto_delete,
3313 tree base, maxindex;
3314 tree auto_delete_vec, auto_delete;
3315 int use_global_delete;
3319 if (TREE_CODE (base) == OFFSET_REF)
3320 base = resolve_offset_ref (base);
3322 type = TREE_TYPE (base);
3324 base = stabilize_reference (base);
3326 /* Since we can use base many times, save_expr it. */
3327 if (TREE_SIDE_EFFECTS (base))
3328 base = save_expr (base);
3330 if (TREE_CODE (type) == POINTER_TYPE)
3332 /* Step back one from start of vector, and read dimension. */
3333 tree cookie_addr = build (MINUS_EXPR, build_pointer_type (BI_header_type),
3334 base, BI_header_size);
3335 tree cookie = build_indirect_ref (cookie_addr, NULL_PTR);
3336 maxindex = build_component_ref (cookie, nelts_identifier, NULL_TREE, 0);
3338 type = TREE_TYPE (type);
3339 while (TREE_CODE (type) == ARRAY_TYPE);
3341 else if (TREE_CODE (type) == ARRAY_TYPE)
3343 /* get the total number of things in the array, maxindex is a bad name */
3344 maxindex = array_type_nelts_total (type);
3345 while (TREE_CODE (type) == ARRAY_TYPE)
3346 type = TREE_TYPE (type);
3347 base = build_unary_op (ADDR_EXPR, base, 1);
3351 if (base != error_mark_node)
3352 error ("type to vector delete is neither pointer or array type");
3353 return error_mark_node;
3356 return build_vec_delete_1 (base, maxindex, type, auto_delete_vec, auto_delete,