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 /* All the implicit try blocks we built up will be zapped
627 when we come to a real binding contour boundary. */
628 return finish_init_stmts (stmt_expr, compound_stmt);
631 /* Check that all fields are properly initialized after
632 an assignment to `this'. Called only when such an assignment
633 is actually noted. */
640 for (member = TYPE_FIELDS (t); member; member = TREE_CHAIN (member))
641 if (DECL_NAME (member) && TREE_USED (member))
642 cp_error ("field `%D' used before initialized (after assignment to `this')",
646 /* This code sets up the virtual function tables appropriate for
647 the pointer DECL. It is a one-ply initialization.
649 BINFO is the exact type that DECL is supposed to be. In
650 multiple inheritance, this might mean "C's A" if C : A, B. */
653 expand_virtual_init (binfo, decl)
656 tree type = BINFO_TYPE (binfo);
658 tree vtype, vtype_binfo;
660 /* This code is crusty. Should be simple, like:
661 vtbl = BINFO_VTABLE (binfo);
663 vtype = DECL_CONTEXT (CLASSTYPE_VFIELD (type));
664 vtype_binfo = get_binfo (vtype, TREE_TYPE (TREE_TYPE (decl)), 0);
665 vtbl = BINFO_VTABLE (binfo_value (DECL_FIELD_CONTEXT (CLASSTYPE_VFIELD (type)), binfo));
666 assemble_external (vtbl);
667 TREE_USED (vtbl) = 1;
668 vtbl = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (vtbl)), vtbl);
669 decl = convert_pointer_to_real (vtype_binfo, decl);
670 vtbl_ptr = build_vfield_ref (build_indirect_ref (decl, NULL_PTR), vtype);
671 if (vtbl_ptr == error_mark_node)
674 /* Have to convert VTBL since array sizes may be different. */
675 vtbl = convert_force (TREE_TYPE (vtbl_ptr), vtbl, 0);
676 finish_expr_stmt (build_modify_expr (vtbl_ptr, NOP_EXPR, vtbl));
679 /* If an exception is thrown in a constructor, those base classes already
680 constructed must be destroyed. This function creates the cleanup
681 for BINFO, which has just been constructed. If FLAG is non-NULL,
682 it is a DECL which is non-zero when this base needs to be
686 expand_cleanup_for_base (binfo, flag)
692 if (!TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (binfo)))
695 /* Call the destructor. */
696 expr = (build_scoped_method_call
697 (current_class_ref, binfo, dtor_identifier,
698 build_expr_list (NULL_TREE, integer_zero_node)));
700 expr = fold (build (COND_EXPR, void_type_node,
701 truthvalue_conversion (flag),
702 expr, integer_zero_node));
704 finish_subobject (expr);
707 /* Subroutine of `expand_aggr_vbase_init'.
708 BINFO is the binfo of the type that is being initialized.
709 INIT_LIST is the list of initializers for the virtual baseclass. */
712 expand_aggr_vbase_init_1 (binfo, exp, addr, init_list)
713 tree binfo, exp, addr, init_list;
715 tree init = purpose_member (binfo, init_list);
716 tree ref = build_indirect_ref (addr, NULL_PTR);
719 init = TREE_VALUE (init);
720 /* Call constructors, but don't set up vtables. */
721 expand_aggr_init_1 (binfo, exp, ref, init, LOOKUP_COMPLAIN);
724 /* Construct the virtual base-classes of THIS_REF (whose address is
725 THIS_PTR). The object has the indicated TYPE. The construction
726 actually takes place only if FLAG is non-zero. INIT_LIST is list
727 of initialization for constructor to perform. */
730 construct_virtual_bases (type, this_ref, this_ptr, init_list, flag)
741 /* If there are no virtual baseclasses, we shouldn't even be here. */
742 my_friendly_assert (TYPE_USES_VIRTUAL_BASECLASSES (type), 19990621);
744 /* First set the pointers in our object that tell us where to find
745 our virtual baseclasses. */
746 if_stmt = begin_if_stmt ();
747 finish_if_stmt_cond (flag, if_stmt);
748 result = init_vbase_pointers (type, this_ptr);
750 finish_expr_stmt (build_compound_expr (result));
751 finish_then_clause (if_stmt);
754 /* Now, run through the baseclasses, initializing each. */
755 for (vbases = CLASSTYPE_VBASECLASSES (type); vbases;
756 vbases = TREE_CHAIN (vbases))
758 tree tmp = purpose_member (vbases, result);
762 /* If there are virtual base classes with destructors, we need to
763 emit cleanups to destroy them if an exception is thrown during
764 the construction process. These exception regions (i.e., the
765 period during which the cleanups must occur) begin from the time
766 the construction is complete to the end of the function. If we
767 create a conditional block in which to initialize the
768 base-classes, then the cleanup region for the virtual base begins
769 inside a block, and ends outside of that block. This situation
770 confuses the sjlj exception-handling code. Therefore, we do not
771 create a single conditional block, but one for each
772 initialization. (That way the cleanup regions always begin
773 in the outer block.) We trust the back-end to figure out
774 that the FLAG will not change across initializations, and
775 avoid doing multiple tests. */
776 inner_if_stmt = begin_if_stmt ();
777 finish_if_stmt_cond (flag, inner_if_stmt);
778 compound_stmt = begin_compound_stmt (/*has_no_scope=*/1);
779 expand_aggr_vbase_init_1 (vbases, this_ref,
780 TREE_OPERAND (TREE_VALUE (tmp), 0),
782 finish_compound_stmt (/*has_no_scope=*/1, compound_stmt);
783 finish_then_clause (inner_if_stmt);
786 expand_cleanup_for_base (vbases, flag);
790 /* Find the context in which this FIELD can be initialized. */
793 initializing_context (field)
796 tree t = DECL_CONTEXT (field);
798 /* Anonymous union members can be initialized in the first enclosing
799 non-anonymous union context. */
800 while (t && ANON_AGGR_TYPE_P (t))
801 t = TYPE_CONTEXT (t);
805 /* Function to give error message if member initialization specification
806 is erroneous. FIELD is the member we decided to initialize.
807 TYPE is the type for which the initialization is being performed.
808 FIELD must be a member of TYPE.
810 MEMBER_NAME is the name of the member. */
813 member_init_ok_or_else (field, type, member_name)
816 const char *member_name;
818 if (field == error_mark_node)
820 if (field == NULL_TREE || initializing_context (field) != type)
822 cp_error ("class `%T' does not have any field named `%s'", type,
826 if (TREE_STATIC (field))
828 cp_error ("field `%#D' is static; only point of initialization is its declaration",
836 /* If NAME is a viable field name for the aggregate DECL,
837 and PARMS is a viable parameter list, then expand an _EXPR
838 which describes this initialization.
840 Note that we do not need to chase through the class's base classes
841 to look for NAME, because if it's in that list, it will be handled
842 by the constructor for that base class.
844 We do not yet have a fixed-point finder to instantiate types
845 being fed to overloaded constructors. If there is a unique
846 constructor, then argument types can be got from that one.
848 If INIT is non-NULL, then it the initialization should
849 be placed in `current_base_init_list', where it will be processed
850 by `emit_base_init'. */
853 expand_member_init (exp, name, init)
854 tree exp, name, init;
856 tree basetype = NULL_TREE, field;
859 if (exp == NULL_TREE)
860 return; /* complain about this later */
862 type = TYPE_MAIN_VARIANT (TREE_TYPE (exp));
864 if (name && TREE_CODE (name) == TYPE_DECL)
866 basetype = TYPE_MAIN_VARIANT (TREE_TYPE (name));
867 name = DECL_NAME (name);
870 if (name == NULL_TREE && IS_AGGR_TYPE (type))
871 switch (CLASSTYPE_N_BASECLASSES (type))
874 error ("base class initializer specified, but no base class to initialize");
877 basetype = TYPE_BINFO_BASETYPE (type, 0);
880 error ("initializer for unnamed base class ambiguous");
881 cp_error ("(type `%T' uses multiple inheritance)", type);
885 my_friendly_assert (init != NULL_TREE, 0);
887 /* The grammar should not allow fields which have names that are
888 TYPENAMEs. Therefore, if the field has a non-NULL TREE_TYPE, we
889 may assume that this is an attempt to initialize a base class
890 member of the current type. Otherwise, it is an attempt to
891 initialize a member field. */
893 if (init == void_type_node)
896 if (name == NULL_TREE || basetype)
900 if (name == NULL_TREE)
904 name = TYPE_IDENTIFIER (basetype);
907 error ("no base class to initialize");
912 else if (basetype != type
913 && ! current_template_parms
914 && ! vec_binfo_member (basetype,
915 TYPE_BINFO_BASETYPES (type))
916 && ! binfo_member (basetype, CLASSTYPE_VBASECLASSES (type)))
918 if (IDENTIFIER_CLASS_VALUE (name))
920 if (TYPE_USES_VIRTUAL_BASECLASSES (type))
921 cp_error ("type `%T' is not an immediate or virtual basetype for `%T'",
924 cp_error ("type `%T' is not an immediate basetype for `%T'",
929 if (purpose_member (basetype, current_base_init_list))
931 cp_error ("base class `%T' already initialized", basetype);
935 if (warn_reorder && current_member_init_list)
937 cp_warning ("base initializer for `%T'", basetype);
938 warning (" will be re-ordered to precede member initializations");
941 base_init = build_tree_list (basetype, init);
942 current_base_init_list = chainon (current_base_init_list, base_init);
949 field = lookup_field (type, name, 1, 0);
951 if (! member_init_ok_or_else (field, type, IDENTIFIER_POINTER (name)))
954 if (purpose_member (name, current_member_init_list))
956 cp_error ("field `%D' already initialized", field);
960 member_init = build_tree_list (name, init);
961 current_member_init_list = chainon (current_member_init_list, member_init);
965 /* We are about to generate some complex initialization code.
966 Conceptually, it is all a single expression. However, we may want
967 to include conditionals, loops, and other such statement-level
968 constructs. Therefore, we build the initialization code inside a
969 statement-expression. This function starts such an expression.
970 STMT_EXPR_P and COMPOUND_STMT_P are filled in by this function;
971 pass them back to finish_init_stmts when the expression is
975 begin_init_stmts (stmt_expr_p, compound_stmt_p)
977 tree *compound_stmt_p;
980 *stmt_expr_p = begin_stmt_expr ();
981 *compound_stmt_p = begin_compound_stmt (/*has_no_scope=*/1);
984 /* Finish out the statement-expression begun by the previous call to
985 begin_init_stmts. Returns the statement-expression itself. */
988 finish_init_stmts (stmt_expr, compound_stmt)
994 = finish_stmt_expr (stmt_expr,
995 finish_compound_stmt (/*has_no_scope=*/1,
998 /* To avoid spurious warnings about unused values, we set
1001 TREE_USED (stmt_expr) = 1;
1006 /* This is like `expand_member_init', only it stores one aggregate
1009 INIT comes in two flavors: it is either a value which
1010 is to be stored in EXP, or it is a parameter list
1011 to go to a constructor, which will operate on EXP.
1012 If INIT is not a parameter list for a constructor, then set
1013 LOOKUP_ONLYCONVERTING.
1014 If FLAGS is LOOKUP_ONLYCONVERTING then it is the = init form of
1015 the initializer, if FLAGS is 0, then it is the (init) form.
1016 If `init' is a CONSTRUCTOR, then we emit a warning message,
1017 explaining that such initializations are invalid.
1019 ALIAS_THIS is nonzero iff we are initializing something which is
1020 essentially an alias for current_class_ref. In this case, the base
1021 constructor may move it on us, and we must keep track of such
1024 If INIT resolves to a CALL_EXPR which happens to return
1025 something of the type we are looking for, then we know
1026 that we can safely use that call to perform the
1029 The virtual function table pointer cannot be set up here, because
1030 we do not really know its type.
1032 Virtual baseclass pointers are also set up here.
1034 This never calls operator=().
1036 When initializing, nothing is CONST.
1038 A default copy constructor may have to be used to perform the
1041 A constructor or a conversion operator may have to be used to
1042 perform the initialization, but not both, as it would be ambiguous. */
1045 build_aggr_init (exp, init, flags)
1052 tree type = TREE_TYPE (exp);
1053 int was_const = TREE_READONLY (exp);
1054 int was_volatile = TREE_THIS_VOLATILE (exp);
1056 if (init == error_mark_node)
1057 return error_mark_node;
1059 TREE_READONLY (exp) = 0;
1060 TREE_THIS_VOLATILE (exp) = 0;
1062 if (init && TREE_CODE (init) != TREE_LIST)
1063 flags |= LOOKUP_ONLYCONVERTING;
1065 if (TREE_CODE (type) == ARRAY_TYPE)
1067 /* Must arrange to initialize each element of EXP
1068 from elements of INIT. */
1069 tree itype = init ? TREE_TYPE (init) : NULL_TREE;
1070 if (CP_TYPE_QUALS (type) != TYPE_UNQUALIFIED)
1072 TREE_TYPE (exp) = TYPE_MAIN_VARIANT (type);
1074 TREE_TYPE (init) = TYPE_MAIN_VARIANT (itype);
1076 if (init && TREE_TYPE (init) == NULL_TREE)
1078 /* Handle bad initializers like:
1082 COMPLEX(double r = 0.0, double i = 0.0) {re = r; im = i;};
1086 int main(int argc, char **argv) {
1087 COMPLEX zees(1.0, 0.0)[10];
1090 error ("bad array initializer");
1091 return error_mark_node;
1093 stmt_expr = build_vec_init (exp, exp, array_type_nelts (type), init,
1094 init && same_type_p (TREE_TYPE (init),
1096 TREE_READONLY (exp) = was_const;
1097 TREE_THIS_VOLATILE (exp) = was_volatile;
1098 TREE_TYPE (exp) = type;
1100 TREE_TYPE (init) = itype;
1104 if (TREE_CODE (exp) == VAR_DECL || TREE_CODE (exp) == PARM_DECL)
1105 /* just know that we've seen something for this node */
1106 TREE_USED (exp) = 1;
1108 TREE_TYPE (exp) = TYPE_MAIN_VARIANT (type);
1109 begin_init_stmts (&stmt_expr, &compound_stmt);
1110 destroy_temps = stmts_are_full_exprs_p;
1111 stmts_are_full_exprs_p = 0;
1112 expand_aggr_init_1 (TYPE_BINFO (type), exp, exp,
1113 init, LOOKUP_NORMAL|flags);
1114 stmt_expr = finish_init_stmts (stmt_expr, compound_stmt);
1115 stmts_are_full_exprs_p = destroy_temps;
1116 TREE_TYPE (exp) = type;
1117 TREE_READONLY (exp) = was_const;
1118 TREE_THIS_VOLATILE (exp) = was_volatile;
1124 expand_default_init (binfo, true_exp, exp, init, flags)
1130 tree type = TREE_TYPE (exp);
1132 /* It fails because there may not be a constructor which takes
1133 its own type as the first (or only parameter), but which does
1134 take other types via a conversion. So, if the thing initializing
1135 the expression is a unit element of type X, first try X(X&),
1136 followed by initialization by X. If neither of these work
1137 out, then look hard. */
1141 if (init && TREE_CODE (init) != TREE_LIST
1142 && (flags & LOOKUP_ONLYCONVERTING))
1144 /* Base subobjects should only get direct-initialization. */
1145 if (true_exp != exp)
1148 if (flags & DIRECT_BIND)
1149 /* Do nothing. We hit this in two cases: Reference initialization,
1150 where we aren't initializing a real variable, so we don't want
1151 to run a new constructor; and catching an exception, where we
1152 have already built up the constructor call so we could wrap it
1153 in an exception region. */;
1154 else if (TREE_CODE (init) == CONSTRUCTOR)
1155 /* A brace-enclosed initializer has whatever type is
1156 required. There's no need to convert it. */
1159 init = ocp_convert (type, init, CONV_IMPLICIT|CONV_FORCE_TEMP, flags);
1161 if (TREE_CODE (init) == TRY_CATCH_EXPR)
1162 /* We need to protect the initialization of a catch parm
1163 with a call to terminate(), which shows up as a TRY_CATCH_EXPR
1164 around the TARGET_EXPR for the copy constructor. See
1165 expand_start_catch_block. */
1166 TREE_OPERAND (init, 0) = build (INIT_EXPR, TREE_TYPE (exp), exp,
1167 TREE_OPERAND (init, 0));
1169 init = build (INIT_EXPR, TREE_TYPE (exp), exp, init);
1170 TREE_SIDE_EFFECTS (init) = 1;
1171 finish_expr_stmt (init);
1175 if (init == NULL_TREE
1176 || (TREE_CODE (init) == TREE_LIST && ! TREE_TYPE (init)))
1180 init = TREE_VALUE (parms);
1183 parms = build_expr_list (NULL_TREE, init);
1185 if (TYPE_USES_VIRTUAL_BASECLASSES (type))
1187 if (true_exp == exp)
1188 parms = tree_cons (NULL_TREE, integer_one_node, parms);
1190 parms = tree_cons (NULL_TREE, integer_zero_node, parms);
1191 flags |= LOOKUP_HAS_IN_CHARGE;
1194 rval = build_method_call (exp, ctor_identifier,
1195 parms, binfo, flags);
1196 if (TREE_SIDE_EFFECTS (rval))
1197 finish_expr_stmt (rval);
1200 /* This function is responsible for initializing EXP with INIT
1203 BINFO is the binfo of the type for who we are performing the
1204 initialization. For example, if W is a virtual base class of A and B,
1206 If we are initializing B, then W must contain B's W vtable, whereas
1207 were we initializing C, W must contain C's W vtable.
1209 TRUE_EXP is nonzero if it is the true expression being initialized.
1210 In this case, it may be EXP, or may just contain EXP. The reason we
1211 need this is because if EXP is a base element of TRUE_EXP, we
1212 don't necessarily know by looking at EXP where its virtual
1213 baseclass fields should really be pointing. But we do know
1214 from TRUE_EXP. In constructors, we don't know anything about
1215 the value being initialized.
1217 ALIAS_THIS serves the same purpose it serves for expand_aggr_init.
1219 FLAGS is just passes to `build_method_call'. See that function for
1223 expand_aggr_init_1 (binfo, true_exp, exp, init, flags)
1229 tree type = TREE_TYPE (exp);
1231 my_friendly_assert (init != error_mark_node && type != error_mark_node, 211);
1233 /* Use a function returning the desired type to initialize EXP for us.
1234 If the function is a constructor, and its first argument is
1235 NULL_TREE, know that it was meant for us--just slide exp on
1236 in and expand the constructor. Constructors now come
1239 if (init && TREE_CODE (exp) == VAR_DECL
1240 && TREE_CODE (init) == CONSTRUCTOR
1241 && TREE_HAS_CONSTRUCTOR (init))
1243 /* If store_init_value returns NULL_TREE, the INIT has been
1244 record in the DECL_INITIAL for EXP. That means there's
1245 nothing more we have to do. */
1246 if (!store_init_value (exp, init))
1248 if (!building_stmt_tree ())
1249 expand_decl_init (exp);
1253 tree t = build (INIT_EXPR, type, exp, init);
1254 TREE_SIDE_EFFECTS (t) = 1;
1255 finish_expr_stmt (t);
1260 /* We know that expand_default_init can handle everything we want
1262 expand_default_init (binfo, true_exp, exp, init, flags);
1265 /* Report an error if NAME is not the name of a user-defined,
1266 aggregate type. If OR_ELSE is nonzero, give an error message. */
1269 is_aggr_typedef (name, or_else)
1275 if (name == error_mark_node)
1278 if (IDENTIFIER_HAS_TYPE_VALUE (name))
1279 type = IDENTIFIER_TYPE_VALUE (name);
1283 cp_error ("`%T' is not an aggregate typedef", name);
1287 if (! IS_AGGR_TYPE (type)
1288 && TREE_CODE (type) != TEMPLATE_TYPE_PARM
1289 && TREE_CODE (type) != TEMPLATE_TEMPLATE_PARM)
1292 cp_error ("`%T' is not an aggregate type", type);
1298 /* Report an error if TYPE is not a user-defined, aggregate type. If
1299 OR_ELSE is nonzero, give an error message. */
1302 is_aggr_type (type, or_else)
1306 if (type == error_mark_node)
1309 if (! IS_AGGR_TYPE (type)
1310 && TREE_CODE (type) != TEMPLATE_TYPE_PARM
1311 && TREE_CODE (type) != TEMPLATE_TEMPLATE_PARM)
1314 cp_error ("`%T' is not an aggregate type", type);
1320 /* Like is_aggr_typedef, but returns typedef if successful. */
1323 get_aggr_from_typedef (name, or_else)
1329 if (name == error_mark_node)
1332 if (IDENTIFIER_HAS_TYPE_VALUE (name))
1333 type = IDENTIFIER_TYPE_VALUE (name);
1337 cp_error ("`%T' fails to be an aggregate typedef", name);
1341 if (! IS_AGGR_TYPE (type)
1342 && TREE_CODE (type) != TEMPLATE_TYPE_PARM
1343 && TREE_CODE (type) != TEMPLATE_TEMPLATE_PARM)
1346 cp_error ("type `%T' is of non-aggregate type", type);
1353 get_type_value (name)
1356 if (name == error_mark_node)
1359 if (IDENTIFIER_HAS_TYPE_VALUE (name))
1360 return IDENTIFIER_TYPE_VALUE (name);
1366 /* This code could just as well go in `class.c', but is placed here for
1369 /* For an expression of the form TYPE :: NAME (PARMLIST), build
1370 the appropriate function call. */
1373 build_member_call (type, name, parmlist)
1374 tree type, name, parmlist;
1379 tree basetype_path, decl;
1381 if (TREE_CODE (name) == TEMPLATE_ID_EXPR
1382 && TREE_CODE (type) == NAMESPACE_DECL)
1384 /* 'name' already refers to the decls from the namespace, since we
1385 hit do_identifier for template_ids. */
1386 method_name = TREE_OPERAND (name, 0);
1387 /* FIXME: Since we don't do independent names right yet, the
1388 name might also be a LOOKUP_EXPR. Once we resolve this to a
1389 real decl earlier, this can go. This may happen during
1391 if (TREE_CODE (method_name) == LOOKUP_EXPR)
1393 method_name = lookup_namespace_name
1394 (type, TREE_OPERAND (method_name, 0));
1395 TREE_OPERAND (name, 0) = method_name;
1397 my_friendly_assert (is_overloaded_fn (method_name), 980519);
1398 return build_x_function_call (name, parmlist, current_class_ref);
1401 if (type == std_node)
1402 return build_x_function_call (do_scoped_id (name, 0), parmlist,
1404 if (TREE_CODE (type) == NAMESPACE_DECL)
1405 return build_x_function_call (lookup_namespace_name (type, name),
1406 parmlist, current_class_ref);
1408 if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
1410 method_name = TREE_OPERAND (name, 0);
1411 if (TREE_CODE (method_name) == COMPONENT_REF)
1412 method_name = TREE_OPERAND (method_name, 1);
1413 if (is_overloaded_fn (method_name))
1414 method_name = DECL_NAME (OVL_CURRENT (method_name));
1415 TREE_OPERAND (name, 0) = method_name;
1420 if (TREE_CODE (method_name) == BIT_NOT_EXPR)
1422 method_name = TREE_OPERAND (method_name, 0);
1426 /* This shouldn't be here, and build_member_call shouldn't appear in
1428 if (type && TREE_CODE (type) == IDENTIFIER_NODE
1429 && get_aggr_from_typedef (type, 0) == 0)
1431 tree ns = lookup_name (type, 0);
1432 if (ns && TREE_CODE (ns) == NAMESPACE_DECL)
1434 return build_x_function_call (build_offset_ref (type, name), parmlist, current_class_ref);
1438 if (type == NULL_TREE || ! is_aggr_type (type, 1))
1439 return error_mark_node;
1441 /* An operator we did not like. */
1442 if (name == NULL_TREE)
1443 return error_mark_node;
1447 cp_error ("cannot call destructor `%T::~%T' without object", type,
1449 return error_mark_node;
1452 decl = maybe_dummy_object (type, &basetype_path);
1454 /* Convert 'this' to the specified type to disambiguate conversion
1455 to the function's context. Apparently Standard C++ says that we
1456 shouldn't do this. */
1457 if (decl == current_class_ref
1459 && ACCESSIBLY_UNIQUELY_DERIVED_P (type, current_class_type))
1461 tree olddecl = current_class_ptr;
1462 tree oldtype = TREE_TYPE (TREE_TYPE (olddecl));
1463 if (oldtype != type)
1465 tree newtype = build_qualified_type (type, TYPE_QUALS (oldtype));
1466 decl = convert_force (build_pointer_type (newtype), olddecl, 0);
1467 decl = build_indirect_ref (decl, NULL_PTR);
1471 if (method_name == constructor_name (type)
1472 || method_name == constructor_name_full (type))
1473 return build_functional_cast (type, parmlist);
1474 if (lookup_fnfields (basetype_path, method_name, 0))
1475 return build_method_call (decl,
1476 TREE_CODE (name) == TEMPLATE_ID_EXPR
1477 ? name : method_name,
1478 parmlist, basetype_path,
1479 LOOKUP_NORMAL|LOOKUP_NONVIRTUAL);
1480 if (TREE_CODE (name) == IDENTIFIER_NODE
1481 && ((t = lookup_field (TYPE_BINFO (type), name, 1, 0))))
1483 if (t == error_mark_node)
1484 return error_mark_node;
1485 if (TREE_CODE (t) == FIELD_DECL)
1487 if (is_dummy_object (decl))
1489 cp_error ("invalid use of non-static field `%D'", t);
1490 return error_mark_node;
1492 decl = build (COMPONENT_REF, TREE_TYPE (t), decl, t);
1494 else if (TREE_CODE (t) == VAR_DECL)
1498 cp_error ("invalid use of member `%D'", t);
1499 return error_mark_node;
1501 if (TYPE_LANG_SPECIFIC (TREE_TYPE (decl)))
1502 return build_opfncall (CALL_EXPR, LOOKUP_NORMAL, decl,
1503 parmlist, NULL_TREE);
1504 return build_function_call (decl, parmlist);
1508 cp_error ("no method `%T::%D'", type, name);
1509 return error_mark_node;
1513 /* Build a reference to a member of an aggregate. This is not a
1514 C++ `&', but really something which can have its address taken,
1515 and then act as a pointer to member, for example TYPE :: FIELD
1516 can have its address taken by saying & TYPE :: FIELD.
1518 @@ Prints out lousy diagnostics for operator <typename>
1521 @@ This function should be rewritten and placed in search.c. */
1524 build_offset_ref (type, name)
1527 tree decl, t = error_mark_node;
1529 tree basebinfo = NULL_TREE;
1530 tree orig_name = name;
1532 /* class templates can come in as TEMPLATE_DECLs here. */
1533 if (TREE_CODE (name) == TEMPLATE_DECL)
1536 if (type == std_node)
1537 return do_scoped_id (name, 0);
1539 if (processing_template_decl || uses_template_parms (type))
1540 return build_min_nt (SCOPE_REF, type, name);
1542 /* Handle namespace names fully here. */
1543 if (TREE_CODE (type) == NAMESPACE_DECL)
1545 t = lookup_namespace_name (type, name);
1546 if (t != error_mark_node && ! type_unknown_p (t))
1549 t = convert_from_reference (t);
1554 if (type == NULL_TREE || ! is_aggr_type (type, 1))
1555 return error_mark_node;
1557 if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
1559 /* If the NAME is a TEMPLATE_ID_EXPR, we are looking at
1560 something like `a.template f<int>' or the like. For the most
1561 part, we treat this just like a.f. We do remember, however,
1562 the template-id that was used. */
1563 name = TREE_OPERAND (orig_name, 0);
1565 if (TREE_CODE (name) == LOOKUP_EXPR)
1566 /* This can happen during tsubst'ing. */
1567 name = TREE_OPERAND (name, 0);
1569 my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 0);
1572 if (TREE_CODE (name) == BIT_NOT_EXPR)
1574 if (! check_dtor_name (type, name))
1575 cp_error ("qualified type `%T' does not match destructor name `~%T'",
1576 type, TREE_OPERAND (name, 0));
1577 name = dtor_identifier;
1580 /* I think this is wrong, but the draft is unclear. --jason 6/15/98 */
1581 else if (name == constructor_name_full (type)
1582 || name == constructor_name (type))
1583 name = ctor_identifier;
1586 if (TYPE_SIZE (complete_type (type)) == 0
1587 && !TYPE_BEING_DEFINED (type))
1589 cp_error ("incomplete type `%T' does not have member `%D'", type,
1591 return error_mark_node;
1594 decl = maybe_dummy_object (type, &basebinfo);
1596 member = lookup_member (basebinfo, name, 1, 0);
1598 if (member == error_mark_node)
1599 return error_mark_node;
1601 /* A lot of this logic is now handled in lookup_field and
1603 if (member && BASELINK_P (member))
1605 /* Go from the TREE_BASELINK to the member function info. */
1606 tree fnfields = member;
1607 t = TREE_VALUE (fnfields);
1609 if (TREE_CODE (orig_name) == TEMPLATE_ID_EXPR)
1611 /* The FNFIELDS are going to contain functions that aren't
1612 necessarily templates, and templates that don't
1613 necessarily match the explicit template parameters. We
1614 save all the functions, and the explicit parameters, and
1615 then figure out exactly what to instantiate with what
1616 arguments in instantiate_type. */
1618 if (TREE_CODE (t) != OVERLOAD)
1619 /* The code in instantiate_type which will process this
1620 expects to encounter OVERLOADs, not raw functions. */
1621 t = ovl_cons (t, NULL_TREE);
1623 return build (OFFSET_REF,
1626 build (TEMPLATE_ID_EXPR,
1629 TREE_OPERAND (orig_name, 1)));
1632 if (!really_overloaded_fn (t))
1634 /* Get rid of a potential OVERLOAD around it */
1635 t = OVL_CURRENT (t);
1637 /* unique functions are handled easily. */
1638 basebinfo = TREE_PURPOSE (fnfields);
1639 if (!enforce_access (basebinfo, t))
1640 return error_mark_node;
1642 if (DECL_STATIC_FUNCTION_P (t))
1644 return build (OFFSET_REF, TREE_TYPE (t), decl, t);
1647 TREE_TYPE (fnfields) = unknown_type_node;
1648 return build (OFFSET_REF, unknown_type_node, decl, fnfields);
1655 cp_error ("`%D' is not a member of type `%T'", name, type);
1656 return error_mark_node;
1659 if (TREE_CODE (t) == TYPE_DECL)
1664 /* static class members and class-specific enum
1665 values can be returned without further ado. */
1666 if (TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == CONST_DECL)
1669 return convert_from_reference (t);
1672 if (TREE_CODE (t) == FIELD_DECL && DECL_C_BIT_FIELD (t))
1674 cp_error ("illegal pointer to bit field `%D'", t);
1675 return error_mark_node;
1678 /* static class functions too. */
1679 if (TREE_CODE (t) == FUNCTION_DECL
1680 && TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
1681 my_friendly_abort (53);
1683 /* In member functions, the form `type::name' is no longer
1684 equivalent to `this->type::name', at least not until
1685 resolve_offset_ref. */
1686 return build (OFFSET_REF, build_offset_type (type, TREE_TYPE (t)), decl, t);
1689 /* If a OFFSET_REF made it through to here, then it did
1690 not have its address taken. */
1693 resolve_offset_ref (exp)
1696 tree type = TREE_TYPE (exp);
1697 tree base = NULL_TREE;
1699 tree basetype, addr;
1701 if (TREE_CODE (exp) == OFFSET_REF)
1703 member = TREE_OPERAND (exp, 1);
1704 base = TREE_OPERAND (exp, 0);
1708 my_friendly_assert (TREE_CODE (type) == OFFSET_TYPE, 214);
1709 if (TYPE_OFFSET_BASETYPE (type) != current_class_type)
1711 error ("object missing in use of pointer-to-member construct");
1712 return error_mark_node;
1715 type = TREE_TYPE (type);
1716 base = current_class_ref;
1719 if (BASELINK_P (member))
1721 if (! flag_ms_extensions)
1722 cp_pedwarn ("assuming & on overloaded member function");
1723 return build_unary_op (ADDR_EXPR, exp, 0);
1726 if (TREE_CODE (TREE_TYPE (member)) == METHOD_TYPE)
1728 if (! flag_ms_extensions)
1729 cp_pedwarn ("assuming & on `%E'", member);
1730 return build_unary_op (ADDR_EXPR, exp, 0);
1733 if ((TREE_CODE (member) == VAR_DECL
1734 && ! TYPE_PTRMEMFUNC_P (TREE_TYPE (member))
1735 && ! TYPE_PTRMEM_P (TREE_TYPE (member)))
1736 || TREE_CODE (TREE_TYPE (member)) == FUNCTION_TYPE)
1738 /* These were static members. */
1739 if (mark_addressable (member) == 0)
1740 return error_mark_node;
1744 if (TREE_CODE (TREE_TYPE (member)) == POINTER_TYPE
1745 && TREE_CODE (TREE_TYPE (TREE_TYPE (member))) == METHOD_TYPE)
1748 /* Syntax error can cause a member which should
1749 have been seen as static to be grok'd as non-static. */
1750 if (TREE_CODE (member) == FIELD_DECL && current_class_ref == NULL_TREE)
1752 if (TREE_ADDRESSABLE (member) == 0)
1754 cp_error_at ("member `%D' is non-static but referenced as a static member",
1756 error ("at this point in file");
1757 TREE_ADDRESSABLE (member) = 1;
1759 return error_mark_node;
1762 /* The first case is really just a reference to a member of `this'. */
1763 if (TREE_CODE (member) == FIELD_DECL
1764 && (base == current_class_ref || is_dummy_object (base)))
1769 if (TREE_CODE (exp) == OFFSET_REF && TREE_CODE (type) == OFFSET_TYPE)
1770 basetype = TYPE_OFFSET_BASETYPE (type);
1772 basetype = DECL_CONTEXT (member);
1774 base = current_class_ptr;
1776 if (get_base_distance (basetype, TREE_TYPE (TREE_TYPE (base)), 0, &basetype_path) < 0)
1778 error_not_base_type (basetype, TREE_TYPE (TREE_TYPE (base)));
1779 return error_mark_node;
1781 /* Kludge: we need to use basetype_path now, because
1782 convert_pointer_to will bash it. */
1783 enforce_access (basetype_path, member);
1784 addr = convert_pointer_to (basetype, base);
1786 /* Even in the case of illegal access, we form the
1787 COMPONENT_REF; that will allow better error recovery than
1788 just feeding back error_mark_node. */
1789 expr = build (COMPONENT_REF, TREE_TYPE (member),
1790 build_indirect_ref (addr, NULL_PTR), member);
1791 return convert_from_reference (expr);
1794 /* Ensure that we have an object. */
1795 if (is_dummy_object (base))
1796 addr = error_mark_node;
1798 /* If this is a reference to a member function, then return the
1799 address of the member function (which may involve going
1800 through the object's vtable), otherwise, return an expression
1801 for the dereferenced pointer-to-member construct. */
1802 addr = build_unary_op (ADDR_EXPR, base, 0);
1804 if (TYPE_PTRMEM_P (TREE_TYPE (member)))
1806 if (addr == error_mark_node)
1808 cp_error ("object missing in `%E'", exp);
1809 return error_mark_node;
1812 basetype = TYPE_OFFSET_BASETYPE (TREE_TYPE (TREE_TYPE (member)));
1813 addr = convert_pointer_to (basetype, addr);
1814 member = cp_convert (ptrdiff_type_node, member);
1816 /* Pointer to data members are offset by one, so that a null
1817 pointer with a real value of 0 is distinguishable from an
1818 offset of the first member of a structure. */
1819 member = build_binary_op (MINUS_EXPR, member,
1820 cp_convert (ptrdiff_type_node, integer_one_node));
1822 return build1 (INDIRECT_REF, type,
1823 build (PLUS_EXPR, build_pointer_type (type),
1826 else if (TYPE_PTRMEMFUNC_P (TREE_TYPE (member)))
1828 return get_member_function_from_ptrfunc (&addr, member);
1830 my_friendly_abort (56);
1835 /* Return either DECL or its known constant value (if it has one). */
1838 decl_constant_value (decl)
1841 if (! TREE_THIS_VOLATILE (decl)
1842 && DECL_INITIAL (decl)
1843 && DECL_INITIAL (decl) != error_mark_node
1844 /* This is invalid if initial value is not constant.
1845 If it has either a function call, a memory reference,
1846 or a variable, then re-evaluating it could give different results. */
1847 && TREE_CONSTANT (DECL_INITIAL (decl))
1848 /* Check for cases where this is sub-optimal, even though valid. */
1849 && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR)
1850 return DECL_INITIAL (decl);
1854 /* Common subroutines of build_new and build_vec_delete. */
1856 /* Call the global __builtin_delete to delete ADDR. */
1859 build_builtin_delete_call (addr)
1862 mark_used (global_delete_fndecl);
1863 return build_call (global_delete_fndecl,
1864 void_type_node, build_expr_list (NULL_TREE, addr));
1867 /* Generate a C++ "new" expression. DECL is either a TREE_LIST
1868 (which needs to go through some sort of groktypename) or it
1869 is the name of the class we are newing. INIT is an initialization value.
1870 It is either an EXPRLIST, an EXPR_NO_COMMAS, or something in braces.
1871 If INIT is void_type_node, it means do *not* call a constructor
1874 For types with constructors, the data returned is initialized
1875 by the appropriate constructor.
1877 Whether the type has a constructor or not, if it has a pointer
1878 to a virtual function table, then that pointer is set up
1881 Unless I am mistaken, a call to new () will return initialized
1882 data regardless of whether the constructor itself is private or
1883 not. NOPE; new fails if the constructor is private (jcm).
1885 Note that build_new does nothing to assure that any special
1886 alignment requirements of the type are met. Rather, it leaves
1887 it up to malloc to do the right thing. Otherwise, folding to
1888 the right alignment cal cause problems if the user tries to later
1889 free the memory returned by `new'.
1891 PLACEMENT is the `placement' list for user-defined operator new (). */
1893 extern int flag_check_new;
1896 build_new (placement, decl, init, use_global_new)
1902 tree nelts = NULL_TREE, t;
1905 tree pending_sizes = NULL_TREE;
1907 if (decl == error_mark_node)
1908 return error_mark_node;
1910 if (TREE_CODE (decl) == TREE_LIST)
1912 tree absdcl = TREE_VALUE (decl);
1913 tree last_absdcl = NULL_TREE;
1914 int old_immediate_size_expand = 0;
1916 if (current_function_decl
1917 && DECL_CONSTRUCTOR_P (current_function_decl))
1919 old_immediate_size_expand = immediate_size_expand;
1920 immediate_size_expand = 0;
1923 nelts = integer_one_node;
1925 if (absdcl && TREE_CODE (absdcl) == CALL_EXPR)
1926 my_friendly_abort (215);
1927 while (absdcl && TREE_CODE (absdcl) == INDIRECT_REF)
1929 last_absdcl = absdcl;
1930 absdcl = TREE_OPERAND (absdcl, 0);
1933 if (absdcl && TREE_CODE (absdcl) == ARRAY_REF)
1935 /* probably meant to be a vec new */
1938 while (TREE_OPERAND (absdcl, 0)
1939 && TREE_CODE (TREE_OPERAND (absdcl, 0)) == ARRAY_REF)
1941 last_absdcl = absdcl;
1942 absdcl = TREE_OPERAND (absdcl, 0);
1946 this_nelts = TREE_OPERAND (absdcl, 1);
1947 if (this_nelts != error_mark_node)
1949 if (this_nelts == NULL_TREE)
1950 error ("new of array type fails to specify size");
1951 else if (processing_template_decl)
1954 absdcl = TREE_OPERAND (absdcl, 0);
1958 int flags = pedantic ? WANT_INT : (WANT_INT | WANT_ENUM);
1959 if (build_expr_type_conversion (flags, this_nelts, 0)
1961 pedwarn ("size in array new must have integral type");
1963 this_nelts = save_expr (cp_convert (sizetype, this_nelts));
1964 absdcl = TREE_OPERAND (absdcl, 0);
1965 if (this_nelts == integer_zero_node)
1967 warning ("zero size array reserves no space");
1968 nelts = integer_zero_node;
1971 nelts = build_binary_op (MULT_EXPR, nelts, this_nelts);
1975 nelts = integer_zero_node;
1979 TREE_OPERAND (last_absdcl, 0) = absdcl;
1981 TREE_VALUE (decl) = absdcl;
1983 type = groktypename (decl);
1984 if (! type || type == error_mark_node)
1986 immediate_size_expand = old_immediate_size_expand;
1987 return error_mark_node;
1990 if (current_function_decl
1991 && DECL_CONSTRUCTOR_P (current_function_decl))
1993 pending_sizes = get_pending_sizes ();
1994 immediate_size_expand = old_immediate_size_expand;
1997 else if (TREE_CODE (decl) == IDENTIFIER_NODE)
1999 if (IDENTIFIER_HAS_TYPE_VALUE (decl))
2001 /* An aggregate type. */
2002 type = IDENTIFIER_TYPE_VALUE (decl);
2003 decl = TYPE_MAIN_DECL (type);
2007 /* A builtin type. */
2008 decl = lookup_name (decl, 1);
2009 my_friendly_assert (TREE_CODE (decl) == TYPE_DECL, 215);
2010 type = TREE_TYPE (decl);
2013 else if (TREE_CODE (decl) == TYPE_DECL)
2015 type = TREE_TYPE (decl);
2020 decl = TYPE_MAIN_DECL (type);
2023 if (processing_template_decl)
2026 t = min_tree_cons (min_tree_cons (NULL_TREE, type, NULL_TREE),
2027 build_min_nt (ARRAY_REF, NULL_TREE, nelts),
2032 rval = build_min_nt (NEW_EXPR, placement, t, init);
2033 NEW_EXPR_USE_GLOBAL (rval) = use_global_new;
2037 /* ``A reference cannot be created by the new operator. A reference
2038 is not an object (8.2.2, 8.4.3), so a pointer to it could not be
2039 returned by new.'' ARM 5.3.3 */
2040 if (TREE_CODE (type) == REFERENCE_TYPE)
2042 error ("new cannot be applied to a reference type");
2043 type = TREE_TYPE (type);
2046 if (TREE_CODE (type) == FUNCTION_TYPE)
2048 error ("new cannot be applied to a function type");
2049 return error_mark_node;
2052 /* When the object being created is an array, the new-expression yields a
2053 pointer to the initial element (if any) of the array. For example,
2054 both new int and new int[10] return an int*. 5.3.4. */
2055 if (TREE_CODE (type) == ARRAY_TYPE && has_array == 0)
2057 nelts = array_type_nelts_top (type);
2059 type = TREE_TYPE (type);
2063 t = build_nt (ARRAY_REF, type, nelts);
2067 rval = build (NEW_EXPR, build_pointer_type (type), placement, t, init);
2068 NEW_EXPR_USE_GLOBAL (rval) = use_global_new;
2069 TREE_SIDE_EFFECTS (rval) = 1;
2071 /* Wrap it in a NOP_EXPR so warn_if_unused_value doesn't complain. */
2072 rval = build1 (NOP_EXPR, TREE_TYPE (rval), rval);
2073 TREE_NO_UNUSED_WARNING (rval) = 1;
2076 rval = build_compound_expr (chainon (pending_sizes,
2077 build_expr_list (NULL_TREE, rval)));
2082 /* Given a Java class, return a decl for the corresponding java.lang.Class. */
2085 build_java_class_ref (type)
2088 tree name, class_decl;
2089 static tree CL_prefix = NULL_TREE;
2090 if (CL_prefix == NULL_TREE)
2091 CL_prefix = get_identifier("_CL_");
2092 if (jclass_node == NULL_TREE)
2094 jclass_node = IDENTIFIER_GLOBAL_VALUE (get_identifier("jclass"));
2095 if (jclass_node == NULL_TREE)
2096 fatal("call to Java constructor, while `jclass' undefined");
2097 jclass_node = TREE_TYPE (jclass_node);
2099 name = build_overload_with_type (CL_prefix, type);
2100 class_decl = IDENTIFIER_GLOBAL_VALUE (name);
2101 if (class_decl == NULL_TREE)
2103 push_permanent_obstack ();
2104 class_decl = build_decl (VAR_DECL, name, TREE_TYPE (jclass_node));
2105 TREE_STATIC (class_decl) = 1;
2106 DECL_EXTERNAL (class_decl) = 1;
2107 TREE_PUBLIC (class_decl) = 1;
2108 DECL_ARTIFICIAL (class_decl) = 1;
2109 DECL_IGNORED_P (class_decl) = 1;
2110 pushdecl_top_level (class_decl);
2111 make_decl_rtl (class_decl, NULL_PTR, 1);
2117 /* Called from cplus_expand_expr when expanding a NEW_EXPR. The return
2118 value is immediately handed to expand_expr. */
2124 tree placement, init;
2125 tree type, true_type, size, rval;
2126 tree nelts = NULL_TREE;
2127 tree alloc_expr, alloc_node = NULL_TREE;
2129 enum tree_code code = NEW_EXPR;
2130 int use_cookie, nothrow, check_new;
2132 int use_java_new = 0;
2134 placement = TREE_OPERAND (exp, 0);
2135 type = TREE_OPERAND (exp, 1);
2136 init = TREE_OPERAND (exp, 2);
2137 use_global_new = NEW_EXPR_USE_GLOBAL (exp);
2139 if (TREE_CODE (type) == ARRAY_REF)
2142 nelts = TREE_OPERAND (type, 1);
2143 type = TREE_OPERAND (type, 0);
2147 if (CP_TYPE_QUALS (type))
2148 type = TYPE_MAIN_VARIANT (type);
2150 /* If our base type is an array, then make sure we know how many elements
2152 while (TREE_CODE (true_type) == ARRAY_TYPE)
2154 tree this_nelts = array_type_nelts_top (true_type);
2155 nelts = build_binary_op (MULT_EXPR, nelts, this_nelts);
2156 true_type = TREE_TYPE (true_type);
2159 if (!complete_type_or_else (true_type, exp))
2160 return error_mark_node;
2163 size = fold (build_binary_op (MULT_EXPR, size_in_bytes (true_type),
2166 size = size_in_bytes (type);
2168 if (TREE_CODE (true_type) == VOID_TYPE)
2170 error ("invalid type `void' for new");
2171 return error_mark_node;
2174 if (abstract_virtuals_error (NULL_TREE, true_type))
2175 return error_mark_node;
2177 /* When we allocate an array, and the corresponding deallocation
2178 function takes a second argument of type size_t, and that's the
2179 "usual deallocation function", we allocate some extra space at
2180 the beginning of the array to store the size of the array.
2182 Well, that's what we should do. For backwards compatibility, we
2183 have to do this whenever there's a two-argument array-delete
2186 FIXME: For -fnew-abi, we don't have to maintain backwards
2187 compatibility and we should fix this. */
2188 use_cookie = (has_array && TYPE_VEC_NEW_USES_COOKIE (true_type)
2189 && ! (placement && ! TREE_CHAIN (placement)
2190 && TREE_TYPE (TREE_VALUE (placement)) == ptr_type_node));
2194 tree extra = BI_header_size;
2196 size = size_binop (PLUS_EXPR, size, extra);
2201 code = VEC_NEW_EXPR;
2203 if (init && pedantic)
2204 cp_pedwarn ("initialization in array new");
2207 /* Allocate the object. */
2209 if (! placement && TYPE_FOR_JAVA (true_type))
2211 tree class_addr, alloc_decl;
2212 tree class_decl = build_java_class_ref (true_type);
2213 tree class_size = size_in_bytes (true_type);
2214 static char alloc_name[] = "_Jv_AllocObject";
2216 alloc_decl = IDENTIFIER_GLOBAL_VALUE (get_identifier (alloc_name));
2217 if (alloc_decl == NULL_TREE)
2218 fatal("call to Java constructor, while `%s' undefined", alloc_name);
2219 class_addr = build1 (ADDR_EXPR, jclass_node, class_decl);
2220 rval = build_function_call (alloc_decl,
2221 tree_cons (NULL_TREE, class_addr,
2222 build_tree_list (NULL_TREE,
2224 rval = cp_convert (build_pointer_type (true_type), rval);
2230 if (flag_exceptions)
2231 /* We will use RVAL when generating an exception handler for
2232 this new-expression, so we must save it. */
2233 susp = suspend_momentary ();
2235 rval = build_op_new_call
2236 (code, true_type, tree_cons (NULL_TREE, size, placement),
2237 LOOKUP_NORMAL | (use_global_new * LOOKUP_GLOBAL));
2238 rval = cp_convert (build_pointer_type (true_type), rval);
2240 if (flag_exceptions)
2241 resume_momentary (susp);
2244 /* unless an allocation function is declared with an empty excep-
2245 tion-specification (_except.spec_), throw(), it indicates failure to
2246 allocate storage by throwing a bad_alloc exception (clause _except_,
2247 _lib.bad.alloc_); it returns a non-null pointer otherwise If the allo-
2248 cation function is declared with an empty exception-specification,
2249 throw(), it returns null to indicate failure to allocate storage and a
2250 non-null pointer otherwise.
2252 So check for a null exception spec on the op new we just called. */
2257 /* The CALL_EXPR. */
2258 tree t = TREE_OPERAND (rval, 0);
2260 t = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
2261 nothrow = TYPE_NOTHROW_P (TREE_TYPE (t));
2263 check_new = (flag_check_new || nothrow) && ! use_java_new;
2265 if ((check_new || flag_exceptions) && rval)
2267 alloc_expr = get_target_expr (rval);
2268 alloc_node = rval = TREE_OPERAND (alloc_expr, 0);
2271 alloc_expr = NULL_TREE;
2273 /* if rval is NULL_TREE I don't have to allocate it, but are we totally
2274 sure we have some extra bytes in that case for the BI_header_size
2275 cookies? And how does that interact with the code below? (mrs) */
2276 /* Finish up some magic for new'ed arrays */
2277 if (use_cookie && rval != NULL_TREE)
2279 tree extra = BI_header_size;
2281 rval = convert (string_type_node, rval); /* for ptr arithmetic */
2282 rval = save_expr (build_binary_op (PLUS_EXPR, rval, extra));
2283 /* Store header info. */
2284 cookie = build_indirect_ref (build (MINUS_EXPR,
2285 build_pointer_type (BI_header_type),
2286 rval, extra), NULL_PTR);
2287 exp1 = build (MODIFY_EXPR, void_type_node,
2288 build_component_ref (cookie, nelts_identifier,
2291 TREE_SIDE_EFFECTS (exp1) = 1;
2292 rval = cp_convert (build_pointer_type (true_type), rval);
2293 rval = build_compound_expr
2294 (tree_cons (NULL_TREE, exp1,
2295 build_expr_list (NULL_TREE, rval)));
2298 if (rval == error_mark_node)
2299 return error_mark_node;
2301 /* Don't call any constructors or do any initialization. */
2302 if (init == void_type_node)
2305 if (TYPE_NEEDS_CONSTRUCTING (type) || init)
2307 if (! TYPE_NEEDS_CONSTRUCTING (type)
2308 && ! IS_AGGR_TYPE (type) && ! has_array)
2310 /* We are processing something like `new int (10)', which
2311 means allocate an int, and initialize it with 10. */
2315 /* At present RVAL is a temporary variable, created to hold
2316 the value from the call to `operator new'. We transform
2317 it to (*RVAL = INIT, RVAL). */
2318 rval = save_expr (rval);
2319 deref = build_indirect_ref (rval, NULL_PTR);
2321 /* Even for something like `new const int (10)' we must
2322 allow the expression to be non-const while we do the
2324 deref_type = TREE_TYPE (deref);
2325 if (CP_TYPE_CONST_P (deref_type))
2327 = cp_build_qualified_type (deref_type,
2328 CP_TYPE_QUALS (deref_type)
2329 & ~TYPE_QUAL_CONST);
2330 TREE_READONLY (deref) = 0;
2332 if (TREE_CHAIN (init) != NULL_TREE)
2333 pedwarn ("initializer list being treated as compound expression");
2334 else if (TREE_CODE (init) == CONSTRUCTOR)
2336 pedwarn ("initializer list appears where operand should be used");
2337 init = TREE_OPERAND (init, 1);
2339 init = build_compound_expr (init);
2341 init = convert_for_initialization (deref, type, init, LOOKUP_NORMAL,
2342 "new", NULL_TREE, 0);
2343 rval = build (COMPOUND_EXPR, TREE_TYPE (rval),
2344 build_modify_expr (deref, NOP_EXPR, init),
2346 TREE_NO_UNUSED_WARNING (rval) = 1;
2347 TREE_SIDE_EFFECTS (rval) = 1;
2349 else if (! has_array)
2352 /* Constructors are never virtual. If it has an initialization, we
2353 need to complain if we aren't allowed to use the ctor that took
2355 int flags = LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_COMPLAIN;
2357 if (rval && TYPE_USES_VIRTUAL_BASECLASSES (true_type))
2359 init = tree_cons (NULL_TREE, integer_one_node, init);
2360 flags |= LOOKUP_HAS_IN_CHARGE;
2364 rval = save_expr (rval);
2367 if (newrval && TREE_CODE (TREE_TYPE (newrval)) == POINTER_TYPE)
2368 newrval = build_indirect_ref (newrval, NULL_PTR);
2370 newrval = build_method_call (newrval, ctor_identifier,
2371 init, TYPE_BINFO (true_type), flags);
2373 if (newrval == NULL_TREE || newrval == error_mark_node)
2374 return error_mark_node;
2376 /* Java constructors compiled by jc1 do not return this. */
2378 newrval = build (COMPOUND_EXPR, TREE_TYPE (newrval),
2381 TREE_HAS_CONSTRUCTOR (rval) = 1;
2384 rval = build (VEC_INIT_EXPR, TREE_TYPE (rval),
2385 save_expr (rval), init, nelts);
2387 /* If any part of the object initialization terminates by throwing an
2388 exception and a suitable deallocation function can be found, the
2389 deallocation function is called to free the memory in which the
2390 object was being constructed, after which the exception continues
2391 to propagate in the context of the new-expression. If no
2392 unambiguous matching deallocation function can be found,
2393 propagating the exception does not cause the object's memory to be
2395 if (flag_exceptions && alloc_expr && ! use_java_new)
2397 enum tree_code dcode = has_array ? VEC_DELETE_EXPR : DELETE_EXPR;
2398 tree cleanup, fn = NULL_TREE;
2399 int flags = LOOKUP_NORMAL | (use_global_new * LOOKUP_GLOBAL);
2401 /* All cleanups must last longer than normal. */
2402 int yes = suspend_momentary ();
2404 /* The Standard is unclear here, but the right thing to do
2405 is to use the same method for finding deallocation
2406 functions that we use for finding allocation functions. */
2407 flags |= LOOKUP_SPECULATIVELY;
2409 /* We expect alloc_expr to look like a TARGET_EXPR around
2410 a NOP_EXPR around the CALL_EXPR we want. */
2411 fn = TREE_OPERAND (alloc_expr, 1);
2412 fn = TREE_OPERAND (fn, 0);
2414 cleanup = build_op_delete_call (dcode, alloc_node, size, flags, fn);
2416 resume_momentary (yes);
2418 /* Ack! First we allocate the memory. Then we set our sentry
2419 variable to true, and expand a cleanup that deletes the memory
2420 if sentry is true. Then we run the constructor and store the
2421 returned pointer in buf. Then we clear sentry and return buf. */
2425 tree end, sentry, begin, buf, t = TREE_TYPE (rval);
2427 begin = get_target_expr (boolean_true_node);
2428 sentry = TREE_OPERAND (begin, 0);
2430 yes = suspend_momentary ();
2431 TREE_OPERAND (begin, 2)
2432 = build (COND_EXPR, void_type_node, sentry,
2433 cleanup, void_zero_node);
2434 resume_momentary (yes);
2436 rval = get_target_expr (rval);
2438 end = build (MODIFY_EXPR, TREE_TYPE (sentry),
2439 sentry, boolean_false_node);
2440 TREE_SIDE_EFFECTS (end) = 1;
2442 buf = TREE_OPERAND (rval, 0);
2444 rval = build (COMPOUND_EXPR, t, begin,
2445 build (COMPOUND_EXPR, t, rval,
2446 build (COMPOUND_EXPR, t, end, buf)));
2450 else if (CP_TYPE_CONST_P (true_type))
2451 cp_error ("uninitialized const in `new' of `%#T'", true_type);
2455 if (alloc_expr && rval == alloc_node)
2457 rval = TREE_OPERAND (alloc_expr, 1);
2458 alloc_expr = NULL_TREE;
2461 if (check_new && alloc_expr)
2463 /* Did we modify the storage? */
2464 tree ifexp = build_binary_op (NE_EXPR, alloc_node,
2466 rval = build_conditional_expr (ifexp, rval, alloc_node);
2470 rval = build (COMPOUND_EXPR, TREE_TYPE (rval), alloc_expr, rval);
2472 if (rval && TREE_TYPE (rval) != build_pointer_type (type))
2474 /* The type of new int [3][3] is not int *, but int [3] * */
2475 rval = build_c_cast (build_pointer_type (type), rval);
2482 build_vec_delete_1 (base, maxindex, type, auto_delete_vec, auto_delete,
2484 tree base, maxindex, type;
2485 tree auto_delete_vec, auto_delete;
2486 int use_global_delete;
2489 tree ptype = build_pointer_type (type = complete_type (type));
2490 tree size_exp = size_in_bytes (type);
2492 /* Temporary variables used by the loop. */
2493 tree tbase, tbase_init;
2495 /* This is the body of the loop that implements the deletion of a
2496 single element, and moves temp variables to next elements. */
2499 /* This is the LOOP_EXPR that governs the deletion of the elements. */
2502 /* This is the thing that governs what to do after the loop has run. */
2503 tree deallocate_expr = 0;
2505 /* This is the BIND_EXPR which holds the outermost iterator of the
2506 loop. It is convenient to set this variable up and test it before
2507 executing any other code in the loop.
2508 This is also the containing expression returned by this function. */
2509 tree controller = NULL_TREE;
2511 if (! IS_AGGR_TYPE (type) || ! TYPE_NEEDS_DESTRUCTOR (type))
2513 loop = integer_zero_node;
2517 /* The below is short by BI_header_size */
2518 virtual_size = fold (size_binop (MULT_EXPR, size_exp, maxindex));
2520 tbase = build_decl (VAR_DECL, NULL_TREE, ptype);
2521 tbase_init = build_modify_expr (tbase, NOP_EXPR,
2522 fold (build (PLUS_EXPR, ptype,
2525 DECL_REGISTER (tbase) = 1;
2526 controller = build (BIND_EXPR, void_type_node, tbase, NULL_TREE, NULL_TREE);
2527 TREE_SIDE_EFFECTS (controller) = 1;
2529 if (auto_delete != integer_zero_node
2530 && auto_delete != integer_two_node)
2532 tree base_tbd = cp_convert (ptype,
2533 build_binary_op (MINUS_EXPR,
2534 cp_convert (ptr_type_node, base),
2536 /* This is the real size */
2537 virtual_size = size_binop (PLUS_EXPR, virtual_size, BI_header_size);
2538 body = build_expr_list (NULL_TREE,
2539 build_x_delete (base_tbd,
2540 2 | use_global_delete,
2542 body = build (COND_EXPR, void_type_node,
2543 build (BIT_AND_EXPR, integer_type_node,
2544 auto_delete, integer_one_node),
2545 body, integer_zero_node);
2550 body = tree_cons (NULL_TREE,
2551 build_delete (ptype, tbase, auto_delete,
2552 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1),
2555 body = tree_cons (NULL_TREE,
2556 build_modify_expr (tbase, NOP_EXPR, build (MINUS_EXPR, ptype, tbase, size_exp)),
2559 body = tree_cons (NULL_TREE,
2560 build (EXIT_EXPR, void_type_node,
2561 build (EQ_EXPR, boolean_type_node, base, tbase)),
2564 loop = build (LOOP_EXPR, void_type_node, build_compound_expr (body));
2566 loop = tree_cons (NULL_TREE, tbase_init,
2567 tree_cons (NULL_TREE, loop, NULL_TREE));
2568 loop = build_compound_expr (loop);
2571 /* If the delete flag is one, or anything else with the low bit set,
2572 delete the storage. */
2573 if (auto_delete_vec == integer_zero_node)
2574 deallocate_expr = integer_zero_node;
2579 /* The below is short by BI_header_size */
2580 virtual_size = fold (size_binop (MULT_EXPR, size_exp, maxindex));
2582 if (! TYPE_VEC_NEW_USES_COOKIE (type))
2587 base_tbd = cp_convert (ptype,
2588 build_binary_op (MINUS_EXPR,
2589 cp_convert (string_type_node, base),
2591 /* True size with header. */
2592 virtual_size = size_binop (PLUS_EXPR, virtual_size, BI_header_size);
2594 deallocate_expr = build_x_delete (base_tbd,
2595 2 | use_global_delete,
2597 if (auto_delete_vec != integer_one_node)
2598 deallocate_expr = build (COND_EXPR, void_type_node,
2599 build (BIT_AND_EXPR, integer_type_node,
2600 auto_delete_vec, integer_one_node),
2601 deallocate_expr, integer_zero_node);
2604 if (loop && deallocate_expr != integer_zero_node)
2606 body = tree_cons (NULL_TREE, loop,
2607 tree_cons (NULL_TREE, deallocate_expr, NULL_TREE));
2608 body = build_compound_expr (body);
2613 /* Outermost wrapper: If pointer is null, punt. */
2614 body = build (COND_EXPR, void_type_node,
2615 build (NE_EXPR, boolean_type_node, base, integer_zero_node),
2616 body, integer_zero_node);
2617 body = build1 (NOP_EXPR, void_type_node, body);
2621 TREE_OPERAND (controller, 1) = body;
2625 return cp_convert (void_type_node, body);
2629 create_temporary_var (type)
2634 decl = build_decl (VAR_DECL, NULL_TREE, type);
2635 TREE_USED (decl) = 1;
2636 DECL_ARTIFICIAL (decl) = 1;
2637 DECL_SOURCE_FILE (decl) = input_filename;
2638 DECL_SOURCE_LINE (decl) = lineno;
2639 DECL_IGNORED_P (decl) = 1;
2640 DECL_CONTEXT (decl) = current_function_decl;
2645 /* Create a new temporary variable of the indicated TYPE, initialized
2648 It is not entered into current_binding_level, because that breaks
2649 things when it comes time to do final cleanups (which take place
2650 "outside" the binding contour of the function). */
2653 get_temp_regvar (type, init)
2658 decl = create_temporary_var (type);
2659 if (building_stmt_tree ())
2660 add_decl_stmt (decl);
2661 if (!building_stmt_tree ())
2662 DECL_RTL (decl) = assign_temp (type, 2, 0, 1);
2663 finish_expr_stmt (build_modify_expr (decl, INIT_EXPR, init));
2668 /* `build_vec_init' returns tree structure that performs
2669 initialization of a vector of aggregate types.
2671 DECL is passed only for error reporting, and provides line number
2672 and source file name information.
2673 BASE is the space where the vector will be. For a vector of Ts,
2674 the type of BASE is `T*'.
2675 MAXINDEX is the maximum index of the array (one less than the
2676 number of elements).
2677 INIT is the (possibly NULL) initializer.
2679 FROM_ARRAY is 0 if we should init everything with INIT
2680 (i.e., every element initialized from INIT).
2681 FROM_ARRAY is 1 if we should index into INIT in parallel
2682 with initialization of DECL.
2683 FROM_ARRAY is 2 if we should index into INIT in parallel,
2684 but use assignment instead of initialization. */
2687 build_vec_init (decl, base, maxindex, init, from_array)
2688 tree decl, base, maxindex, init;
2692 tree base2 = NULL_TREE;
2694 tree itype = NULL_TREE;
2696 /* The type of an element in the array. */
2698 /* The type of a pointer to an element in the array. */
2703 tree try_block = NULL_TREE;
2705 int num_initialized_elts = 0;
2707 maxindex = cp_convert (ptrdiff_type_node, maxindex);
2708 if (maxindex == error_mark_node)
2709 return error_mark_node;
2711 if (current_function_decl == NULL_TREE)
2713 rval = make_tree_vec (3);
2714 TREE_VEC_ELT (rval, 0) = base;
2715 TREE_VEC_ELT (rval, 1) = maxindex;
2716 TREE_VEC_ELT (rval, 2) = init;
2720 type = TREE_TYPE (TREE_TYPE (base));
2721 ptype = build_pointer_type (type);
2722 size = size_in_bytes (type);
2724 /* The code we are generating looks like:
2728 ptrdiff_t iterator = maxindex;
2730 ... initializations from CONSTRUCTOR ...
2731 if (iterator != -1) {
2733 ... initialize *base ...
2735 } while (--iterator != -1);
2738 ... destroy elements that were constructed ...
2741 We can omit the try and catch blocks if we know that the
2742 initialization will never throw an exception, or if the array
2743 elements do not have destructors. If we have a CONSTRUCTOR to
2744 give us initialization information, we emit code to initialize
2745 each of the elements before the loop in the try block, and then
2746 iterate over fewer elements. We can omit the loop completely if
2747 the elements of the array do not have constructors.
2749 We actually wrap the entire body of the above in a STMT_EXPR, for
2752 When copying from array to another, when the array elements have
2753 only trivial copy constructors, we should use __builtin_memcpy
2754 rather than generating a loop. That way, we could take advantage
2755 of whatever cleverness the back-end has for dealing with copies
2756 of blocks of memory. */
2758 begin_init_stmts (&stmt_expr, &compound_stmt);
2759 destroy_temps = stmts_are_full_exprs_p;
2760 stmts_are_full_exprs_p = 0;
2761 rval = get_temp_regvar (ptype,
2762 cp_convert (ptype, default_conversion (base)));
2763 base = get_temp_regvar (ptype, rval);
2764 iterator = get_temp_regvar (ptrdiff_type_node, maxindex);
2766 /* Protect the entire array initialization so that we can destroy
2767 the partially constructed array if an exception is thrown. */
2768 if (flag_exceptions && TYPE_NEEDS_DESTRUCTOR (type))
2770 try_block = begin_try_block ();
2771 try_body = begin_compound_stmt (/*has_no_scope=*/1);
2774 if (init != NULL_TREE && TREE_CODE (init) == CONSTRUCTOR
2775 && (!decl || same_type_p (TREE_TYPE (init), TREE_TYPE (decl))))
2777 /* Do non-default initialization resulting from brace-enclosed
2783 for (elts = CONSTRUCTOR_ELTS (init); elts; elts = TREE_CHAIN (elts))
2785 tree elt = TREE_VALUE (elts);
2786 tree baseref = build1 (INDIRECT_REF, type, base);
2788 num_initialized_elts++;
2790 if (IS_AGGR_TYPE (type) || TREE_CODE (type) == ARRAY_TYPE)
2791 finish_expr_stmt (build_aggr_init (baseref, elt, 0));
2793 finish_expr_stmt (build_modify_expr (baseref, NOP_EXPR,
2796 finish_expr_stmt (build_modify_expr
2799 build (PLUS_EXPR, build_pointer_type (type),
2801 finish_expr_stmt (build_modify_expr
2804 build (MINUS_EXPR, ptrdiff_type_node,
2805 iterator, integer_one_node)));
2808 /* Clear out INIT so that we don't get confused below. */
2811 else if (from_array)
2813 /* If initializing one array from another, initialize element by
2814 element. We rely upon the below calls the do argument
2816 if (decl == NULL_TREE)
2818 sorry ("initialization of array from dissimilar array type");
2819 return error_mark_node;
2823 base2 = default_conversion (init);
2824 itype = TREE_TYPE (base2);
2825 base2 = get_temp_regvar (itype, base2);
2826 itype = TREE_TYPE (itype);
2828 else if (TYPE_LANG_SPECIFIC (type)
2829 && TYPE_NEEDS_CONSTRUCTING (type)
2830 && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
2832 error ("initializer ends prematurely");
2833 return error_mark_node;
2837 /* Now, default-initialize any remaining elements. We don't need to
2838 do that if a) the type does not need constructing, or b) we've
2839 already initialized all the elements.
2841 We do need to keep going if we're copying an array. */
2844 || (TYPE_NEEDS_CONSTRUCTING (type)
2845 && !(TREE_CODE (maxindex) == INTEGER_CST
2846 && num_initialized_elts == TREE_INT_CST_LOW (maxindex) + 1)))
2848 /* If the ITERATOR is equal to -1, then we don't have to loop;
2849 we've already initialized all the elements. */
2855 if_stmt = begin_if_stmt ();
2856 finish_if_stmt_cond (build (NE_EXPR, boolean_type_node,
2857 iterator, minus_one_node),
2860 /* Otherwise, loop through the elements. */
2861 do_stmt = begin_do_stmt ();
2862 do_body = begin_compound_stmt (/*has_no_scope=*/1);
2864 /* When we're not building a statement-tree, things are a little
2865 complicated. If, when we recursively call build_aggr_init,
2866 an expression containing a TARGET_EXPR is expanded, then it
2867 may get a cleanup. Then, the result of that expression is
2868 passed to finish_expr_stmt, which will call
2869 expand_start_target_temps/expand_end_target_temps. However,
2870 the latter call will not cause the cleanup to run because
2871 that block will still be on the block stack. So, we call
2872 expand_start_target_temps here manually; the corresponding
2873 call to expand_end_target_temps below will cause the cleanup
2875 if (!building_stmt_tree ())
2876 expand_start_target_temps ();
2880 tree to = build1 (INDIRECT_REF, type, base);
2884 from = build1 (INDIRECT_REF, itype, base2);
2888 if (from_array == 2)
2889 elt_init = build_modify_expr (to, NOP_EXPR, from);
2890 else if (TYPE_NEEDS_CONSTRUCTING (type))
2891 elt_init = build_aggr_init (to, from, 0);
2893 elt_init = build_modify_expr (to, NOP_EXPR, from);
2895 my_friendly_abort (57);
2897 else if (TREE_CODE (type) == ARRAY_TYPE)
2900 sorry ("cannot initialize multi-dimensional array with initializer");
2901 elt_init = (build_vec_init
2904 build_pointer_type (TREE_TYPE (type)),
2906 array_type_nelts (type), 0, 0));
2909 elt_init = build_aggr_init (build1 (INDIRECT_REF, type, base),
2912 /* The initialization of each array element is a
2914 if (!building_stmt_tree ())
2916 finish_expr_stmt (elt_init);
2917 expand_end_target_temps ();
2921 stmts_are_full_exprs_p = 1;
2922 finish_expr_stmt (elt_init);
2923 stmts_are_full_exprs_p = 0;
2926 finish_expr_stmt (build_modify_expr
2929 build (PLUS_EXPR, build_pointer_type (type),
2932 finish_expr_stmt (build_modify_expr
2935 build (PLUS_EXPR, build_pointer_type (type),
2938 finish_compound_stmt (/*has_no_scope=*/1, do_body);
2939 finish_do_body (do_stmt);
2940 finish_do_stmt (build (NE_EXPR, boolean_type_node,
2941 build (PREDECREMENT_EXPR,
2948 finish_then_clause (if_stmt);
2952 /* Make sure to cleanup any partially constructed elements. */
2953 if (flag_exceptions && TYPE_NEEDS_DESTRUCTOR (type))
2957 finish_compound_stmt (/*has_no_scope=*/1, try_body);
2958 finish_cleanup_try_block (try_block);
2959 e = build_vec_delete_1 (rval,
2960 build_binary_op (MINUS_EXPR, maxindex,
2963 /*auto_delete_vec=*/integer_zero_node,
2964 /*auto_delete=*/integer_zero_node,
2965 /*use_global_delete=*/0);
2966 finish_cleanup (e, try_block);
2969 /* The value of the array initialization is the address of the
2970 first element in the array. */
2971 finish_expr_stmt (rval);
2973 stmt_expr = finish_init_stmts (stmt_expr, compound_stmt);
2974 stmts_are_full_exprs_p = destroy_temps;
2978 /* Free up storage of type TYPE, at address ADDR.
2980 TYPE is a POINTER_TYPE and can be ptr_type_node for no special type
2983 VIRTUAL_SIZE is the amount of storage that was allocated, and is
2984 used as the second argument to operator delete. It can include
2985 things like padding and magic size cookies. It has virtual in it,
2986 because if you have a base pointer and you delete through a virtual
2987 destructor, it should be the size of the dynamic object, not the
2988 static object, see Free Store 12.5 ANSI C++ WP.
2990 This does not call any destructors. */
2993 build_x_delete (addr, which_delete, virtual_size)
2998 int use_global_delete = which_delete & 1;
2999 int use_vec_delete = !!(which_delete & 2);
3000 enum tree_code code = use_vec_delete ? VEC_DELETE_EXPR : DELETE_EXPR;
3001 int flags = LOOKUP_NORMAL | (use_global_delete * LOOKUP_GLOBAL);
3003 return build_op_delete_call (code, addr, virtual_size, flags, NULL_TREE);
3006 /* Generate a call to a destructor. TYPE is the type to cast ADDR to.
3007 ADDR is an expression which yields the store to be destroyed.
3008 AUTO_DELETE is nonzero if a call to DELETE should be made or not.
3009 If in the program, (AUTO_DELETE & 2) is non-zero, we tear down the
3010 virtual baseclasses.
3011 If in the program, (AUTO_DELETE & 1) is non-zero, then we deallocate.
3013 FLAGS is the logical disjunction of zero or more LOOKUP_
3014 flags. See cp-tree.h for more info.
3016 This function does not delete an object's virtual base classes. */
3019 build_delete (type, addr, auto_delete, flags, use_global_delete)
3023 int use_global_delete;
3029 if (addr == error_mark_node)
3030 return error_mark_node;
3032 /* Can happen when CURRENT_EXCEPTION_OBJECT gets its type
3033 set to `error_mark_node' before it gets properly cleaned up. */
3034 if (type == error_mark_node)
3035 return error_mark_node;
3037 type = TYPE_MAIN_VARIANT (type);
3039 if (TREE_CODE (type) == POINTER_TYPE)
3041 type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
3042 if (type != void_type_node && !complete_type_or_else (type, addr))
3043 return error_mark_node;
3044 if (TREE_CODE (type) == ARRAY_TYPE)
3046 if (! IS_AGGR_TYPE (type))
3048 /* Call the builtin operator delete. */
3049 return build_builtin_delete_call (addr);
3051 if (TREE_SIDE_EFFECTS (addr))
3052 addr = save_expr (addr);
3054 /* throw away const and volatile on target type of addr */
3055 addr = convert_force (build_pointer_type (type), addr, 0);
3056 ref = build_indirect_ref (addr, NULL_PTR);
3058 else if (TREE_CODE (type) == ARRAY_TYPE)
3061 if (TREE_SIDE_EFFECTS (addr))
3062 addr = save_expr (addr);
3063 if (TYPE_DOMAIN (type) == NULL_TREE)
3065 error ("unknown array size in delete");
3066 return error_mark_node;
3068 return build_vec_delete (addr, array_type_nelts (type),
3069 auto_delete, integer_zero_node,
3074 /* Don't check PROTECT here; leave that decision to the
3075 destructor. If the destructor is accessible, call it,
3076 else report error. */
3077 addr = build_unary_op (ADDR_EXPR, addr, 0);
3078 if (TREE_SIDE_EFFECTS (addr))
3079 addr = save_expr (addr);
3081 if (TREE_CONSTANT (addr))
3082 addr = convert_pointer_to (type, addr);
3084 addr = convert_force (build_pointer_type (type), addr, 0);
3086 ref = build_indirect_ref (addr, NULL_PTR);
3089 my_friendly_assert (IS_AGGR_TYPE (type), 220);
3091 if (! TYPE_NEEDS_DESTRUCTOR (type))
3093 if (auto_delete == integer_zero_node)
3094 return void_zero_node;
3096 return build_op_delete_call
3097 (DELETE_EXPR, addr, c_sizeof_nowarn (type),
3098 LOOKUP_NORMAL | (use_global_delete * LOOKUP_GLOBAL),
3102 /* Below, we will reverse the order in which these calls are made.
3103 If we have a destructor, then that destructor will take care
3104 of the base classes; otherwise, we must do that here. */
3105 if (TYPE_HAS_DESTRUCTOR (type))
3107 tree passed_auto_delete;
3108 tree do_delete = NULL_TREE;
3111 if (use_global_delete)
3113 tree cond = fold (build (BIT_AND_EXPR, integer_type_node,
3114 auto_delete, integer_one_node));
3115 tree call = build_builtin_delete_call (addr);
3117 cond = fold (build (COND_EXPR, void_type_node, cond,
3118 call, void_zero_node));
3119 if (cond != void_zero_node)
3122 passed_auto_delete = fold (build (BIT_AND_EXPR, integer_type_node,
3123 auto_delete, integer_two_node));
3126 passed_auto_delete = auto_delete;
3128 expr = build_method_call
3129 (ref, dtor_identifier, build_expr_list (NULL_TREE, passed_auto_delete),
3133 expr = build (COMPOUND_EXPR, void_type_node, expr, do_delete);
3135 if (flags & LOOKUP_DESTRUCTOR)
3136 /* Explicit destructor call; don't check for null pointer. */
3137 ifexp = integer_one_node;
3139 /* Handle deleting a null pointer. */
3140 ifexp = fold (build_binary_op (NE_EXPR, addr, integer_zero_node));
3142 if (ifexp != integer_one_node)
3143 expr = build (COND_EXPR, void_type_node,
3144 ifexp, expr, void_zero_node);
3150 /* We only get here from finish_function for a destructor. */
3151 tree binfos = BINFO_BASETYPES (TYPE_BINFO (type));
3152 int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
3153 tree base_binfo = n_baseclasses > 0 ? TREE_VEC_ELT (binfos, 0) : NULL_TREE;
3154 tree exprstmt = NULL_TREE;
3155 tree parent_auto_delete = auto_delete;
3158 /* Set this again before we call anything, as we might get called
3160 TYPE_HAS_DESTRUCTOR (type) = 1;
3162 /* If we have member delete or vbases, we call delete in
3164 if (auto_delete == integer_zero_node)
3166 else if (base_binfo == NULL_TREE
3167 || ! TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo)))
3169 cond = build (COND_EXPR, void_type_node,
3170 build (BIT_AND_EXPR, integer_type_node, auto_delete, integer_one_node),
3171 build_builtin_delete_call (addr),
3178 exprstmt = build_expr_list (NULL_TREE, cond);
3181 && ! TREE_VIA_VIRTUAL (base_binfo)
3182 && TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo)))
3184 tree this_auto_delete;
3186 if (BINFO_OFFSET_ZEROP (base_binfo))
3187 this_auto_delete = parent_auto_delete;
3189 this_auto_delete = integer_zero_node;
3191 expr = build_scoped_method_call
3192 (ref, base_binfo, dtor_identifier,
3193 build_expr_list (NULL_TREE, this_auto_delete));
3194 exprstmt = tree_cons (NULL_TREE, expr, exprstmt);
3197 /* Take care of the remaining baseclasses. */
3198 for (i = 1; i < n_baseclasses; i++)
3200 base_binfo = TREE_VEC_ELT (binfos, i);
3201 if (! TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo))
3202 || TREE_VIA_VIRTUAL (base_binfo))
3205 expr = build_scoped_method_call
3206 (ref, base_binfo, dtor_identifier,
3207 build_expr_list (NULL_TREE, integer_zero_node));
3209 exprstmt = tree_cons (NULL_TREE, expr, exprstmt);
3212 for (member = TYPE_FIELDS (type); member; member = TREE_CHAIN (member))
3214 if (TREE_CODE (member) != FIELD_DECL)
3216 if (TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (member)))
3218 tree this_member = build_component_ref (ref, DECL_NAME (member), NULL_TREE, 0);
3219 tree this_type = TREE_TYPE (member);
3220 expr = build_delete (this_type, this_member, integer_two_node, flags, 0);
3221 exprstmt = tree_cons (NULL_TREE, expr, exprstmt);
3226 return build_compound_expr (exprstmt);
3227 /* Virtual base classes make this function do nothing. */
3228 return void_zero_node;
3232 /* For type TYPE, delete the virtual baseclass objects of DECL. */
3235 build_vbase_delete (type, decl)
3238 tree vbases = CLASSTYPE_VBASECLASSES (type);
3239 tree result = NULL_TREE;
3240 tree addr = build_unary_op (ADDR_EXPR, decl, 0);
3242 my_friendly_assert (addr != error_mark_node, 222);
3246 tree this_addr = convert_force (build_pointer_type (BINFO_TYPE (vbases)),
3248 result = tree_cons (NULL_TREE,
3249 build_delete (TREE_TYPE (this_addr), this_addr,
3251 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 0),
3253 vbases = TREE_CHAIN (vbases);
3255 return build_compound_expr (nreverse (result));
3258 /* Build a C++ vector delete expression.
3259 MAXINDEX is the number of elements to be deleted.
3260 ELT_SIZE is the nominal size of each element in the vector.
3261 BASE is the expression that should yield the store to be deleted.
3262 This function expands (or synthesizes) these calls itself.
3263 AUTO_DELETE_VEC says whether the container (vector) should be deallocated.
3264 AUTO_DELETE say whether each item in the container should be deallocated.
3266 This also calls delete for virtual baseclasses of elements of the vector.
3268 Update: MAXINDEX is no longer needed. The size can be extracted from the
3269 start of the vector for pointers, and from the type for arrays. We still
3270 use MAXINDEX for arrays because it happens to already have one of the
3271 values we'd have to extract. (We could use MAXINDEX with pointers to
3272 confirm the size, and trap if the numbers differ; not clear that it'd
3273 be worth bothering.) */
3276 build_vec_delete (base, maxindex, auto_delete_vec, auto_delete,
3278 tree base, maxindex;
3279 tree auto_delete_vec, auto_delete;
3280 int use_global_delete;
3284 if (TREE_CODE (base) == OFFSET_REF)
3285 base = resolve_offset_ref (base);
3287 type = TREE_TYPE (base);
3289 base = stabilize_reference (base);
3291 /* Since we can use base many times, save_expr it. */
3292 if (TREE_SIDE_EFFECTS (base))
3293 base = save_expr (base);
3295 if (TREE_CODE (type) == POINTER_TYPE)
3297 /* Step back one from start of vector, and read dimension. */
3298 tree cookie_addr = build (MINUS_EXPR, build_pointer_type (BI_header_type),
3299 base, BI_header_size);
3300 tree cookie = build_indirect_ref (cookie_addr, NULL_PTR);
3301 maxindex = build_component_ref (cookie, nelts_identifier, NULL_TREE, 0);
3303 type = TREE_TYPE (type);
3304 while (TREE_CODE (type) == ARRAY_TYPE);
3306 else if (TREE_CODE (type) == ARRAY_TYPE)
3308 /* get the total number of things in the array, maxindex is a bad name */
3309 maxindex = array_type_nelts_total (type);
3310 while (TREE_CODE (type) == ARRAY_TYPE)
3311 type = TREE_TYPE (type);
3312 base = build_unary_op (ADDR_EXPR, base, 1);
3316 if (base != error_mark_node)
3317 error ("type to vector delete is neither pointer or array type");
3318 return error_mark_node;
3321 return build_vec_delete_1 (base, maxindex, type, auto_delete_vec, auto_delete,