1 /* Handle initialization things in C++.
2 Copyright (C) 1987, 89, 92-96, 1997 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. */
35 extern void compiler_error ();
37 /* In C++, structures with well-defined constructors are initialized by
38 those constructors, unasked. CURRENT_BASE_INIT_LIST
39 holds a list of stmts for a BASE_INIT term in the grammar.
40 This list has one element for each base class which must be
41 initialized. The list elements are [basename, init], with
42 type basetype. This allows the possibly anachronistic form
43 (assuming d : a, b, c) "d (int a) : c(a+5), b (a-4), a (a+3)"
44 where each successive term can be handed down the constructor
45 line. Perhaps this was not intended. */
46 tree current_base_init_list, current_member_init_list;
48 static void expand_aggr_vbase_init_1 PROTO((tree, tree, tree, tree));
49 static void expand_aggr_vbase_init PROTO((tree, tree, tree, tree));
50 static void expand_aggr_init_1 PROTO((tree, tree, tree, tree, int,
52 static void expand_default_init PROTO((tree, tree, tree, tree, int,
54 static tree build_vec_delete_1 PROTO((tree, tree, tree, tree, tree,
56 static void perform_member_init PROTO((tree, tree, tree, int));
57 static void sort_base_init PROTO((tree, tree *, tree *));
58 static tree build_builtin_call PROTO((tree, tree, tree));
59 static tree build_array_eh_cleanup PROTO((tree, tree, tree));
60 static int member_init_ok_or_else PROTO((tree, tree, char *));
61 static void expand_virtual_init PROTO((tree, tree));
62 static tree sort_member_init PROTO((tree));
63 static tree build_partial_cleanup_for PROTO((tree));
64 static tree initializing_context PROTO((tree));
66 /* Cache _builtin_new and _builtin_delete exprs. */
67 static tree BIN, BID, BIVN, BIVD;
69 /* Cache the identifier nodes for the magic field of a new cookie. */
70 static tree nc_nelts_field_id;
72 static tree minus_one;
74 /* Set up local variable for this file. MUST BE CALLED AFTER
75 INIT_DECL_PROCESSING. */
77 static tree BI_header_type, BI_header_size;
79 void init_init_processing ()
83 /* Define implicit `operator new' and `operator delete' functions. */
84 BIN = default_conversion (get_first_fn (IDENTIFIER_GLOBAL_VALUE (ansi_opname[(int) NEW_EXPR])));
85 TREE_USED (TREE_OPERAND (BIN, 0)) = 0;
86 BID = default_conversion (get_first_fn (IDENTIFIER_GLOBAL_VALUE (ansi_opname[(int) DELETE_EXPR])));
87 TREE_USED (TREE_OPERAND (BID, 0)) = 0;
88 BIVN = default_conversion (get_first_fn (IDENTIFIER_GLOBAL_VALUE (ansi_opname[(int) VEC_NEW_EXPR])));
89 TREE_USED (TREE_OPERAND (BIVN, 0)) = 0;
90 BIVD = default_conversion (get_first_fn (IDENTIFIER_GLOBAL_VALUE (ansi_opname[(int) VEC_DELETE_EXPR])));
91 TREE_USED (TREE_OPERAND (BIVD, 0)) = 0;
92 minus_one = build_int_2 (-1, -1);
94 /* Define the structure that holds header information for
95 arrays allocated via operator new. */
96 BI_header_type = make_lang_type (RECORD_TYPE);
97 nc_nelts_field_id = get_identifier ("nelts");
98 fields[0] = build_lang_field_decl (FIELD_DECL, nc_nelts_field_id, sizetype);
99 finish_builtin_type (BI_header_type, "__new_cookie", fields,
100 0, double_type_node);
101 BI_header_size = size_in_bytes (BI_header_type);
104 /* Subroutine of emit_base_init. For BINFO, initialize all the
105 virtual function table pointers, except those that come from
106 virtual base classes. Initialize binfo's vtable pointer, if
107 INIT_SELF is true. CAN_ELIDE is true when we know that all virtual
108 function table pointers in all bases have been initialized already,
109 probably because their constructors have just be run. ADDR is the
110 pointer to the object whos vtables we are going to initialize.
112 REAL_BINFO is usually the same as BINFO, except when addr is not of
113 pointer to the type of the real derived type that we want to
114 initialize for. This is the case when addr is a pointer to a sub
115 object of a complete object, and we only want to do part of the
116 complete object's initialization of vtable pointers. This is done
117 for all virtual table pointers in virtual base classes. REAL_BINFO
118 is used to find the BINFO_VTABLE that we initialize with. BINFO is
119 used for conversions of addr to subobjects.
121 BINFO_TYPE (real_binfo) must be BINFO_TYPE (binfo).
123 Relies upon binfo being inside TYPE_BINFO (TREE_TYPE (TREE_TYPE
127 expand_direct_vtbls_init (real_binfo, binfo, init_self, can_elide, addr)
128 tree real_binfo, binfo, addr;
129 int init_self, can_elide;
131 tree real_binfos = BINFO_BASETYPES (real_binfo);
132 tree binfos = BINFO_BASETYPES (binfo);
133 int i, n_baselinks = real_binfos ? TREE_VEC_LENGTH (real_binfos) : 0;
135 for (i = 0; i < n_baselinks; i++)
137 tree real_base_binfo = TREE_VEC_ELT (real_binfos, i);
138 tree base_binfo = TREE_VEC_ELT (binfos, i);
139 int is_not_base_vtable
140 = i != CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (real_binfo));
141 if (! TREE_VIA_VIRTUAL (real_base_binfo))
142 expand_direct_vtbls_init (real_base_binfo, base_binfo,
143 is_not_base_vtable, can_elide, addr);
146 /* Before turning this on, make sure it is correct. */
147 if (can_elide && ! BINFO_MODIFIED (binfo))
150 /* Should we use something besides CLASSTYPE_VFIELDS? */
151 if (init_self && CLASSTYPE_VFIELDS (BINFO_TYPE (real_binfo)))
153 tree base_ptr = convert_pointer_to_real (binfo, addr);
154 expand_virtual_init (real_binfo, base_ptr);
159 /* Subroutine of emit_base_init. */
162 perform_member_init (member, name, init, explicit)
163 tree member, name, init;
167 tree type = TREE_TYPE (member);
169 expand_start_target_temps ();
171 if (TYPE_NEEDS_CONSTRUCTING (type)
172 || (init && TYPE_HAS_CONSTRUCTOR (type)))
174 /* Since `init' is already a TREE_LIST on the current_member_init_list,
175 only build it into one if we aren't already a list. */
176 if (init != NULL_TREE && TREE_CODE (init) != TREE_LIST)
177 init = build_expr_list (NULL_TREE, init);
179 decl = build_component_ref (current_class_ref, name, NULL_TREE, explicit);
182 && TREE_CODE (type) == ARRAY_TYPE
184 && TREE_CHAIN (init) == NULL_TREE
185 && TREE_CODE (TREE_TYPE (TREE_VALUE (init))) == ARRAY_TYPE)
187 /* Initialization of one array from another. */
188 expand_vec_init (TREE_OPERAND (decl, 1), decl,
189 array_type_nelts (type), TREE_VALUE (init), 1);
192 expand_aggr_init (decl, init, 0, 0);
196 if (init == NULL_TREE)
200 /* default-initialization. */
201 if (AGGREGATE_TYPE_P (type))
202 init = build (CONSTRUCTOR, type, NULL_TREE, NULL_TREE);
203 else if (TREE_CODE (type) == REFERENCE_TYPE)
205 cp_error ("default-initialization of `%#D', which has reference type",
207 init = error_mark_node;
210 init = integer_zero_node;
212 /* member traversal: note it leaves init NULL */
213 else if (TREE_CODE (TREE_TYPE (member)) == REFERENCE_TYPE)
214 cp_pedwarn ("uninitialized reference member `%D'", member);
216 else if (TREE_CODE (init) == TREE_LIST)
218 /* There was an explicit member initialization. Do some
219 work in that case. */
220 if (TREE_CHAIN (init))
222 warning ("initializer list treated as compound expression");
223 init = build_compound_expr (init);
226 init = TREE_VALUE (init);
229 /* We only build this with a null init if we got it from the
230 current_member_init_list. */
231 if (init || explicit)
233 decl = build_component_ref (current_class_ref, name, NULL_TREE,
235 expand_expr_stmt (build_modify_expr (decl, INIT_EXPR, init));
239 expand_end_target_temps ();
242 if (TYPE_NEEDS_DESTRUCTOR (type))
246 /* All cleanups must be on the function_obstack. */
247 push_obstacks_nochange ();
248 resume_temporary_allocation ();
250 expr = build_component_ref (current_class_ref, name, NULL_TREE,
252 expr = build_delete (type, expr, integer_zero_node,
253 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0);
255 if (expr != error_mark_node)
256 add_partial_entry (expr);
262 extern int warn_reorder;
264 /* Subroutine of emit_member_init. */
270 tree x, member, name, field;
271 tree init_list = NULL_TREE;
273 tree last_field = NULL_TREE;
275 for (member = TYPE_FIELDS (t); member ; member = TREE_CHAIN (member))
279 /* member could be, for example, a CONST_DECL for an enumerated
280 tag; we don't want to try to initialize that, since it already
282 if (TREE_CODE (member) != FIELD_DECL || !DECL_NAME (member))
285 for (x = current_member_init_list, pos = 0; x; x = TREE_CHAIN (x), ++pos)
287 /* If we cleared this out, then pay no attention to it. */
288 if (TREE_PURPOSE (x) == NULL_TREE)
290 name = TREE_PURPOSE (x);
293 /* This happens in templates, since the IDENTIFIER is replaced
294 with the COMPONENT_REF in tsubst_expr. */
295 field = (TREE_CODE (name) == COMPONENT_REF
296 ? TREE_OPERAND (name, 1) : IDENTIFIER_CLASS_VALUE (name));
298 /* Let's find out when this happens. */
299 my_friendly_assert (TREE_CODE (name) != COMPONENT_REF, 348);
300 field = IDENTIFIER_CLASS_VALUE (name);
303 /* If one member shadows another, get the outermost one. */
304 if (TREE_CODE (field) == TREE_LIST)
305 field = TREE_VALUE (field);
313 cp_warning_at ("member initializers for `%#D'", last_field);
314 cp_warning_at (" and `%#D'", field);
315 warning (" will be re-ordered to match declaration order");
321 /* Make sure we won't try to work on this init again. */
322 TREE_PURPOSE (x) = NULL_TREE;
323 x = build_tree_list (name, TREE_VALUE (x));
328 /* If we didn't find MEMBER in the list, create a dummy entry
329 so the two lists (INIT_LIST and the list of members) will be
331 x = build_tree_list (NULL_TREE, NULL_TREE);
333 init_list = chainon (init_list, x);
336 /* Initializers for base members go at the end. */
337 for (x = current_member_init_list ; x ; x = TREE_CHAIN (x))
339 name = TREE_PURPOSE (x);
342 if (purpose_member (name, init_list))
344 cp_error ("multiple initializations given for member `%D'",
345 IDENTIFIER_CLASS_VALUE (name));
349 init_list = chainon (init_list,
350 build_tree_list (name, TREE_VALUE (x)));
351 TREE_PURPOSE (x) = NULL_TREE;
359 sort_base_init (t, rbase_ptr, vbase_ptr)
360 tree t, *rbase_ptr, *vbase_ptr;
362 tree binfos = BINFO_BASETYPES (TYPE_BINFO (t));
363 int n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
369 /* For warn_reorder. */
371 tree last_base = NULL_TREE;
373 tree rbases = NULL_TREE;
374 tree vbases = NULL_TREE;
376 /* First walk through and splice out vbase and invalid initializers.
377 Also replace names with binfos. */
379 last = tree_cons (NULL_TREE, NULL_TREE, current_base_init_list);
380 for (x = TREE_CHAIN (last); x; x = TREE_CHAIN (x))
382 tree basetype = TREE_PURPOSE (x);
383 tree binfo = NULL_TREE;
385 if (basetype == NULL_TREE)
387 /* Initializer for single base class. Must not
388 use multiple inheritance or this is ambiguous. */
389 switch (n_baseclasses)
392 cp_error ("`%T' does not have a base class to initialize",
398 cp_error ("unnamed initializer ambiguous for `%T' which uses multiple inheritance",
402 binfo = TREE_VEC_ELT (binfos, 0);
404 else if (is_aggr_type (basetype, 1))
406 binfo = binfo_or_else (basetype, t);
407 if (binfo == NULL_TREE)
410 /* Virtual base classes are special cases. Their initializers
411 are recorded with this constructor, and they are used when
412 this constructor is the top-level constructor called. */
413 if (TREE_VIA_VIRTUAL (binfo))
415 tree v = CLASSTYPE_VBASECLASSES (t);
416 while (BINFO_TYPE (v) != BINFO_TYPE (binfo))
419 vbases = tree_cons (v, TREE_VALUE (x), vbases);
424 /* Otherwise, if it is not an immediate base class, complain. */
425 for (i = n_baseclasses-1; i >= 0; i--)
426 if (BINFO_TYPE (binfo) == BINFO_TYPE (TREE_VEC_ELT (binfos, i)))
430 cp_error ("`%T' is not an immediate base class of `%T'",
431 basetype, current_class_type);
437 my_friendly_abort (365);
439 TREE_PURPOSE (x) = binfo;
440 TREE_CHAIN (last) = x;
443 TREE_CHAIN (last) = NULL_TREE;
445 /* Now walk through our regular bases and make sure they're initialized. */
447 for (i = 0; i < n_baseclasses; ++i)
449 tree base_binfo = TREE_VEC_ELT (binfos, i);
452 if (TREE_VIA_VIRTUAL (base_binfo))
455 for (x = current_base_init_list, pos = 0; x; x = TREE_CHAIN (x), ++pos)
457 tree binfo = TREE_PURPOSE (x);
459 if (binfo == NULL_TREE)
462 if (binfo == base_binfo)
468 cp_warning_at ("base initializers for `%#T'", last_base);
469 cp_warning_at (" and `%#T'", BINFO_TYPE (binfo));
470 warning (" will be re-ordered to match inheritance order");
473 last_base = BINFO_TYPE (binfo);
476 /* Make sure we won't try to work on this init again. */
477 TREE_PURPOSE (x) = NULL_TREE;
478 x = build_tree_list (binfo, TREE_VALUE (x));
483 /* If we didn't find BASE_BINFO in the list, create a dummy entry
484 so the two lists (RBASES and the list of bases) will be
486 x = build_tree_list (NULL_TREE, NULL_TREE);
488 rbases = chainon (rbases, x);
495 /* Perform partial cleanups for a base for exception handling. */
498 build_partial_cleanup_for (binfo)
501 return build_scoped_method_call
502 (current_class_ref, binfo, dtor_identifier,
503 build_expr_list (NULL_TREE, integer_zero_node));
506 /* Perform whatever initializations have yet to be done on the base
507 class of the class variable. These actions are in the global
508 variable CURRENT_BASE_INIT_LIST. Such an action could be
509 NULL_TREE, meaning that the user has explicitly called the base
510 class constructor with no arguments.
512 If there is a need for a call to a constructor, we must surround
513 that call with a pushlevel/poplevel pair, since we are technically
514 at the PARM level of scope.
516 Argument IMMEDIATELY, if zero, forces a new sequence to be
517 generated to contain these new insns, so it can be emitted later.
518 This sequence is saved in the global variable BASE_INIT_EXPR.
519 Otherwise, the insns are emitted into the current sequence.
521 Note that emit_base_init does *not* initialize virtual base
522 classes. That is done specially, elsewhere. */
524 extern tree base_init_expr, rtl_expr_chain;
527 emit_base_init (t, immediately)
533 tree rbase_init_list, vbase_init_list;
534 tree t_binfo = TYPE_BINFO (t);
535 tree binfos = BINFO_BASETYPES (t_binfo);
536 int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
537 tree expr = NULL_TREE;
542 do_pending_stack_adjust ();
543 /* Make the RTL_EXPR node temporary, not momentary,
544 so that rtl_expr_chain doesn't become garbage. */
545 momentary = suspend_momentary ();
546 expr = make_node (RTL_EXPR);
547 resume_momentary (momentary);
548 start_sequence_for_rtl_expr (expr);
551 if (write_symbols == NO_DEBUG)
552 /* As a matter of principle, `start_sequence' should do this. */
555 /* Always emit a line number note so we can step into constructors. */
556 emit_line_note_force (DECL_SOURCE_FILE (current_function_decl),
557 DECL_SOURCE_LINE (current_function_decl));
559 mem_init_list = sort_member_init (t);
560 current_member_init_list = NULL_TREE;
562 sort_base_init (t, &rbase_init_list, &vbase_init_list);
563 current_base_init_list = NULL_TREE;
565 if (TYPE_USES_VIRTUAL_BASECLASSES (t))
567 tree first_arg = TREE_CHAIN (DECL_ARGUMENTS (current_function_decl));
569 expand_start_cond (first_arg, 0);
570 expand_aggr_vbase_init (t_binfo, current_class_ref, current_class_ptr,
575 /* Now, perform initialization of non-virtual base classes. */
576 for (i = 0; i < n_baseclasses; i++)
578 tree base_binfo = TREE_VEC_ELT (binfos, i);
579 tree init = void_list_node;
581 if (TREE_VIA_VIRTUAL (base_binfo))
584 #if 0 /* Once unsharing happens soon enough. */
585 my_friendly_assert (BINFO_INHERITANCE_CHAIN (base_binfo) == t_binfo, 999);
587 BINFO_INHERITANCE_CHAIN (base_binfo) = t_binfo;
590 if (TREE_PURPOSE (rbase_init_list))
591 init = TREE_VALUE (rbase_init_list);
592 else if (TYPE_NEEDS_CONSTRUCTING (BINFO_TYPE (base_binfo)))
595 if (extra_warnings && copy_args_p (current_function_decl))
596 cp_warning ("base class `%#T' should be explicitly initialized in the copy constructor",
597 BINFO_TYPE (base_binfo));
600 if (init != void_list_node)
602 expand_start_target_temps ();
604 member = convert_pointer_to_real (base_binfo, current_class_ptr);
605 expand_aggr_init_1 (base_binfo, NULL_TREE,
606 build_indirect_ref (member, NULL_PTR), init,
607 BINFO_OFFSET_ZEROP (base_binfo), LOOKUP_NORMAL);
609 expand_end_target_temps ();
613 if (TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo)))
617 /* All cleanups must be on the function_obstack. */
618 push_obstacks_nochange ();
619 resume_temporary_allocation ();
620 expr = build_partial_cleanup_for (base_binfo);
622 add_partial_entry (expr);
625 rbase_init_list = TREE_CHAIN (rbase_init_list);
628 /* Initialize all the virtual function table fields that
629 do come from virtual base classes. */
630 if (TYPE_USES_VIRTUAL_BASECLASSES (t))
631 expand_indirect_vtbls_init (t_binfo, current_class_ref, current_class_ptr);
633 /* Initialize all the virtual function table fields that
634 do not come from virtual base classes. */
635 expand_direct_vtbls_init (t_binfo, t_binfo, 1, 1, current_class_ptr);
637 for (member = TYPE_FIELDS (t); member; member = TREE_CHAIN (member))
642 /* member could be, for example, a CONST_DECL for an enumerated
643 tag; we don't want to try to initialize that, since it already
645 if (TREE_CODE (member) != FIELD_DECL || !DECL_NAME (member))
648 /* See if we had a user-specified member initialization. */
649 if (TREE_PURPOSE (mem_init_list))
651 name = TREE_PURPOSE (mem_init_list);
652 init = TREE_VALUE (mem_init_list);
656 if (TREE_CODE (name) == COMPONENT_REF)
657 name = DECL_NAME (TREE_OPERAND (name, 1));
659 /* Also see if it's ever a COMPONENT_REF here. If it is, we
660 need to do `expand_assignment (name, init, 0, 0);' and
662 my_friendly_assert (TREE_CODE (name) != COMPONENT_REF, 349);
667 name = DECL_NAME (member);
668 init = DECL_INITIAL (member);
672 /* Effective C++ rule 12. */
673 if (warn_ecpp && init == NULL_TREE
674 && !DECL_ARTIFICIAL (member)
675 && TREE_CODE (TREE_TYPE (member)) != ARRAY_TYPE)
676 cp_warning ("`%D' should be initialized in the member initialization list", member);
679 perform_member_init (member, name, init, from_init_list);
680 mem_init_list = TREE_CHAIN (mem_init_list);
683 /* Now initialize any members from our bases. */
684 while (mem_init_list)
686 tree name, init, field;
688 if (TREE_PURPOSE (mem_init_list))
690 name = TREE_PURPOSE (mem_init_list);
691 init = TREE_VALUE (mem_init_list);
692 /* XXX: this may need the COMPONENT_REF operand 0 check if
693 it turns out we actually get them. */
694 field = IDENTIFIER_CLASS_VALUE (name);
696 /* If one member shadows another, get the outermost one. */
697 if (TREE_CODE (field) == TREE_LIST)
699 field = TREE_VALUE (field);
700 if (decl_type_context (field) != current_class_type)
701 cp_error ("field `%D' not in immediate context", field);
705 /* It turns out if you have an anonymous union in the
706 class, a member from it can end up not being on the
707 list of fields (rather, the type is), and therefore
708 won't be seen by the for loop above. */
710 /* The code in this for loop is derived from a general loop
711 which had this check in it. Theoretically, we've hit
712 every initialization for the list of members in T, so
713 we shouldn't have anything but these left in this list. */
714 my_friendly_assert (DECL_FIELD_CONTEXT (field) != t, 351);
717 perform_member_init (field, name, init, 1);
719 mem_init_list = TREE_CHAIN (mem_init_list);
724 do_pending_stack_adjust ();
725 my_friendly_assert (base_init_expr == 0, 207);
726 base_init_expr = expr;
727 TREE_TYPE (expr) = void_type_node;
728 RTL_EXPR_RTL (expr) = const0_rtx;
729 RTL_EXPR_SEQUENCE (expr) = get_insns ();
730 rtl_expr_chain = tree_cons (NULL_TREE, expr, rtl_expr_chain);
732 TREE_SIDE_EFFECTS (expr) = 1;
735 /* All the implicit try blocks we built up will be zapped
736 when we come to a real binding contour boundary. */
739 /* Check that all fields are properly initialized after
740 an assignment to `this'. */
747 for (member = TYPE_FIELDS (t); member; member = TREE_CHAIN (member))
748 if (DECL_NAME (member) && TREE_USED (member))
749 cp_error ("field `%D' used before initialized (after assignment to `this')",
753 /* This code sets up the virtual function tables appropriate for
754 the pointer DECL. It is a one-ply initialization.
756 BINFO is the exact type that DECL is supposed to be. In
757 multiple inheritance, this might mean "C's A" if C : A, B. */
760 expand_virtual_init (binfo, decl)
763 tree type = BINFO_TYPE (binfo);
765 tree vtype, vtype_binfo;
767 /* This code is crusty. Should be simple, like:
768 vtbl = BINFO_VTABLE (binfo);
770 vtype = DECL_CONTEXT (CLASSTYPE_VFIELD (type));
771 vtype_binfo = get_binfo (vtype, TREE_TYPE (TREE_TYPE (decl)), 0);
772 vtbl = BINFO_VTABLE (binfo_value (DECL_FIELD_CONTEXT (CLASSTYPE_VFIELD (type)), binfo));
773 assemble_external (vtbl);
774 TREE_USED (vtbl) = 1;
775 vtbl = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (vtbl)), vtbl);
776 decl = convert_pointer_to_real (vtype_binfo, decl);
777 vtbl_ptr = build_vfield_ref (build_indirect_ref (decl, NULL_PTR), vtype);
778 if (vtbl_ptr == error_mark_node)
781 /* Have to convert VTBL since array sizes may be different. */
782 vtbl = convert_force (TREE_TYPE (vtbl_ptr), vtbl, 0);
783 expand_expr_stmt (build_modify_expr (vtbl_ptr, NOP_EXPR, vtbl));
786 /* Subroutine of `expand_aggr_vbase_init'.
787 BINFO is the binfo of the type that is being initialized.
788 INIT_LIST is the list of initializers for the virtual baseclass. */
791 expand_aggr_vbase_init_1 (binfo, exp, addr, init_list)
792 tree binfo, exp, addr, init_list;
794 tree init = purpose_member (binfo, init_list);
795 tree ref = build_indirect_ref (addr, NULL_PTR);
797 expand_start_target_temps ();
800 init = TREE_VALUE (init);
801 /* Call constructors, but don't set up vtables. */
802 expand_aggr_init_1 (binfo, exp, ref, init, 0, LOOKUP_COMPLAIN);
804 expand_end_target_temps ();
808 /* Initialize this object's virtual base class pointers. This must be
809 done only at the top-level of the object being constructed.
811 INIT_LIST is list of initialization for constructor to perform. */
814 expand_aggr_vbase_init (binfo, exp, addr, init_list)
820 tree type = BINFO_TYPE (binfo);
822 if (TYPE_USES_VIRTUAL_BASECLASSES (type))
824 tree result = init_vbase_pointers (type, addr);
828 expand_expr_stmt (build_compound_expr (result));
830 for (vbases = CLASSTYPE_VBASECLASSES (type); vbases;
831 vbases = TREE_CHAIN (vbases))
833 tree tmp = purpose_member (vbases, result);
834 expand_aggr_vbase_init_1 (vbases, exp,
835 TREE_OPERAND (TREE_VALUE (tmp), 0),
841 /* Find the context in which this FIELD can be initialized. */
844 initializing_context (field)
847 tree t = DECL_CONTEXT (field);
849 /* Anonymous union members can be initialized in the first enclosing
850 non-anonymous union context. */
851 while (t && ANON_UNION_TYPE_P (t))
852 t = TYPE_CONTEXT (t);
856 /* Function to give error message if member initialization specification
857 is erroneous. FIELD is the member we decided to initialize.
858 TYPE is the type for which the initialization is being performed.
859 FIELD must be a member of TYPE.
861 MEMBER_NAME is the name of the member. */
864 member_init_ok_or_else (field, type, member_name)
869 if (field == error_mark_node)
871 if (field == NULL_TREE || initializing_context (field) != type)
873 cp_error ("class `%T' does not have any field named `%s'", type,
877 if (TREE_STATIC (field))
879 cp_error ("field `%#D' is static; only point of initialization is its declaration",
887 /* If NAME is a viable field name for the aggregate DECL,
888 and PARMS is a viable parameter list, then expand an _EXPR
889 which describes this initialization.
891 Note that we do not need to chase through the class's base classes
892 to look for NAME, because if it's in that list, it will be handled
893 by the constructor for that base class.
895 We do not yet have a fixed-point finder to instantiate types
896 being fed to overloaded constructors. If there is a unique
897 constructor, then argument types can be got from that one.
899 If INIT is non-NULL, then it the initialization should
900 be placed in `current_base_init_list', where it will be processed
901 by `emit_base_init'. */
904 expand_member_init (exp, name, init)
905 tree exp, name, init;
907 tree basetype = NULL_TREE, field;
910 if (exp == NULL_TREE)
911 return; /* complain about this later */
913 type = TYPE_MAIN_VARIANT (TREE_TYPE (exp));
915 if (name && TREE_CODE (name) == TYPE_DECL)
917 basetype = TREE_TYPE (name);
918 name = DECL_NAME (name);
921 if (name == NULL_TREE && IS_AGGR_TYPE (type))
922 switch (CLASSTYPE_N_BASECLASSES (type))
925 error ("base class initializer specified, but no base class to initialize");
928 basetype = TYPE_BINFO_BASETYPE (type, 0);
931 error ("initializer for unnamed base class ambiguous");
932 cp_error ("(type `%T' uses multiple inheritance)", type);
936 my_friendly_assert (init != NULL_TREE, 0);
938 /* The grammar should not allow fields which have names that are
939 TYPENAMEs. Therefore, if the field has a non-NULL TREE_TYPE, we
940 may assume that this is an attempt to initialize a base class
941 member of the current type. Otherwise, it is an attempt to
942 initialize a member field. */
944 if (init == void_type_node)
947 if (name == NULL_TREE || basetype)
951 if (name == NULL_TREE)
955 name = TYPE_IDENTIFIER (basetype);
958 error ("no base class to initialize");
963 else if (basetype != type
964 && ! current_template_parms
965 && ! vec_binfo_member (basetype,
966 TYPE_BINFO_BASETYPES (type))
967 && ! binfo_member (basetype, CLASSTYPE_VBASECLASSES (type)))
969 if (IDENTIFIER_CLASS_VALUE (name))
971 if (TYPE_USES_VIRTUAL_BASECLASSES (type))
972 cp_error ("type `%T' is not an immediate or virtual basetype for `%T'",
975 cp_error ("type `%T' is not an immediate basetype for `%T'",
980 if (purpose_member (basetype, current_base_init_list))
982 cp_error ("base class `%T' already initialized", basetype);
986 if (warn_reorder && current_member_init_list)
988 cp_warning ("base initializer for `%T'", basetype);
989 warning (" will be re-ordered to precede member initializations");
992 base_init = build_tree_list (basetype, init);
993 current_base_init_list = chainon (current_base_init_list, base_init);
1000 field = lookup_field (type, name, 1, 0);
1002 if (! member_init_ok_or_else (field, type, IDENTIFIER_POINTER (name)))
1005 if (purpose_member (name, current_member_init_list))
1007 cp_error ("field `%D' already initialized", field);
1011 member_init = build_tree_list (name, init);
1012 current_member_init_list = chainon (current_member_init_list, member_init);
1016 /* This is like `expand_member_init', only it stores one aggregate
1019 INIT comes in two flavors: it is either a value which
1020 is to be stored in EXP, or it is a parameter list
1021 to go to a constructor, which will operate on EXP.
1022 If INIT is not a parameter list for a constructor, then set
1023 LOOKUP_ONLYCONVERTING.
1024 If FLAGS is LOOKUP_ONLYCONVERTING then it is the = init form of
1025 the initializer, if FLAGS is 0, then it is the (init) form.
1026 If `init' is a CONSTRUCTOR, then we emit a warning message,
1027 explaining that such initializations are invalid.
1029 ALIAS_THIS is nonzero iff we are initializing something which is
1030 essentially an alias for current_class_ref. In this case, the base
1031 constructor may move it on us, and we must keep track of such
1034 If INIT resolves to a CALL_EXPR which happens to return
1035 something of the type we are looking for, then we know
1036 that we can safely use that call to perform the
1039 The virtual function table pointer cannot be set up here, because
1040 we do not really know its type.
1042 Virtual baseclass pointers are also set up here.
1044 This never calls operator=().
1046 When initializing, nothing is CONST.
1048 A default copy constructor may have to be used to perform the
1051 A constructor or a conversion operator may have to be used to
1052 perform the initialization, but not both, as it would be ambiguous. */
1055 expand_aggr_init (exp, init, alias_this, 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)
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 (TYPE_READONLY (TREE_TYPE (type)) || TYPE_VOLATILE (TREE_TYPE (type)))
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");
1101 expand_vec_init (exp, exp, array_type_nelts (type), init,
1102 init && comptypes (TREE_TYPE (init), TREE_TYPE (exp), 1));
1103 TREE_READONLY (exp) = was_const;
1104 TREE_THIS_VOLATILE (exp) = was_volatile;
1105 TREE_TYPE (exp) = type;
1107 TREE_TYPE (init) = itype;
1111 if (TREE_CODE (exp) == VAR_DECL || TREE_CODE (exp) == PARM_DECL)
1112 /* just know that we've seen something for this node */
1113 TREE_USED (exp) = 1;
1116 /* If initializing from a GNU C CONSTRUCTOR, consider the elts in the
1117 constructor as parameters to an implicit GNU C++ constructor. */
1118 if (init && TREE_CODE (init) == CONSTRUCTOR
1119 && TYPE_HAS_CONSTRUCTOR (type)
1120 && TREE_TYPE (init) == type)
1121 init = CONSTRUCTOR_ELTS (init);
1124 TREE_TYPE (exp) = TYPE_MAIN_VARIANT (type);
1125 expand_aggr_init_1 (TYPE_BINFO (type), exp, exp,
1126 init, alias_this, LOOKUP_NORMAL|flags);
1127 TREE_TYPE (exp) = type;
1128 TREE_READONLY (exp) = was_const;
1129 TREE_THIS_VOLATILE (exp) = was_volatile;
1133 expand_default_init (binfo, true_exp, exp, init, alias_this, flags)
1140 tree type = TREE_TYPE (exp);
1142 /* It fails because there may not be a constructor which takes
1143 its own type as the first (or only parameter), but which does
1144 take other types via a conversion. So, if the thing initializing
1145 the expression is a unit element of type X, first try X(X&),
1146 followed by initialization by X. If neither of these work
1147 out, then look hard. */
1151 if (init && TREE_CODE (init) != TREE_LIST
1152 && (flags & LOOKUP_ONLYCONVERTING))
1154 /* Base subobjects should only get direct-initialization. */
1155 if (true_exp != exp)
1158 /* We special-case TARGET_EXPRs here to avoid an error about
1159 private copy constructors for temporaries bound to reference vars.
1160 If the TARGET_EXPR represents a call to a function that has
1161 permission to create such objects, a reference can bind directly
1162 to the return value. An object variable must be initialized
1163 via the copy constructor, even if the call is elided. */
1164 if (! (TREE_CODE (exp) == VAR_DECL && DECL_ARTIFICIAL (exp)
1165 && TREE_CODE (init) == TARGET_EXPR && TREE_TYPE (init) == type))
1166 init = ocp_convert (type, init, CONV_IMPLICIT|CONV_FORCE_TEMP, flags);
1168 if (TREE_CODE (init) == TRY_CATCH_EXPR)
1169 /* We need to protect the initialization of a catch parm
1170 with a call to terminate(), which shows up as a TRY_CATCH_EXPR
1171 around the TARGET_EXPR for the copy constructor. See
1172 expand_start_catch_block. */
1173 TREE_OPERAND (init, 0) = build (INIT_EXPR, TREE_TYPE (exp), exp,
1174 TREE_OPERAND (init, 0));
1176 init = build (INIT_EXPR, TREE_TYPE (exp), exp, init);
1177 TREE_SIDE_EFFECTS (init) = 1;
1178 expand_expr_stmt (init);
1182 if (init == NULL_TREE
1183 || (TREE_CODE (init) == TREE_LIST && ! TREE_TYPE (init)))
1187 init = TREE_VALUE (parms);
1190 parms = build_expr_list (NULL_TREE, init);
1192 if (TYPE_USES_VIRTUAL_BASECLASSES (type))
1194 if (true_exp == exp)
1195 parms = expr_tree_cons (NULL_TREE, integer_one_node, parms);
1197 parms = expr_tree_cons (NULL_TREE, integer_zero_node, parms);
1198 flags |= LOOKUP_HAS_IN_CHARGE;
1201 rval = build_method_call (exp, ctor_identifier,
1202 parms, binfo, flags);
1203 expand_expr_stmt (rval);
1206 /* This function is responsible for initializing EXP with INIT
1209 BINFO is the binfo of the type for who we are performing the
1210 initialization. For example, if W is a virtual base class of A and B,
1212 If we are initializing B, then W must contain B's W vtable, whereas
1213 were we initializing C, W must contain C's W vtable.
1215 TRUE_EXP is nonzero if it is the true expression being initialized.
1216 In this case, it may be EXP, or may just contain EXP. The reason we
1217 need this is because if EXP is a base element of TRUE_EXP, we
1218 don't necessarily know by looking at EXP where its virtual
1219 baseclass fields should really be pointing. But we do know
1220 from TRUE_EXP. In constructors, we don't know anything about
1221 the value being initialized.
1223 ALIAS_THIS serves the same purpose it serves for expand_aggr_init.
1225 FLAGS is just passes to `build_method_call'. See that function for
1229 expand_aggr_init_1 (binfo, true_exp, exp, init, alias_this, flags)
1236 tree type = TREE_TYPE (exp);
1238 my_friendly_assert (init != error_mark_node && type != error_mark_node, 211);
1240 /* Use a function returning the desired type to initialize EXP for us.
1241 If the function is a constructor, and its first argument is
1242 NULL_TREE, know that it was meant for us--just slide exp on
1243 in and expand the constructor. Constructors now come
1246 if (init && TREE_CODE (exp) == VAR_DECL
1247 && TREE_CODE (init) == CONSTRUCTOR
1248 && TREE_HAS_CONSTRUCTOR (init))
1250 tree t = store_init_value (exp, init);
1253 expand_decl_init (exp);
1256 t = build (INIT_EXPR, type, exp, init);
1257 TREE_SIDE_EFFECTS (t) = 1;
1258 expand_expr_stmt (t);
1262 /* We know that expand_default_init can handle everything we want
1264 expand_default_init (binfo, true_exp, exp, init, alias_this, flags);
1267 /* Report an error if NAME is not the name of a user-defined,
1268 aggregate type. If OR_ELSE is nonzero, give an error message. */
1271 is_aggr_typedef (name, or_else)
1277 if (name == error_mark_node)
1280 if (IDENTIFIER_HAS_TYPE_VALUE (name))
1281 type = IDENTIFIER_TYPE_VALUE (name);
1285 cp_error ("`%T' is not an aggregate typedef", name);
1289 if (! IS_AGGR_TYPE (type)
1290 && TREE_CODE (type) != TEMPLATE_TYPE_PARM
1291 && TREE_CODE (type) != TEMPLATE_TEMPLATE_PARM)
1294 cp_error ("`%T' is not an aggregate type", type);
1300 /* Report an error if TYPE is not a user-defined, aggregate type. If
1301 OR_ELSE is nonzero, give an error message. */
1304 is_aggr_type (type, or_else)
1308 if (type == error_mark_node)
1311 if (! IS_AGGR_TYPE (type)
1312 && TREE_CODE (type) != TEMPLATE_TYPE_PARM
1313 && TREE_CODE (type) != TEMPLATE_TEMPLATE_PARM)
1316 cp_error ("`%T' is not an aggregate type", type);
1322 /* Like is_aggr_typedef, but returns typedef if successful. */
1325 get_aggr_from_typedef (name, or_else)
1331 if (name == error_mark_node)
1334 if (IDENTIFIER_HAS_TYPE_VALUE (name))
1335 type = IDENTIFIER_TYPE_VALUE (name);
1339 cp_error ("`%T' fails to be an aggregate typedef", name);
1343 if (! IS_AGGR_TYPE (type)
1344 && TREE_CODE (type) != TEMPLATE_TYPE_PARM
1345 && TREE_CODE (type) != TEMPLATE_TEMPLATE_PARM)
1348 cp_error ("type `%T' is of non-aggregate type", type);
1355 get_type_value (name)
1358 if (name == error_mark_node)
1361 if (IDENTIFIER_HAS_TYPE_VALUE (name))
1362 return IDENTIFIER_TYPE_VALUE (name);
1368 /* This code could just as well go in `class.c', but is placed here for
1371 /* For an expression of the form TYPE :: NAME (PARMLIST), build
1372 the appropriate function call. */
1375 build_member_call (type, name, parmlist)
1376 tree type, name, parmlist;
1381 int dont_use_this = 0;
1382 tree basetype_path, decl;
1384 if (TREE_CODE (name) == TEMPLATE_ID_EXPR
1385 && TREE_CODE (type) == NAMESPACE_DECL)
1387 /* 'name' already refers to the decls from the namespace, since we
1388 hit do_identifier for template_ids. */
1389 my_friendly_assert (is_overloaded_fn (TREE_OPERAND (name, 0)), 980519);
1390 return build_x_function_call (name, parmlist, current_class_ref);
1393 if (type == std_node)
1394 return build_x_function_call (do_scoped_id (name, 0), parmlist,
1396 if (TREE_CODE (type) == NAMESPACE_DECL)
1397 return build_x_function_call (lookup_namespace_name (type, name),
1398 parmlist, current_class_ref);
1400 if (TREE_CODE (name) != TEMPLATE_ID_EXPR)
1403 method_name = TREE_OPERAND (name, 0);
1405 if (TREE_CODE (method_name) == BIT_NOT_EXPR)
1407 method_name = TREE_OPERAND (method_name, 0);
1411 /* This shouldn't be here, and build_member_call shouldn't appear in
1413 if (type && TREE_CODE (type) == IDENTIFIER_NODE
1414 && get_aggr_from_typedef (type, 0) == 0)
1416 tree ns = lookup_name (type, 0);
1417 if (ns && TREE_CODE (ns) == NAMESPACE_DECL)
1419 return build_x_function_call (build_offset_ref (type, name), parmlist, current_class_ref);
1423 if (type == NULL_TREE || ! is_aggr_type (type, 1))
1424 return error_mark_node;
1426 /* An operator we did not like. */
1427 if (name == NULL_TREE)
1428 return error_mark_node;
1432 cp_error ("cannot call destructor `%T::~%T' without object", type,
1434 return error_mark_node;
1437 /* No object? Then just fake one up, and let build_method_call
1438 figure out what to do. */
1439 if (current_class_type == 0
1440 || get_base_distance (type, current_class_type, 0, &basetype_path) == -1)
1445 basetype_path = TYPE_BINFO (type);
1446 decl = build1 (NOP_EXPR, build_pointer_type (type), error_mark_node);
1448 else if (current_class_ptr == 0)
1451 decl = build1 (NOP_EXPR, build_pointer_type (type), error_mark_node);
1455 tree olddecl = current_class_ptr;
1456 tree oldtype = TREE_TYPE (TREE_TYPE (olddecl));
1457 if (oldtype != type)
1459 tree newtype = build_type_variant (type, TYPE_READONLY (oldtype),
1460 TYPE_VOLATILE (oldtype));
1461 decl = convert_force (build_pointer_type (newtype), olddecl, 0);
1467 decl = build_indirect_ref (decl, NULL_PTR);
1469 if (method_name == constructor_name (type)
1470 || method_name == constructor_name_full (type))
1471 return build_functional_cast (type, parmlist);
1472 if ((t = lookup_fnfields (basetype_path, method_name, 0)))
1473 return build_method_call (decl,
1474 TREE_CODE (name) == TEMPLATE_ID_EXPR
1475 ? name : method_name,
1476 parmlist, basetype_path,
1477 LOOKUP_NORMAL|LOOKUP_NONVIRTUAL);
1478 if (TREE_CODE (name) == IDENTIFIER_NODE
1479 && ((t = lookup_field (TYPE_BINFO (type), name, 1, 0))))
1481 if (t == error_mark_node)
1482 return error_mark_node;
1483 if (TREE_CODE (t) == FIELD_DECL)
1487 cp_error ("invalid use of non-static field `%D'", t);
1488 return error_mark_node;
1490 decl = build (COMPONENT_REF, TREE_TYPE (t), decl, t);
1492 else if (TREE_CODE (t) == VAR_DECL)
1496 cp_error ("invalid use of member `%D'", t);
1497 return error_mark_node;
1499 if (TYPE_LANG_SPECIFIC (TREE_TYPE (decl)))
1500 return build_opfncall (CALL_EXPR, LOOKUP_NORMAL, decl,
1501 parmlist, NULL_TREE);
1502 return build_function_call (decl, parmlist);
1506 cp_error ("no method `%T::%D'", type, name);
1507 return error_mark_node;
1511 /* Build a reference to a member of an aggregate. This is not a
1512 C++ `&', but really something which can have its address taken,
1513 and then act as a pointer to member, for example TYPE :: FIELD
1514 can have its address taken by saying & TYPE :: FIELD.
1516 @@ Prints out lousy diagnostics for operator <typename>
1519 @@ This function should be rewritten and placed in search.c. */
1522 build_offset_ref (type, name)
1525 tree decl, fnfields, fields, t = error_mark_node;
1526 tree basebinfo = NULL_TREE;
1527 tree orig_name = name;
1529 /* class templates can come in as TEMPLATE_DECLs here. */
1530 if (TREE_CODE (name) == TEMPLATE_DECL)
1533 if (type == std_node)
1534 return do_scoped_id (name, 0);
1536 if (processing_template_decl || uses_template_parms (type))
1537 return build_min_nt (SCOPE_REF, type, name);
1539 /* Handle namespace names fully here. */
1540 if (TREE_CODE (type) == NAMESPACE_DECL)
1542 t = lookup_namespace_name (type, name);
1543 if (! type_unknown_p (t))
1546 t = convert_from_reference (t);
1551 if (type == NULL_TREE || ! is_aggr_type (type, 1))
1552 return error_mark_node;
1554 if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
1556 /* If the NAME is a TEMPLATE_ID_EXPR, we are looking at
1557 something like `a.template f<int>' or the like. For the most
1558 part, we treat this just like a.f. We do remember, however,
1559 the template-id that was used. */
1560 name = TREE_OPERAND (orig_name, 0);
1561 my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 0);
1564 if (TREE_CODE (name) == BIT_NOT_EXPR)
1566 if (! check_dtor_name (type, name))
1567 cp_error ("qualified type `%T' does not match destructor name `~%T'",
1568 type, TREE_OPERAND (name, 0));
1569 name = dtor_identifier;
1572 /* I think this is wrong, but the draft is unclear. --jason 6/15/98 */
1573 else if (name == constructor_name_full (type)
1574 || name == constructor_name (type))
1575 name = ctor_identifier;
1578 if (TYPE_SIZE (complete_type (type)) == 0)
1580 if (type == current_class_type)
1581 t = IDENTIFIER_CLASS_VALUE (name);
1586 cp_error ("incomplete type `%T' does not have member `%D'", type,
1588 return error_mark_node;
1590 if (TREE_CODE (t) == TYPE_DECL || TREE_CODE (t) == VAR_DECL
1591 || TREE_CODE (t) == CONST_DECL)
1596 if (TREE_CODE (t) == FIELD_DECL)
1597 sorry ("use of member in incomplete aggregate type");
1598 else if (TREE_CODE (t) == FUNCTION_DECL)
1599 sorry ("use of member function in incomplete aggregate type");
1601 my_friendly_abort (52);
1602 return error_mark_node;
1605 if (current_class_type == 0
1606 || get_base_distance (type, current_class_type, 0, &basebinfo) == -1)
1608 basebinfo = TYPE_BINFO (type);
1609 decl = build1 (NOP_EXPR, type, error_mark_node);
1611 else if (current_class_ptr == 0)
1612 decl = build1 (NOP_EXPR, type, error_mark_node);
1614 decl = current_class_ref;
1616 fnfields = lookup_fnfields (basebinfo, name, 1);
1617 fields = lookup_field (basebinfo, name, 0, 0);
1619 if (fields == error_mark_node || fnfields == error_mark_node)
1620 return error_mark_node;
1622 /* A lot of this logic is now handled in lookup_field and
1626 extern int flag_save_memoized_contexts;
1628 /* Go from the TREE_BASELINK to the member function info. */
1629 t = TREE_VALUE (fnfields);
1631 if (TREE_CODE (orig_name) == TEMPLATE_ID_EXPR)
1633 /* The FNFIELDS are going to contain functions that aren't
1634 necessarily templates, and templates that don't
1635 necessarily match the explicit template parameters. We
1636 save all the functions, and the explicit parameters, and
1637 then figure out exactly what to instantiate with what
1638 arguments in instantiate_type. */
1640 if (TREE_CODE (t) != OVERLOAD)
1641 /* The code in instantiate_type which will process this
1642 expects to encounter OVERLOADs, not raw functions. */
1643 t = ovl_cons (t, NULL_TREE);
1645 return build (OFFSET_REF,
1646 build_offset_type (type, unknown_type_node),
1648 build (TEMPLATE_ID_EXPR,
1651 TREE_OPERAND (orig_name, 1)));
1654 if (!really_overloaded_fn (t))
1658 /* Get rid of a potential OVERLOAD around it */
1659 t = OVL_CURRENT (t);
1661 /* unique functions are handled easily. */
1662 basebinfo = TREE_PURPOSE (fnfields);
1663 access = compute_access (basebinfo, t);
1664 if (access == access_protected_node)
1666 cp_error_at ("member function `%#D' is protected", t);
1667 error ("in this context");
1668 return error_mark_node;
1670 if (access == access_private_node)
1672 cp_error_at ("member function `%#D' is private", t);
1673 error ("in this context");
1674 return error_mark_node;
1677 return build (OFFSET_REF, TREE_TYPE (t), decl, t);
1680 /* FNFIELDS is most likely allocated on the search_obstack,
1681 which will go away after this class scope. If we need
1682 to save this value for later (either for memoization
1683 or for use as an initializer for a static variable), then
1686 ??? The smart thing to do for the case of saving initializers
1687 is to resolve them before we're done with this scope. */
1688 if (!TREE_PERMANENT (fnfields)
1689 && ((flag_save_memoized_contexts && toplevel_bindings_p ())
1690 || ! allocation_temporary_p ()))
1691 fnfields = copy_list (fnfields);
1693 t = build_tree_list (error_mark_node, fnfields);
1694 TREE_TYPE (t) = build_offset_type (type, unknown_type_node);
1698 /* Now that we know we are looking for a field, see if we
1699 have access to that field. Lookup_field will give us the
1702 t = lookup_field (basebinfo, name, 1, 0);
1704 if (t == error_mark_node)
1705 return error_mark_node;
1709 cp_error ("`%D' is not a member of type `%T'", name, type);
1710 return error_mark_node;
1713 if (TREE_CODE (t) == TYPE_DECL)
1718 /* static class members and class-specific enum
1719 values can be returned without further ado. */
1720 if (TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == CONST_DECL)
1723 return convert_from_reference (t);
1726 if (TREE_CODE (t) == FIELD_DECL && DECL_BIT_FIELD (t))
1728 cp_error ("illegal pointer to bit field `%D'", t);
1729 return error_mark_node;
1732 /* static class functions too. */
1733 if (TREE_CODE (t) == FUNCTION_DECL
1734 && TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
1735 my_friendly_abort (53);
1737 /* In member functions, the form `type::name' is no longer
1738 equivalent to `this->type::name', at least not until
1739 resolve_offset_ref. */
1740 return build (OFFSET_REF, build_offset_type (type, TREE_TYPE (t)), decl, t);
1743 /* If a OFFSET_REF made it through to here, then it did
1744 not have its address taken. */
1747 resolve_offset_ref (exp)
1750 tree type = TREE_TYPE (exp);
1751 tree base = NULL_TREE;
1753 tree basetype, addr;
1755 if (TREE_CODE (exp) == TREE_LIST)
1757 cp_pedwarn ("assuming & on overloaded member function");
1758 return build_unary_op (ADDR_EXPR, exp, 0);
1761 if (TREE_CODE (exp) == OFFSET_REF)
1763 member = TREE_OPERAND (exp, 1);
1764 base = TREE_OPERAND (exp, 0);
1768 my_friendly_assert (TREE_CODE (type) == OFFSET_TYPE, 214);
1769 if (TYPE_OFFSET_BASETYPE (type) != current_class_type)
1771 error ("object missing in use of pointer-to-member construct");
1772 return error_mark_node;
1775 type = TREE_TYPE (type);
1776 base = current_class_ref;
1779 if ((TREE_CODE (member) == VAR_DECL
1780 && ! TYPE_PTRMEMFUNC_P (TREE_TYPE (member)))
1781 || TREE_CODE (TREE_TYPE (member)) == FUNCTION_TYPE
1782 || TREE_CODE (TREE_TYPE (member)) == METHOD_TYPE)
1784 /* These were static members. */
1785 if (mark_addressable (member) == 0)
1786 return error_mark_node;
1790 if (TREE_CODE (TREE_TYPE (member)) == POINTER_TYPE
1791 && TREE_CODE (TREE_TYPE (TREE_TYPE (member))) == METHOD_TYPE)
1794 /* Syntax error can cause a member which should
1795 have been seen as static to be grok'd as non-static. */
1796 if (TREE_CODE (member) == FIELD_DECL && current_class_ref == NULL_TREE)
1798 if (TREE_ADDRESSABLE (member) == 0)
1800 cp_error_at ("member `%D' is non-static but referenced as a static member",
1802 error ("at this point in file");
1803 TREE_ADDRESSABLE (member) = 1;
1805 return error_mark_node;
1808 /* The first case is really just a reference to a member of `this'. */
1809 if (TREE_CODE (member) == FIELD_DECL
1810 && (base == current_class_ref
1811 || (TREE_CODE (base) == NOP_EXPR
1812 && TREE_OPERAND (base, 0) == error_mark_node)))
1814 tree basetype_path, access;
1816 if (TREE_CODE (exp) == OFFSET_REF && TREE_CODE (type) == OFFSET_TYPE)
1817 basetype = TYPE_OFFSET_BASETYPE (type);
1819 basetype = DECL_CONTEXT (member);
1821 base = current_class_ptr;
1823 if (get_base_distance (basetype, TREE_TYPE (TREE_TYPE (base)), 0, &basetype_path) < 0)
1825 error_not_base_type (basetype, TREE_TYPE (TREE_TYPE (base)));
1826 return error_mark_node;
1828 /* Kludge: we need to use basetype_path now, because
1829 convert_pointer_to will bash it. */
1830 access = compute_access (basetype_path, member);
1831 addr = convert_pointer_to (basetype, base);
1832 if (access == access_public_node)
1833 return build (COMPONENT_REF, TREE_TYPE (member),
1834 build_indirect_ref (addr, NULL_PTR), member);
1835 if (access == access_protected_node)
1837 cp_error_at ("member `%D' is protected", member);
1838 error ("in this context");
1839 return error_mark_node;
1841 if (access == access_private_node)
1843 cp_error_at ("member `%D' is private", member);
1844 error ("in this context");
1845 return error_mark_node;
1847 my_friendly_abort (55);
1850 /* Ensure that we have an object. */
1851 if (TREE_CODE (base) == NOP_EXPR
1852 && TREE_OPERAND (base, 0) == error_mark_node)
1853 addr = error_mark_node;
1856 /* If this is a reference to a member function, then return the
1857 address of the member function (which may involve going
1858 through the object's vtable), otherwise, return an expression
1859 for the dereferenced pointer-to-member construct. */
1860 addr = build_unary_op (ADDR_EXPR, base, 0);
1863 if (TREE_CODE (TREE_TYPE (member)) == OFFSET_TYPE)
1865 if (addr == error_mark_node)
1867 cp_error ("object missing in `%E'", exp);
1868 return error_mark_node;
1871 basetype = TYPE_OFFSET_BASETYPE (TREE_TYPE (member));
1872 addr = convert_pointer_to (basetype, addr);
1873 member = cp_convert (ptrdiff_type_node,
1874 build_unary_op (ADDR_EXPR, member, 0));
1876 /* Pointer to data members are offset by one, so that a null
1877 pointer with a real value of 0 is distinguishable from an
1878 offset of the first member of a structure. */
1879 member = build_binary_op (MINUS_EXPR, member,
1880 cp_convert (ptrdiff_type_node, integer_one_node),
1883 return build1 (INDIRECT_REF, type,
1884 build (PLUS_EXPR, build_pointer_type (type),
1887 else if (TYPE_PTRMEMFUNC_P (TREE_TYPE (member)))
1889 return get_member_function_from_ptrfunc (&addr, member);
1891 my_friendly_abort (56);
1896 /* Return either DECL or its known constant value (if it has one). */
1899 decl_constant_value (decl)
1902 if (! TREE_THIS_VOLATILE (decl)
1904 /* These may be necessary for C, but they break C++. */
1905 ! TREE_PUBLIC (decl)
1906 /* Don't change a variable array bound or initial value to a constant
1907 in a place where a variable is invalid. */
1910 && DECL_INITIAL (decl) != 0
1911 && DECL_INITIAL (decl) != error_mark_node
1912 /* This is invalid if initial value is not constant.
1913 If it has either a function call, a memory reference,
1914 or a variable, then re-evaluating it could give different results. */
1915 && TREE_CONSTANT (DECL_INITIAL (decl))
1916 /* Check for cases where this is sub-optimal, even though valid. */
1917 && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR
1919 /* We must allow this to work outside of functions so that
1920 static constants can be used for array sizes. */
1921 && current_function_decl != 0
1922 && DECL_MODE (decl) != BLKmode
1925 return DECL_INITIAL (decl);
1929 /* Common subroutines of build_new and build_vec_delete. */
1931 /* Common interface for calling "builtin" functions that are not
1935 build_builtin_call (type, node, arglist)
1940 tree rval = build (CALL_EXPR, type, node, arglist, NULL_TREE);
1941 TREE_SIDE_EFFECTS (rval) = 1;
1942 assemble_external (TREE_OPERAND (node, 0));
1943 TREE_USED (TREE_OPERAND (node, 0)) = 1;
1947 /* Generate a C++ "new" expression. DECL is either a TREE_LIST
1948 (which needs to go through some sort of groktypename) or it
1949 is the name of the class we are newing. INIT is an initialization value.
1950 It is either an EXPRLIST, an EXPR_NO_COMMAS, or something in braces.
1951 If INIT is void_type_node, it means do *not* call a constructor
1954 For types with constructors, the data returned is initialized
1955 by the appropriate constructor.
1957 Whether the type has a constructor or not, if it has a pointer
1958 to a virtual function table, then that pointer is set up
1961 Unless I am mistaken, a call to new () will return initialized
1962 data regardless of whether the constructor itself is private or
1963 not. NOPE; new fails if the constructor is private (jcm).
1965 Note that build_new does nothing to assure that any special
1966 alignment requirements of the type are met. Rather, it leaves
1967 it up to malloc to do the right thing. Otherwise, folding to
1968 the right alignment cal cause problems if the user tries to later
1969 free the memory returned by `new'.
1971 PLACEMENT is the `placement' list for user-defined operator new (). */
1973 extern int flag_check_new;
1976 build_new (placement, decl, init, use_global_new)
1982 tree nelts = NULL_TREE, t;
1985 tree pending_sizes = NULL_TREE;
1987 if (decl == error_mark_node)
1988 return error_mark_node;
1990 if (TREE_CODE (decl) == TREE_LIST)
1992 tree absdcl = TREE_VALUE (decl);
1993 tree last_absdcl = NULL_TREE;
1994 int old_immediate_size_expand = 0;
1996 if (current_function_decl
1997 && DECL_CONSTRUCTOR_P (current_function_decl))
1999 old_immediate_size_expand = immediate_size_expand;
2000 immediate_size_expand = 0;
2003 nelts = integer_one_node;
2005 if (absdcl && TREE_CODE (absdcl) == CALL_EXPR)
2006 my_friendly_abort (215);
2007 while (absdcl && TREE_CODE (absdcl) == INDIRECT_REF)
2009 last_absdcl = absdcl;
2010 absdcl = TREE_OPERAND (absdcl, 0);
2013 if (absdcl && TREE_CODE (absdcl) == ARRAY_REF)
2015 /* probably meant to be a vec new */
2018 while (TREE_OPERAND (absdcl, 0)
2019 && TREE_CODE (TREE_OPERAND (absdcl, 0)) == ARRAY_REF)
2021 last_absdcl = absdcl;
2022 absdcl = TREE_OPERAND (absdcl, 0);
2026 this_nelts = TREE_OPERAND (absdcl, 1);
2027 if (this_nelts != error_mark_node)
2029 if (this_nelts == NULL_TREE)
2030 error ("new of array type fails to specify size");
2031 else if (processing_template_decl)
2034 absdcl = TREE_OPERAND (absdcl, 0);
2038 this_nelts = save_expr (cp_convert (sizetype, this_nelts));
2039 absdcl = TREE_OPERAND (absdcl, 0);
2040 if (this_nelts == integer_zero_node)
2042 warning ("zero size array reserves no space");
2043 nelts = integer_zero_node;
2046 nelts = build_binary_op (MULT_EXPR, nelts, this_nelts, 1);
2050 nelts = integer_zero_node;
2054 TREE_OPERAND (last_absdcl, 0) = absdcl;
2056 TREE_VALUE (decl) = absdcl;
2058 type = groktypename (decl);
2059 if (! type || type == error_mark_node)
2061 immediate_size_expand = old_immediate_size_expand;
2062 return error_mark_node;
2065 if (current_function_decl
2066 && DECL_CONSTRUCTOR_P (current_function_decl))
2068 pending_sizes = get_pending_sizes ();
2069 immediate_size_expand = old_immediate_size_expand;
2072 else if (TREE_CODE (decl) == IDENTIFIER_NODE)
2074 if (IDENTIFIER_HAS_TYPE_VALUE (decl))
2076 /* An aggregate type. */
2077 type = IDENTIFIER_TYPE_VALUE (decl);
2078 decl = TYPE_MAIN_DECL (type);
2082 /* A builtin type. */
2083 decl = lookup_name (decl, 1);
2084 my_friendly_assert (TREE_CODE (decl) == TYPE_DECL, 215);
2085 type = TREE_TYPE (decl);
2088 else if (TREE_CODE (decl) == TYPE_DECL)
2090 type = TREE_TYPE (decl);
2095 decl = TYPE_MAIN_DECL (type);
2098 if (processing_template_decl)
2101 t = min_tree_cons (min_tree_cons (NULL_TREE, type, NULL_TREE),
2102 build_min_nt (ARRAY_REF, NULL_TREE, nelts),
2107 rval = build_min_nt (NEW_EXPR, placement, t, init);
2108 NEW_EXPR_USE_GLOBAL (rval) = use_global_new;
2112 /* ``A reference cannot be created by the new operator. A reference
2113 is not an object (8.2.2, 8.4.3), so a pointer to it could not be
2114 returned by new.'' ARM 5.3.3 */
2115 if (TREE_CODE (type) == REFERENCE_TYPE)
2117 error ("new cannot be applied to a reference type");
2118 type = TREE_TYPE (type);
2121 if (TREE_CODE (type) == FUNCTION_TYPE)
2123 error ("new cannot be applied to a function type");
2124 return error_mark_node;
2127 /* When the object being created is an array, the new-expression yields a
2128 pointer to the initial element (if any) of the array. For example,
2129 both new int and new int[10] return an int*. 5.3.4. */
2130 if (TREE_CODE (type) == ARRAY_TYPE && has_array == 0)
2132 nelts = array_type_nelts_top (type);
2134 type = TREE_TYPE (type);
2138 t = build_nt (ARRAY_REF, type, nelts);
2142 rval = build (NEW_EXPR, build_pointer_type (type), placement, t, init);
2143 NEW_EXPR_USE_GLOBAL (rval) = use_global_new;
2144 TREE_SIDE_EFFECTS (rval) = 1;
2146 /* Wrap it in a NOP_EXPR so warn_if_unused_value doesn't complain. */
2147 rval = build1 (NOP_EXPR, TREE_TYPE (rval), rval);
2148 TREE_NO_UNUSED_WARNING (rval) = 1;
2151 rval = build_compound_expr (chainon (pending_sizes,
2152 build_expr_list (NULL_TREE, rval)));
2157 /* Called from cplus_expand_expr when expanding a NEW_EXPR. The return
2158 value is immediately handed to expand_expr. */
2164 tree placement, init;
2165 tree type, true_type, size, rval;
2166 tree nelts = NULL_TREE;
2167 tree alloc_expr, alloc_node = NULL_TREE;
2169 enum tree_code code = NEW_EXPR;
2170 int use_cookie, nothrow, check_new;
2173 placement = TREE_OPERAND (exp, 0);
2174 type = TREE_OPERAND (exp, 1);
2175 init = TREE_OPERAND (exp, 2);
2176 use_global_new = NEW_EXPR_USE_GLOBAL (exp);
2178 if (TREE_CODE (type) == ARRAY_REF)
2181 nelts = TREE_OPERAND (type, 1);
2182 type = TREE_OPERAND (type, 0);
2186 if (TYPE_READONLY (type) || TYPE_VOLATILE (type))
2187 type = TYPE_MAIN_VARIANT (type);
2189 /* If our base type is an array, then make sure we know how many elements
2191 while (TREE_CODE (true_type) == ARRAY_TYPE)
2193 tree this_nelts = array_type_nelts_top (true_type);
2194 nelts = build_binary_op (MULT_EXPR, nelts, this_nelts, 1);
2195 true_type = TREE_TYPE (true_type);
2198 if (!complete_type_or_else (true_type))
2199 return error_mark_node;
2202 size = fold (build_binary_op (MULT_EXPR, size_in_bytes (true_type),
2205 size = size_in_bytes (type);
2207 if (TREE_CODE (true_type) == VOID_TYPE)
2209 error ("invalid type `void' for new");
2210 return error_mark_node;
2213 if (TYPE_LANG_SPECIFIC (true_type)
2214 && CLASSTYPE_ABSTRACT_VIRTUALS (true_type))
2216 abstract_virtuals_error (NULL_TREE, true_type);
2217 return error_mark_node;
2220 if (TYPE_LANG_SPECIFIC (true_type) && IS_SIGNATURE (true_type))
2222 signature_error (NULL_TREE, true_type);
2223 return error_mark_node;
2227 /* Get a little extra space to store a couple of things before the new'ed
2228 array, if this isn't the default placement new. */
2230 use_cookie = (has_array && TYPE_VEC_NEW_USES_COOKIE (true_type)
2231 && ! (placement && ! TREE_CHAIN (placement)
2232 && TREE_TYPE (TREE_VALUE (placement)) == ptr_type_node));
2234 /* Get a little extra space to store a couple of things before the new'ed
2235 array, if this is either non-placement new or new (nothrow). */
2237 use_cookie = (has_array && TYPE_VEC_NEW_USES_COOKIE (true_type)
2238 && (! placement || nothrow));
2243 tree extra = BI_header_size;
2245 size = size_binop (PLUS_EXPR, size, extra);
2250 code = VEC_NEW_EXPR;
2252 if (init && pedantic)
2253 cp_pedwarn ("initialization in array new");
2256 /* Allocate the object. */
2258 if (! has_array && ! placement && flag_this_is_variable > 0
2259 && TYPE_NEEDS_CONSTRUCTING (true_type) && init != void_type_node)
2261 if (init == NULL_TREE || TREE_CODE (init) == TREE_LIST)
2265 error ("constructors take parameter lists");
2266 return error_mark_node;
2273 if (flag_exceptions)
2274 /* We will use RVAL when generating an exception handler for
2275 this new-expression, so we must save it. */
2276 susp = suspend_momentary ();
2278 rval = build_op_new_call
2279 (code, true_type, expr_tree_cons (NULL_TREE, size, placement),
2280 LOOKUP_NORMAL | (use_global_new * LOOKUP_GLOBAL));
2281 rval = cp_convert (build_pointer_type (true_type), rval);
2283 if (flag_exceptions)
2284 resume_momentary (susp);
2287 /* unless an allocation function is declared with an empty excep-
2288 tion-specification (_except.spec_), throw(), it indicates failure to
2289 allocate storage by throwing a bad_alloc exception (clause _except_,
2290 _lib.bad.alloc_); it returns a non-null pointer otherwise If the allo-
2291 cation function is declared with an empty exception-specification,
2292 throw(), it returns null to indicate failure to allocate storage and a
2293 non-null pointer otherwise.
2295 So check for a null exception spec on the op new we just called. */
2300 /* The CALL_EXPR. */
2301 tree t = TREE_OPERAND (rval, 0);
2303 t = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
2304 t = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t));
2306 if (t && TREE_VALUE (t) == NULL_TREE)
2309 check_new = flag_check_new || nothrow;
2311 if ((check_new || flag_exceptions) && rval)
2313 alloc_expr = get_target_expr (rval);
2314 alloc_node = rval = TREE_OPERAND (alloc_expr, 0);
2317 alloc_expr = NULL_TREE;
2319 /* if rval is NULL_TREE I don't have to allocate it, but are we totally
2320 sure we have some extra bytes in that case for the BI_header_size
2321 cookies? And how does that interact with the code below? (mrs) */
2322 /* Finish up some magic for new'ed arrays */
2323 if (use_cookie && rval != NULL_TREE)
2325 tree extra = BI_header_size;
2327 rval = convert (string_type_node, rval); /* for ptr arithmetic */
2328 rval = save_expr (build_binary_op (PLUS_EXPR, rval, extra, 1));
2329 /* Store header info. */
2330 cookie = build_indirect_ref (build (MINUS_EXPR,
2331 build_pointer_type (BI_header_type),
2332 rval, extra), NULL_PTR);
2333 exp1 = build (MODIFY_EXPR, void_type_node,
2334 build_component_ref (cookie, nc_nelts_field_id,
2337 TREE_SIDE_EFFECTS (exp1) = 1;
2338 rval = cp_convert (build_pointer_type (true_type), rval);
2339 rval = build_compound_expr
2340 (expr_tree_cons (NULL_TREE, exp1,
2341 build_expr_list (NULL_TREE, rval)));
2344 if (rval == error_mark_node)
2345 return error_mark_node;
2347 /* Don't call any constructors or do any initialization. */
2348 if (init == void_type_node)
2351 if (TYPE_NEEDS_CONSTRUCTING (type) || init)
2353 if (! TYPE_NEEDS_CONSTRUCTING (type)
2354 && ! IS_AGGR_TYPE (type) && ! has_array)
2356 /* New 2.0 interpretation: `new int (10)' means
2357 allocate an int, and initialize it with 10. */
2360 rval = save_expr (rval);
2361 deref = build_indirect_ref (rval, NULL_PTR);
2362 TREE_READONLY (deref) = 0;
2364 if (TREE_CHAIN (init) != NULL_TREE)
2365 pedwarn ("initializer list being treated as compound expression");
2366 else if (TREE_CODE (init) == CONSTRUCTOR)
2368 pedwarn ("initializer list appears where operand should be used");
2369 init = TREE_OPERAND (init, 1);
2371 init = build_compound_expr (init);
2373 init = convert_for_initialization (deref, type, init, LOOKUP_NORMAL,
2374 "new", NULL_TREE, 0);
2375 rval = build (COMPOUND_EXPR, TREE_TYPE (rval),
2376 build_modify_expr (deref, NOP_EXPR, init),
2378 TREE_NO_UNUSED_WARNING (rval) = 1;
2379 TREE_SIDE_EFFECTS (rval) = 1;
2381 else if (! has_array)
2384 /* Constructors are never virtual. If it has an initialization, we
2385 need to complain if we aren't allowed to use the ctor that took
2387 int flags = LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_COMPLAIN;
2389 if (rval && TYPE_USES_VIRTUAL_BASECLASSES (true_type))
2391 init = expr_tree_cons (NULL_TREE, integer_one_node, init);
2392 flags |= LOOKUP_HAS_IN_CHARGE;
2397 if (newrval && TREE_CODE (TREE_TYPE (newrval)) == POINTER_TYPE)
2398 newrval = build_indirect_ref (newrval, NULL_PTR);
2400 newrval = build_method_call (newrval, ctor_identifier,
2401 init, TYPE_BINFO (true_type), flags);
2403 if (newrval == NULL_TREE || newrval == error_mark_node)
2404 return error_mark_node;
2407 TREE_HAS_CONSTRUCTOR (rval) = 1;
2410 rval = build (VEC_INIT_EXPR, TREE_TYPE (rval),
2411 save_expr (rval), init, nelts);
2413 /* If any part of the object initialization terminates by throwing
2414 an exception and the new-expression does not contain a
2415 new-placement, then the deallocation function is called to free
2416 the memory in which the object was being constructed. */
2417 if (flag_exceptions && alloc_expr)
2419 enum tree_code dcode = has_array ? VEC_DELETE_EXPR : DELETE_EXPR;
2420 tree cleanup, fn = NULL_TREE;
2421 int flags = LOOKUP_NORMAL | (use_global_new * LOOKUP_GLOBAL);
2423 /* All cleanups must last longer than normal. */
2424 int yes = suspend_momentary ();
2428 flags |= LOOKUP_SPECULATIVELY;
2430 /* We expect alloc_expr to look like a TARGET_EXPR around
2431 a NOP_EXPR around the CALL_EXPR we want. */
2432 fn = TREE_OPERAND (alloc_expr, 1);
2433 fn = TREE_OPERAND (fn, 0);
2436 /* Copy size to the saveable obstack. */
2437 size = copy_node (size);
2439 cleanup = build_op_delete_call (dcode, alloc_node, size, flags, fn);
2441 resume_momentary (yes);
2443 /* Ack! First we allocate the memory. Then we set our sentry
2444 variable to true, and expand a cleanup that deletes the memory
2445 if sentry is true. Then we run the constructor and store the
2446 returned pointer in buf. Then we clear sentry and return buf. */
2451 /* Disable this until flow is fixed so that it doesn't
2452 think the initialization of sentry is a dead write. */
2453 tree end, sentry, begin, buf, t = TREE_TYPE (rval);
2455 begin = get_target_expr (boolean_true_node);
2456 sentry = TREE_OPERAND (begin, 0);
2458 yes = suspend_momentary ();
2459 TREE_OPERAND (begin, 2)
2460 = build (COND_EXPR, void_type_node, sentry,
2461 cleanup, void_zero_node);
2462 resume_momentary (yes);
2464 rval = get_target_expr (rval);
2466 end = build (MODIFY_EXPR, TREE_TYPE (sentry),
2467 sentry, boolean_false_node);
2468 TREE_SIDE_EFFECTS (end) = 1;
2470 buf = TREE_OPERAND (rval, 0);
2472 rval = build (COMPOUND_EXPR, t, begin,
2473 build (COMPOUND_EXPR, t, rval,
2474 build (COMPOUND_EXPR, t, end, buf)));
2476 /* FIXME: this is a workaround for a crash due to overlapping
2477 exception regions. Cleanups shouldn't really happen here. */
2478 rval = build1 (CLEANUP_POINT_EXPR, TREE_TYPE (rval), rval);
2480 rval = build (TRY_CATCH_EXPR, TREE_TYPE (rval), rval, cleanup);
2481 rval = build (COMPOUND_EXPR, TREE_TYPE (rval), alloc_expr, rval);
2486 else if (TYPE_READONLY (true_type))
2487 cp_error ("uninitialized const in `new' of `%#T'", true_type);
2491 if (alloc_expr && rval == alloc_node)
2493 rval = TREE_OPERAND (alloc_expr, 1);
2494 alloc_expr = NULL_TREE;
2497 if (check_new && alloc_expr)
2499 /* Did we modify the storage? */
2500 tree ifexp = build_binary_op (NE_EXPR, alloc_node,
2501 integer_zero_node, 1);
2502 rval = build_conditional_expr (ifexp, rval, alloc_node);
2506 rval = build (COMPOUND_EXPR, TREE_TYPE (rval), alloc_expr, rval);
2508 if (rval && TREE_TYPE (rval) != build_pointer_type (type))
2510 /* The type of new int [3][3] is not int *, but int [3] * */
2511 rval = build_c_cast (build_pointer_type (type), rval);
2518 build_vec_delete_1 (base, maxindex, type, auto_delete_vec, auto_delete,
2520 tree base, maxindex, type;
2521 tree auto_delete_vec, auto_delete;
2522 int use_global_delete;
2525 tree ptype = build_pointer_type (type = complete_type (type));
2526 tree size_exp = size_in_bytes (type);
2528 /* Temporary variables used by the loop. */
2529 tree tbase, tbase_init;
2531 /* This is the body of the loop that implements the deletion of a
2532 single element, and moves temp variables to next elements. */
2535 /* This is the LOOP_EXPR that governs the deletion of the elements. */
2538 /* This is the thing that governs what to do after the loop has run. */
2539 tree deallocate_expr = 0;
2541 /* This is the BIND_EXPR which holds the outermost iterator of the
2542 loop. It is convenient to set this variable up and test it before
2543 executing any other code in the loop.
2544 This is also the containing expression returned by this function. */
2545 tree controller = NULL_TREE;
2547 if (! IS_AGGR_TYPE (type) || ! TYPE_NEEDS_DESTRUCTOR (type))
2549 loop = integer_zero_node;
2553 /* The below is short by BI_header_size */
2554 virtual_size = fold (size_binop (MULT_EXPR, size_exp, maxindex));
2556 tbase = build_decl (VAR_DECL, NULL_TREE, ptype);
2557 tbase_init = build_modify_expr (tbase, NOP_EXPR,
2558 fold (build (PLUS_EXPR, ptype,
2561 DECL_REGISTER (tbase) = 1;
2562 controller = build (BIND_EXPR, void_type_node, tbase, NULL_TREE, NULL_TREE);
2563 TREE_SIDE_EFFECTS (controller) = 1;
2565 if (auto_delete != integer_zero_node
2566 && auto_delete != integer_two_node)
2568 tree base_tbd = cp_convert (ptype,
2569 build_binary_op (MINUS_EXPR,
2570 cp_convert (ptr_type_node, base),
2573 /* This is the real size */
2574 virtual_size = size_binop (PLUS_EXPR, virtual_size, BI_header_size);
2575 body = build_expr_list (NULL_TREE,
2576 build_x_delete (ptype, base_tbd,
2577 2 | use_global_delete,
2579 body = build (COND_EXPR, void_type_node,
2580 build (BIT_AND_EXPR, integer_type_node,
2581 auto_delete, integer_one_node),
2582 body, integer_zero_node);
2587 body = expr_tree_cons (NULL_TREE,
2588 build_delete (ptype, tbase, auto_delete,
2589 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1),
2592 body = expr_tree_cons (NULL_TREE,
2593 build_modify_expr (tbase, NOP_EXPR, build (MINUS_EXPR, ptype, tbase, size_exp)),
2596 body = expr_tree_cons (NULL_TREE,
2597 build (EXIT_EXPR, void_type_node,
2598 build (EQ_EXPR, boolean_type_node, base, tbase)),
2601 loop = build (LOOP_EXPR, void_type_node, build_compound_expr (body));
2603 loop = expr_tree_cons (NULL_TREE, tbase_init,
2604 expr_tree_cons (NULL_TREE, loop, NULL_TREE));
2605 loop = build_compound_expr (loop);
2608 /* If the delete flag is one, or anything else with the low bit set,
2609 delete the storage. */
2610 if (auto_delete_vec == integer_zero_node
2611 || auto_delete_vec == integer_two_node)
2612 deallocate_expr = integer_zero_node;
2617 /* The below is short by BI_header_size */
2618 virtual_size = fold (size_binop (MULT_EXPR, size_exp, maxindex));
2620 if (! TYPE_VEC_NEW_USES_COOKIE (type))
2625 base_tbd = cp_convert (ptype,
2626 build_binary_op (MINUS_EXPR,
2627 cp_convert (string_type_node, base),
2630 /* True size with header. */
2631 virtual_size = size_binop (PLUS_EXPR, virtual_size, BI_header_size);
2633 deallocate_expr = build_x_delete (ptype, base_tbd,
2634 2 | use_global_delete,
2636 if (auto_delete_vec != integer_one_node)
2637 deallocate_expr = build (COND_EXPR, void_type_node,
2638 build (BIT_AND_EXPR, integer_type_node,
2639 auto_delete_vec, integer_one_node),
2640 deallocate_expr, integer_zero_node);
2643 if (loop && deallocate_expr != integer_zero_node)
2645 body = expr_tree_cons (NULL_TREE, loop,
2646 expr_tree_cons (NULL_TREE, deallocate_expr, NULL_TREE));
2647 body = build_compound_expr (body);
2652 /* Outermost wrapper: If pointer is null, punt. */
2653 body = build (COND_EXPR, void_type_node,
2654 build (NE_EXPR, boolean_type_node, base, integer_zero_node),
2655 body, integer_zero_node);
2656 body = build1 (NOP_EXPR, void_type_node, body);
2660 TREE_OPERAND (controller, 1) = body;
2664 return cp_convert (void_type_node, body);
2667 /* Build a tree to cleanup partially built arrays.
2668 BASE is that starting address of the array.
2669 COUNT is the count of objects that have been built, that need destroying.
2670 TYPE is the type of elements in the array. */
2673 build_array_eh_cleanup (base, count, type)
2674 tree base, count, type;
2676 tree expr = build_vec_delete_1 (base, count, type, integer_two_node,
2677 integer_zero_node, 0);
2681 /* `expand_vec_init' performs initialization of a vector of aggregate
2684 DECL is passed only for error reporting, and provides line number
2685 and source file name information.
2686 BASE is the space where the vector will be.
2687 MAXINDEX is the maximum index of the array (one less than the
2688 number of elements).
2689 INIT is the (possibly NULL) initializer.
2691 FROM_ARRAY is 0 if we should init everything with INIT
2692 (i.e., every element initialized from INIT).
2693 FROM_ARRAY is 1 if we should index into INIT in parallel
2694 with initialization of DECL.
2695 FROM_ARRAY is 2 if we should index into INIT in parallel,
2696 but use assignment instead of initialization. */
2699 expand_vec_init (decl, base, maxindex, init, from_array)
2700 tree decl, base, maxindex, init;
2704 tree iterator, base2 = NULL_TREE;
2705 tree type = TREE_TYPE (TREE_TYPE (base));
2708 maxindex = cp_convert (ptrdiff_type_node, maxindex);
2709 if (maxindex == error_mark_node)
2710 return error_mark_node;
2712 if (current_function_decl == NULL_TREE)
2714 rval = make_tree_vec (3);
2715 TREE_VEC_ELT (rval, 0) = base;
2716 TREE_VEC_ELT (rval, 1) = maxindex;
2717 TREE_VEC_ELT (rval, 2) = init;
2721 size = size_in_bytes (type);
2723 /* Set to zero in case size is <= 0. Optimizer will delete this if
2724 it is not needed. */
2725 rval = get_temp_regvar (build_pointer_type (type),
2726 cp_convert (build_pointer_type (type), null_pointer_node));
2727 base = default_conversion (base);
2728 base = cp_convert (build_pointer_type (type), base);
2729 expand_assignment (rval, base, 0, 0);
2730 base = get_temp_regvar (build_pointer_type (type), base);
2732 if (init != NULL_TREE
2733 && TREE_CODE (init) == CONSTRUCTOR
2734 && (! decl || TREE_TYPE (init) == TREE_TYPE (decl)))
2736 /* Initialization of array from {...}. */
2737 tree elts = CONSTRUCTOR_ELTS (init);
2738 tree baseref = build1 (INDIRECT_REF, type, base);
2739 tree baseinc = build (PLUS_EXPR, build_pointer_type (type), base, size);
2740 int host_i = TREE_INT_CST_LOW (maxindex);
2742 if (IS_AGGR_TYPE (type))
2747 expand_aggr_init (baseref, TREE_VALUE (elts), 0, 0);
2749 expand_assignment (base, baseinc, 0, 0);
2750 elts = TREE_CHAIN (elts);
2752 /* Initialize any elements by default if possible. */
2755 if (TYPE_NEEDS_CONSTRUCTING (type) == 0)
2758 use_variable (DECL_RTL (base));
2762 iterator = get_temp_regvar (ptrdiff_type_node,
2763 build_int_2 (host_i, 0));
2765 goto init_by_default;
2771 expand_assignment (baseref, TREE_VALUE (elts), 0, 0);
2773 expand_assignment (base, baseinc, 0, 0);
2774 elts = TREE_CHAIN (elts);
2778 use_variable (DECL_RTL (base));
2784 iterator = get_temp_regvar (ptrdiff_type_node, maxindex);
2789 /* If initializing one array from another,
2790 initialize element by element. */
2793 /* We rely upon the below calls the do argument checking */
2794 if (decl == NULL_TREE)
2796 sorry ("initialization of array from dissimilar array type");
2797 return error_mark_node;
2801 base2 = default_conversion (init);
2802 itype = TREE_TYPE (base2);
2803 base2 = get_temp_regvar (itype, base2);
2804 itype = TREE_TYPE (itype);
2806 else if (TYPE_LANG_SPECIFIC (type)
2807 && TYPE_NEEDS_CONSTRUCTING (type)
2808 && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
2810 error ("initializer ends prematurely");
2811 return error_mark_node;
2815 expand_start_cond (build (GE_EXPR, boolean_type_node,
2816 iterator, integer_zero_node), 0);
2817 if (TYPE_NEEDS_DESTRUCTOR (type))
2818 expand_eh_region_start ();
2819 expand_start_loop_continue_elsewhere (1);
2821 /* The initialization of each array element is a full-expression. */
2822 expand_start_target_temps ();
2826 tree to = build1 (INDIRECT_REF, type, base);
2830 from = build1 (INDIRECT_REF, itype, base2);
2834 if (from_array == 2)
2835 expand_expr_stmt (build_modify_expr (to, NOP_EXPR, from));
2836 else if (TYPE_NEEDS_CONSTRUCTING (type))
2837 expand_aggr_init (to, from, 0, 0);
2839 expand_assignment (to, from, 0, 0);
2841 my_friendly_abort (57);
2843 else if (TREE_CODE (type) == ARRAY_TYPE)
2846 sorry ("cannot initialize multi-dimensional array with initializer");
2847 expand_vec_init (decl, build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (type)), base),
2848 array_type_nelts (type), 0, 0);
2851 expand_aggr_init (build1 (INDIRECT_REF, type, base), init, 0, 0);
2853 expand_assignment (base,
2854 build (PLUS_EXPR, build_pointer_type (type), base, size),
2857 expand_assignment (base2,
2858 build (PLUS_EXPR, build_pointer_type (type), base2, size), 0, 0);
2860 /* Cleanup any temporaries needed for the initial value. */
2861 expand_end_target_temps ();
2863 expand_loop_continue_here ();
2864 expand_exit_loop_if_false (0, build (NE_EXPR, boolean_type_node,
2865 build (PREDECREMENT_EXPR, ptrdiff_type_node, iterator, integer_one_node), minus_one));
2869 use_variable (DECL_RTL (base));
2871 use_variable (DECL_RTL (base2));
2874 if (TYPE_NEEDS_DESTRUCTOR (type) && flag_exceptions)
2876 /* We have to ensure that this can live to the cleanup
2877 expansion time, since we know it is only ever needed
2878 once, generate code now. */
2879 push_obstacks_nochange ();
2880 resume_temporary_allocation ();
2882 tree e1, cleanup = make_node (RTL_EXPR);
2883 TREE_TYPE (cleanup) = void_type_node;
2884 RTL_EXPR_RTL (cleanup) = const0_rtx;
2885 TREE_SIDE_EFFECTS (cleanup) = 1;
2886 do_pending_stack_adjust ();
2887 start_sequence_for_rtl_expr (cleanup);
2889 e1 = build_array_eh_cleanup
2891 build_binary_op (MINUS_EXPR, maxindex, iterator, 1),
2893 expand_expr (e1, const0_rtx, VOIDmode, EXPAND_NORMAL);
2894 do_pending_stack_adjust ();
2895 RTL_EXPR_SEQUENCE (cleanup) = get_insns ();
2898 cleanup = protect_with_terminate (cleanup);
2899 expand_eh_region_end (cleanup);
2905 use_variable (DECL_RTL (iterator));
2910 use_variable (DECL_RTL (rval));
2914 /* Free up storage of type TYPE, at address ADDR.
2916 TYPE is a POINTER_TYPE and can be ptr_type_node for no special type
2919 VIRTUAL_SIZE is the amount of storage that was allocated, and is
2920 used as the second argument to operator delete. It can include
2921 things like padding and magic size cookies. It has virtual in it,
2922 because if you have a base pointer and you delete through a virtual
2923 destructor, it should be the size of the dynamic object, not the
2924 static object, see Free Store 12.5 ANSI C++ WP.
2926 This does not call any destructors. */
2929 build_x_delete (type, addr, which_delete, virtual_size)
2934 int use_global_delete = which_delete & 1;
2935 int use_vec_delete = !!(which_delete & 2);
2936 enum tree_code code = use_vec_delete ? VEC_DELETE_EXPR : DELETE_EXPR;
2937 int flags = LOOKUP_NORMAL | (use_global_delete * LOOKUP_GLOBAL);
2939 return build_op_delete_call (code, addr, virtual_size, flags, NULL_TREE);
2942 /* Generate a call to a destructor. TYPE is the type to cast ADDR to.
2943 ADDR is an expression which yields the store to be destroyed.
2944 AUTO_DELETE is nonzero if a call to DELETE should be made or not.
2945 If in the program, (AUTO_DELETE & 2) is non-zero, we tear down the
2946 virtual baseclasses.
2947 If in the program, (AUTO_DELETE & 1) is non-zero, then we deallocate.
2949 FLAGS is the logical disjunction of zero or more LOOKUP_
2950 flags. See cp-tree.h for more info.
2952 This function does not delete an object's virtual base classes. */
2955 build_delete (type, addr, auto_delete, flags, use_global_delete)
2959 int use_global_delete;
2965 if (addr == error_mark_node)
2966 return error_mark_node;
2968 /* Can happen when CURRENT_EXCEPTION_OBJECT gets its type
2969 set to `error_mark_node' before it gets properly cleaned up. */
2970 if (type == error_mark_node)
2971 return error_mark_node;
2973 type = TYPE_MAIN_VARIANT (type);
2975 if (TREE_CODE (type) == POINTER_TYPE)
2977 type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
2978 if (!complete_type_or_else (type))
2979 return error_mark_node;
2980 if (TREE_CODE (type) == ARRAY_TYPE)
2982 if (! IS_AGGR_TYPE (type))
2984 /* Call the builtin operator delete. */
2985 return build_builtin_call (void_type_node, BID,
2986 build_expr_list (NULL_TREE, addr));
2988 if (TREE_SIDE_EFFECTS (addr))
2989 addr = save_expr (addr);
2991 /* throw away const and volatile on target type of addr */
2992 addr = convert_force (build_pointer_type (type), addr, 0);
2993 ref = build_indirect_ref (addr, NULL_PTR);
2995 else if (TREE_CODE (type) == ARRAY_TYPE)
2998 if (TREE_SIDE_EFFECTS (addr))
2999 addr = save_expr (addr);
3000 if (TYPE_DOMAIN (type) == NULL_TREE)
3002 error ("unknown array size in delete");
3003 return error_mark_node;
3005 return build_vec_delete (addr, array_type_nelts (type),
3006 auto_delete, integer_two_node,
3011 /* Don't check PROTECT here; leave that decision to the
3012 destructor. If the destructor is accessible, call it,
3013 else report error. */
3014 addr = build_unary_op (ADDR_EXPR, addr, 0);
3015 if (TREE_SIDE_EFFECTS (addr))
3016 addr = save_expr (addr);
3018 if (TREE_CONSTANT (addr))
3019 addr = convert_pointer_to (type, addr);
3021 addr = convert_force (build_pointer_type (type), addr, 0);
3023 ref = build_indirect_ref (addr, NULL_PTR);
3026 my_friendly_assert (IS_AGGR_TYPE (type), 220);
3028 if (! TYPE_NEEDS_DESTRUCTOR (type))
3030 if (auto_delete == integer_zero_node)
3031 return void_zero_node;
3033 return build_op_delete_call
3034 (DELETE_EXPR, addr, c_sizeof_nowarn (type),
3035 LOOKUP_NORMAL | (use_global_delete * LOOKUP_GLOBAL),
3039 /* Below, we will reverse the order in which these calls are made.
3040 If we have a destructor, then that destructor will take care
3041 of the base classes; otherwise, we must do that here. */
3042 if (TYPE_HAS_DESTRUCTOR (type))
3044 tree passed_auto_delete;
3045 tree do_delete = NULL_TREE;
3048 if (use_global_delete)
3050 tree cond = fold (build (BIT_AND_EXPR, integer_type_node,
3051 auto_delete, integer_one_node));
3052 tree call = build_builtin_call
3053 (void_type_node, BID, build_expr_list (NULL_TREE, addr));
3055 cond = fold (build (COND_EXPR, void_type_node, cond,
3056 call, void_zero_node));
3057 if (cond != void_zero_node)
3060 passed_auto_delete = fold (build (BIT_AND_EXPR, integer_type_node,
3061 auto_delete, integer_two_node));
3064 passed_auto_delete = auto_delete;
3066 expr = build_method_call
3067 (ref, dtor_identifier, build_expr_list (NULL_TREE, passed_auto_delete),
3071 expr = build (COMPOUND_EXPR, void_type_node, expr, do_delete);
3073 if (flags & LOOKUP_DESTRUCTOR)
3074 /* Explicit destructor call; don't check for null pointer. */
3075 ifexp = integer_one_node;
3077 /* Handle deleting a null pointer. */
3078 ifexp = fold (build_binary_op (NE_EXPR, addr, integer_zero_node, 1));
3080 if (ifexp != integer_one_node)
3081 expr = build (COND_EXPR, void_type_node,
3082 ifexp, expr, void_zero_node);
3088 /* We only get here from finish_function for a destructor. */
3089 tree binfos = BINFO_BASETYPES (TYPE_BINFO (type));
3090 int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
3091 tree base_binfo = n_baseclasses > 0 ? TREE_VEC_ELT (binfos, 0) : NULL_TREE;
3092 tree exprstmt = NULL_TREE;
3093 tree parent_auto_delete = auto_delete;
3096 /* If we have member delete or vbases, we call delete in
3098 if (auto_delete == integer_zero_node)
3100 else if (base_binfo == NULL_TREE
3101 || ! TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo)))
3103 cond = build (COND_EXPR, void_type_node,
3104 build (BIT_AND_EXPR, integer_type_node, auto_delete, integer_one_node),
3105 build_builtin_call (void_type_node, BID,
3106 build_expr_list (NULL_TREE, addr)),
3113 exprstmt = build_expr_list (NULL_TREE, cond);
3116 && ! TREE_VIA_VIRTUAL (base_binfo)
3117 && TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo)))
3119 tree this_auto_delete;
3121 if (BINFO_OFFSET_ZEROP (base_binfo))
3122 this_auto_delete = parent_auto_delete;
3124 this_auto_delete = integer_zero_node;
3126 expr = build_scoped_method_call
3127 (ref, base_binfo, dtor_identifier,
3128 build_expr_list (NULL_TREE, this_auto_delete));
3129 exprstmt = expr_tree_cons (NULL_TREE, expr, exprstmt);
3132 /* Take care of the remaining baseclasses. */
3133 for (i = 1; i < n_baseclasses; i++)
3135 base_binfo = TREE_VEC_ELT (binfos, i);
3136 if (! TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo))
3137 || TREE_VIA_VIRTUAL (base_binfo))
3140 expr = build_scoped_method_call
3141 (ref, base_binfo, dtor_identifier,
3142 build_expr_list (NULL_TREE, integer_zero_node));
3144 exprstmt = expr_tree_cons (NULL_TREE, expr, exprstmt);
3147 for (member = TYPE_FIELDS (type); member; member = TREE_CHAIN (member))
3149 if (TREE_CODE (member) != FIELD_DECL)
3151 if (TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (member)))
3153 tree this_member = build_component_ref (ref, DECL_NAME (member), NULL_TREE, 0);
3154 tree this_type = TREE_TYPE (member);
3155 expr = build_delete (this_type, this_member, integer_two_node, flags, 0);
3156 exprstmt = expr_tree_cons (NULL_TREE, expr, exprstmt);
3161 return build_compound_expr (exprstmt);
3162 /* Virtual base classes make this function do nothing. */
3163 return void_zero_node;
3167 /* For type TYPE, delete the virtual baseclass objects of DECL. */
3170 build_vbase_delete (type, decl)
3173 tree vbases = CLASSTYPE_VBASECLASSES (type);
3174 tree result = NULL_TREE;
3175 tree addr = build_unary_op (ADDR_EXPR, decl, 0);
3177 my_friendly_assert (addr != error_mark_node, 222);
3181 tree this_addr = convert_force (build_pointer_type (BINFO_TYPE (vbases)),
3183 result = expr_tree_cons (NULL_TREE,
3184 build_delete (TREE_TYPE (this_addr), this_addr,
3186 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 0),
3188 vbases = TREE_CHAIN (vbases);
3190 return build_compound_expr (nreverse (result));
3193 /* Build a C++ vector delete expression.
3194 MAXINDEX is the number of elements to be deleted.
3195 ELT_SIZE is the nominal size of each element in the vector.
3196 BASE is the expression that should yield the store to be deleted.
3197 This function expands (or synthesizes) these calls itself.
3198 AUTO_DELETE_VEC says whether the container (vector) should be deallocated.
3199 AUTO_DELETE say whether each item in the container should be deallocated.
3201 This also calls delete for virtual baseclasses of elements of the vector.
3203 Update: MAXINDEX is no longer needed. The size can be extracted from the
3204 start of the vector for pointers, and from the type for arrays. We still
3205 use MAXINDEX for arrays because it happens to already have one of the
3206 values we'd have to extract. (We could use MAXINDEX with pointers to
3207 confirm the size, and trap if the numbers differ; not clear that it'd
3208 be worth bothering.) */
3211 build_vec_delete (base, maxindex, auto_delete_vec, auto_delete,
3213 tree base, maxindex;
3214 tree auto_delete_vec, auto_delete;
3215 int use_global_delete;
3219 if (TREE_CODE (base) == OFFSET_REF)
3220 base = resolve_offset_ref (base);
3222 type = TREE_TYPE (base);
3224 base = stabilize_reference (base);
3226 /* Since we can use base many times, save_expr it. */
3227 if (TREE_SIDE_EFFECTS (base))
3228 base = save_expr (base);
3230 if (TREE_CODE (type) == POINTER_TYPE)
3232 /* Step back one from start of vector, and read dimension. */
3233 tree cookie_addr = build (MINUS_EXPR, build_pointer_type (BI_header_type),
3234 base, BI_header_size);
3235 tree cookie = build_indirect_ref (cookie_addr, NULL_PTR);
3236 maxindex = build_component_ref (cookie, nc_nelts_field_id, NULL_TREE, 0);
3238 type = TREE_TYPE (type);
3239 while (TREE_CODE (type) == ARRAY_TYPE);
3241 else if (TREE_CODE (type) == ARRAY_TYPE)
3243 /* get the total number of things in the array, maxindex is a bad name */
3244 maxindex = array_type_nelts_total (type);
3245 while (TREE_CODE (type) == ARRAY_TYPE)
3246 type = TREE_TYPE (type);
3247 base = build_unary_op (ADDR_EXPR, base, 1);
3251 if (base != error_mark_node)
3252 error ("type to vector delete is neither pointer or array type");
3253 return error_mark_node;
3256 return build_vec_delete_1 (base, maxindex, type, auto_delete_vec, auto_delete,