1 /* Handle initialization things in C++.
2 Copyright (C) 1987, 89, 92-98, 1999, 2000 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, int));
41 static void perform_member_init PROTO((tree, tree, tree, int));
42 static void sort_base_init PROTO((tree, tree *, tree *));
43 static tree build_builtin_delete_call PROTO((tree));
44 static int member_init_ok_or_else PROTO((tree, tree, const char *));
45 static void expand_virtual_init PROTO((tree, tree));
46 static tree sort_member_init PROTO((tree));
47 static tree initializing_context PROTO((tree));
48 static tree build_java_class_ref PROTO((tree));
49 static void expand_cleanup_for_base PROTO((tree, tree));
50 static tree get_temp_regvar PROTO((tree, tree));
51 static tree dfs_initialize_vtbl_ptrs PROTO((tree, void *));
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_aggr_type (RECORD_TYPE);
67 nelts_identifier = get_identifier ("nelts");
68 fields[0] = build_lang_decl (FIELD_DECL, nelts_identifier, sizetype);
70 /* Use the biggest alignment supported by the target to prevent operator
71 new from returning misaligned pointers. */
72 TYPE_ALIGN (BI_header_type) = BIGGEST_ALIGNMENT;
73 finish_builtin_type (BI_header_type, "__new_cookie", fields,
75 BI_header_size = size_in_bytes (BI_header_type);
77 ggc_add_tree_root (&BI_header_type, 1);
78 ggc_add_tree_root (&BI_header_size, 1);
81 /* Called from initialize_vtbl_ptrs via dfs_walk. */
84 dfs_initialize_vtbl_ptrs (binfo, data)
88 if (!BINFO_PRIMARY_MARKED_P (binfo)
89 && CLASSTYPE_VFIELDS (BINFO_TYPE (binfo)))
91 tree base_ptr = TREE_VALUE ((tree) data);
93 if (TREE_VIA_VIRTUAL (binfo))
94 base_ptr = convert_pointer_to_vbase (BINFO_TYPE (binfo),
98 = build_vbase_path (PLUS_EXPR,
99 build_pointer_type (BINFO_TYPE (binfo)),
104 expand_virtual_init (binfo, base_ptr);
107 SET_BINFO_MARKED (binfo);
112 /* Initialize all the vtable pointers for the hierarchy dominated by
116 initialize_vtbl_ptrs (type, addr)
120 tree list = build_tree_list (type, addr);
122 dfs_walk (TYPE_BINFO (type), dfs_initialize_vtbl_ptrs,
123 dfs_unmarked_real_bases_queue_p, list);
124 dfs_walk (TYPE_BINFO (type), dfs_unmark,
125 dfs_marked_real_bases_queue_p, type);
126 if (TYPE_USES_VIRTUAL_BASECLASSES (type))
127 expand_indirect_vtbls_init (TYPE_BINFO (type), addr);
132 /* Subroutine of emit_base_init. */
135 perform_member_init (member, name, init, explicit)
136 tree member, name, init;
140 tree type = TREE_TYPE (member);
142 decl = build_component_ref (current_class_ref, name, NULL_TREE, explicit);
144 if (decl == error_mark_node)
147 /* Deal with this here, as we will get confused if we try to call the
148 assignment op for an anonymous union. This can happen in a
149 synthesized copy constructor. */
150 if (ANON_AGGR_TYPE_P (type))
152 init = build (INIT_EXPR, type, decl, TREE_VALUE (init));
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 = BINFO_FOR_VBASE (BINFO_TYPE (binfo), t);
389 vbases = tree_cons (v, TREE_VALUE (x), vbases);
394 /* Otherwise, if it is not an immediate base class, complain. */
395 for (i = n_baseclasses-1; i >= 0; i--)
396 if (BINFO_TYPE (binfo) == BINFO_TYPE (TREE_VEC_ELT (binfos, i)))
400 cp_error ("`%T' is not an immediate base class of `%T'",
401 basetype, current_class_type);
407 my_friendly_abort (365);
409 TREE_PURPOSE (x) = binfo;
410 TREE_CHAIN (last) = x;
413 TREE_CHAIN (last) = NULL_TREE;
415 /* Now walk through our regular bases and make sure they're initialized. */
417 for (i = 0; i < n_baseclasses; ++i)
419 tree base_binfo = TREE_VEC_ELT (binfos, i);
422 if (TREE_VIA_VIRTUAL (base_binfo))
425 for (x = current_base_init_list, pos = 0; x; x = TREE_CHAIN (x), ++pos)
427 tree binfo = TREE_PURPOSE (x);
429 if (binfo == NULL_TREE)
432 if (binfo == base_binfo)
438 cp_warning_at ("base initializers for `%#T'", last_base);
439 cp_warning_at (" and `%#T'", BINFO_TYPE (binfo));
440 warning (" will be re-ordered to match inheritance order");
443 last_base = BINFO_TYPE (binfo);
446 /* Make sure we won't try to work on this init again. */
447 TREE_PURPOSE (x) = NULL_TREE;
448 x = build_tree_list (binfo, TREE_VALUE (x));
453 /* If we didn't find BASE_BINFO in the list, create a dummy entry
454 so the two lists (RBASES and the list of bases) will be
456 x = build_tree_list (NULL_TREE, NULL_TREE);
458 rbases = chainon (rbases, x);
465 /* Perform whatever initializations have yet to be done on the base
466 class of the class variable. These actions are in the global
467 variable CURRENT_BASE_INIT_LIST. Such an action could be
468 NULL_TREE, meaning that the user has explicitly called the base
469 class constructor with no arguments.
471 If there is a need for a call to a constructor, we must surround
472 that call with a pushlevel/poplevel pair, since we are technically
473 at the PARM level of scope.
475 Argument IMMEDIATELY, if zero, forces a new sequence to be
476 generated to contain these new insns, so it can be emitted later.
477 This sequence is saved in the global variable BASE_INIT_EXPR.
478 Otherwise, the insns are emitted into the current sequence.
480 Note that emit_base_init does *not* initialize virtual base
481 classes. That is done specially, elsewhere. */
489 tree rbase_init_list, vbase_init_list;
490 tree t_binfo = TYPE_BINFO (t);
491 tree binfos = BINFO_BASETYPES (t_binfo);
492 int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
496 mem_init_list = sort_member_init (t);
497 current_member_init_list = NULL_TREE;
499 sort_base_init (t, &rbase_init_list, &vbase_init_list);
500 current_base_init_list = NULL_TREE;
502 begin_init_stmts (&stmt_expr, &compound_stmt);
504 /* First, initialize the virtual base classes, if we are
505 constructing the most-derived object. */
506 if (TYPE_USES_VIRTUAL_BASECLASSES (t))
508 tree first_arg = TREE_CHAIN (DECL_ARGUMENTS (current_function_decl));
509 construct_virtual_bases (t, current_class_ref, current_class_ptr,
510 vbase_init_list, first_arg);
513 /* Now, perform initialization of non-virtual base classes. */
514 for (i = 0; i < n_baseclasses; i++)
516 tree base_binfo = TREE_VEC_ELT (binfos, i);
517 tree init = void_list_node;
519 if (TREE_VIA_VIRTUAL (base_binfo))
522 my_friendly_assert (BINFO_INHERITANCE_CHAIN (base_binfo) == t_binfo,
525 if (TREE_PURPOSE (rbase_init_list))
526 init = TREE_VALUE (rbase_init_list);
527 else if (TYPE_NEEDS_CONSTRUCTING (BINFO_TYPE (base_binfo)))
530 if (extra_warnings && copy_args_p (current_function_decl))
531 cp_warning ("base class `%#T' should be explicitly initialized in the copy constructor",
532 BINFO_TYPE (base_binfo));
535 if (init != void_list_node)
537 member = convert_pointer_to_real (base_binfo, current_class_ptr);
538 expand_aggr_init_1 (base_binfo, NULL_TREE,
539 build_indirect_ref (member, NULL_PTR), init,
543 expand_cleanup_for_base (base_binfo, NULL_TREE);
544 rbase_init_list = TREE_CHAIN (rbase_init_list);
547 /* Initialize the vtable pointers for the class. */
548 initialize_vtbl_ptrs (t, current_class_ptr);
550 for (member = TYPE_FIELDS (t); member; member = TREE_CHAIN (member))
555 /* member could be, for example, a CONST_DECL for an enumerated
556 tag; we don't want to try to initialize that, since it already
558 if (TREE_CODE (member) != FIELD_DECL || !DECL_NAME (member))
561 /* See if we had a user-specified member initialization. */
562 if (TREE_PURPOSE (mem_init_list))
564 name = TREE_PURPOSE (mem_init_list);
565 init = TREE_VALUE (mem_init_list);
568 my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE
569 || TREE_CODE (name) == FIELD_DECL, 349);
573 name = DECL_NAME (member);
574 init = DECL_INITIAL (member);
578 /* Effective C++ rule 12. */
579 if (warn_ecpp && init == NULL_TREE
580 && !DECL_ARTIFICIAL (member)
581 && TREE_CODE (TREE_TYPE (member)) != ARRAY_TYPE)
582 cp_warning ("`%D' should be initialized in the member initialization list", member);
585 perform_member_init (member, name, init, from_init_list);
586 mem_init_list = TREE_CHAIN (mem_init_list);
589 /* Now initialize any members from our bases. */
590 while (mem_init_list)
592 tree name, init, field;
594 if (TREE_PURPOSE (mem_init_list))
596 name = TREE_PURPOSE (mem_init_list);
597 init = TREE_VALUE (mem_init_list);
599 if (TREE_CODE (name) == IDENTIFIER_NODE)
600 field = IDENTIFIER_CLASS_VALUE (name);
604 /* If one member shadows another, get the outermost one. */
605 if (TREE_CODE (field) == TREE_LIST)
607 field = TREE_VALUE (field);
608 if (decl_type_context (field) != current_class_type)
609 cp_error ("field `%D' not in immediate context", field);
612 perform_member_init (field, name, init, 1);
614 mem_init_list = TREE_CHAIN (mem_init_list);
617 /* All the implicit try blocks we built up will be zapped
618 when we come to a real binding contour boundary. */
619 return finish_init_stmts (stmt_expr, compound_stmt);
622 /* Check that all fields are properly initialized after
623 an assignment to `this'. Called only when such an assignment
624 is actually noted. */
631 for (member = TYPE_FIELDS (t); member; member = TREE_CHAIN (member))
632 if (DECL_NAME (member) && TREE_USED (member))
633 cp_error ("field `%D' used before initialized (after assignment to `this')",
637 /* This code sets up the virtual function tables appropriate for
638 the pointer DECL. It is a one-ply initialization.
640 BINFO is the exact type that DECL is supposed to be. In
641 multiple inheritance, this might mean "C's A" if C : A, B. */
644 expand_virtual_init (binfo, decl)
647 tree type = BINFO_TYPE (binfo);
649 tree vtype, vtype_binfo;
651 /* Compute the location of the vtable. */
652 vtype = DECL_CONTEXT (TYPE_VFIELD (type));
653 vtype_binfo = get_binfo (vtype, TREE_TYPE (TREE_TYPE (decl)), 0);
654 vtbl = BINFO_VTABLE (binfo_value (DECL_FIELD_CONTEXT (TYPE_VFIELD (type)), binfo));
655 assemble_external (vtbl);
656 TREE_USED (vtbl) = 1;
657 vtbl = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (vtbl)), vtbl);
658 /* Under the new ABI, we need to point into the middle of the
661 vtbl = build (PLUS_EXPR, TREE_TYPE (vtbl), vtbl,
662 size_extra_vtbl_entries (binfo));
664 /* Compute the location of the vtpr. */
665 decl = convert_pointer_to_real (vtype_binfo, decl);
666 vtbl_ptr = build_vfield_ref (build_indirect_ref (decl, NULL_PTR), vtype);
667 if (vtbl_ptr == error_mark_node)
670 /* Assign the vtable to the vptr. */
671 vtbl = convert_force (TREE_TYPE (vtbl_ptr), vtbl, 0);
672 finish_expr_stmt (build_modify_expr (vtbl_ptr, NOP_EXPR, vtbl));
675 /* If an exception is thrown in a constructor, those base classes already
676 constructed must be destroyed. This function creates the cleanup
677 for BINFO, which has just been constructed. If FLAG is non-NULL,
678 it is a DECL which is non-zero when this base needs to be
682 expand_cleanup_for_base (binfo, flag)
688 if (!TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (binfo)))
691 /* Call the destructor. */
692 expr = (build_scoped_method_call
693 (current_class_ref, binfo, dtor_identifier,
694 build_expr_list (NULL_TREE, integer_zero_node)));
696 expr = fold (build (COND_EXPR, void_type_node,
697 truthvalue_conversion (flag),
698 expr, integer_zero_node));
700 finish_subobject (expr);
703 /* Subroutine of `expand_aggr_vbase_init'.
704 BINFO is the binfo of the type that is being initialized.
705 INIT_LIST is the list of initializers for the virtual baseclass. */
708 expand_aggr_vbase_init_1 (binfo, exp, addr, init_list)
709 tree binfo, exp, addr, init_list;
711 tree init = purpose_member (binfo, init_list);
712 tree ref = build_indirect_ref (addr, NULL_PTR);
715 init = TREE_VALUE (init);
716 /* Call constructors, but don't set up vtables. */
717 expand_aggr_init_1 (binfo, exp, ref, init, LOOKUP_COMPLAIN);
720 /* Construct the virtual base-classes of THIS_REF (whose address is
721 THIS_PTR). The object has the indicated TYPE. The construction
722 actually takes place only if FLAG is non-zero. INIT_LIST is list
723 of initialization for constructor to perform. */
726 construct_virtual_bases (type, this_ref, this_ptr, init_list, flag)
737 /* If there are no virtual baseclasses, we shouldn't even be here. */
738 my_friendly_assert (TYPE_USES_VIRTUAL_BASECLASSES (type), 19990621);
740 /* First set the pointers in our object that tell us where to find
741 our virtual baseclasses. */
742 if_stmt = begin_if_stmt ();
743 finish_if_stmt_cond (flag, if_stmt);
744 result = init_vbase_pointers (type, this_ptr);
746 finish_expr_stmt (build_compound_expr (result));
747 finish_then_clause (if_stmt);
750 /* Now, run through the baseclasses, initializing each. */
751 for (vbases = CLASSTYPE_VBASECLASSES (type); vbases;
752 vbases = TREE_CHAIN (vbases))
758 /* If there are virtual base classes with destructors, we need to
759 emit cleanups to destroy them if an exception is thrown during
760 the construction process. These exception regions (i.e., the
761 period during which the cleanups must occur) begin from the time
762 the construction is complete to the end of the function. If we
763 create a conditional block in which to initialize the
764 base-classes, then the cleanup region for the virtual base begins
765 inside a block, and ends outside of that block. This situation
766 confuses the sjlj exception-handling code. Therefore, we do not
767 create a single conditional block, but one for each
768 initialization. (That way the cleanup regions always begin
769 in the outer block.) We trust the back-end to figure out
770 that the FLAG will not change across initializations, and
771 avoid doing multiple tests. */
772 inner_if_stmt = begin_if_stmt ();
773 finish_if_stmt_cond (flag, inner_if_stmt);
774 compound_stmt = begin_compound_stmt (/*has_no_scope=*/1);
776 /* Compute the location of the virtual base. If we're
777 constructing virtual bases, then we must be the most derived
778 class. Therefore, we don't have to look up the virtual base;
779 we already know where it is. */
780 exp = build (PLUS_EXPR,
781 TREE_TYPE (this_ptr),
783 BINFO_OFFSET (vbases));
784 exp = build1 (NOP_EXPR,
785 build_pointer_type (BINFO_TYPE (vbases)),
788 expand_aggr_vbase_init_1 (vbases, this_ref, exp, init_list);
789 finish_compound_stmt (/*has_no_scope=*/1, compound_stmt);
790 finish_then_clause (inner_if_stmt);
793 expand_cleanup_for_base (vbases, flag);
797 /* Find the context in which this FIELD can be initialized. */
800 initializing_context (field)
803 tree t = DECL_CONTEXT (field);
805 /* Anonymous union members can be initialized in the first enclosing
806 non-anonymous union context. */
807 while (t && ANON_AGGR_TYPE_P (t))
808 t = TYPE_CONTEXT (t);
812 /* Function to give error message if member initialization specification
813 is erroneous. FIELD is the member we decided to initialize.
814 TYPE is the type for which the initialization is being performed.
815 FIELD must be a member of TYPE.
817 MEMBER_NAME is the name of the member. */
820 member_init_ok_or_else (field, type, member_name)
823 const char *member_name;
825 if (field == error_mark_node)
827 if (field == NULL_TREE || initializing_context (field) != type)
829 cp_error ("class `%T' does not have any field named `%s'", type,
833 if (TREE_STATIC (field))
835 cp_error ("field `%#D' is static; only point of initialization is its declaration",
843 /* If NAME is a viable field name for the aggregate DECL,
844 and PARMS is a viable parameter list, then expand an _EXPR
845 which describes this initialization.
847 Note that we do not need to chase through the class's base classes
848 to look for NAME, because if it's in that list, it will be handled
849 by the constructor for that base class.
851 We do not yet have a fixed-point finder to instantiate types
852 being fed to overloaded constructors. If there is a unique
853 constructor, then argument types can be got from that one.
855 If INIT is non-NULL, then it the initialization should
856 be placed in `current_base_init_list', where it will be processed
857 by `emit_base_init'. */
860 expand_member_init (exp, name, init)
861 tree exp, name, init;
863 tree basetype = NULL_TREE, field;
866 if (exp == NULL_TREE)
867 return; /* complain about this later */
869 type = TYPE_MAIN_VARIANT (TREE_TYPE (exp));
871 if (name && TREE_CODE (name) == TYPE_DECL)
873 basetype = TYPE_MAIN_VARIANT (TREE_TYPE (name));
874 name = DECL_NAME (name);
877 if (name == NULL_TREE && IS_AGGR_TYPE (type))
878 switch (CLASSTYPE_N_BASECLASSES (type))
881 error ("base class initializer specified, but no base class to initialize");
884 basetype = TYPE_BINFO_BASETYPE (type, 0);
887 error ("initializer for unnamed base class ambiguous");
888 cp_error ("(type `%T' uses multiple inheritance)", type);
892 my_friendly_assert (init != NULL_TREE, 0);
894 /* The grammar should not allow fields which have names that are
895 TYPENAMEs. Therefore, if the field has a non-NULL TREE_TYPE, we
896 may assume that this is an attempt to initialize a base class
897 member of the current type. Otherwise, it is an attempt to
898 initialize a member field. */
900 if (init == void_type_node)
903 if (name == NULL_TREE || basetype)
907 if (name == NULL_TREE)
911 name = TYPE_IDENTIFIER (basetype);
914 error ("no base class to initialize");
919 else if (basetype != type
920 && ! current_template_parms
921 && ! vec_binfo_member (basetype,
922 TYPE_BINFO_BASETYPES (type))
923 && ! BINFO_FOR_VBASE (basetype, type))
925 if (IDENTIFIER_CLASS_VALUE (name))
927 if (TYPE_USES_VIRTUAL_BASECLASSES (type))
928 cp_error ("type `%T' is not an immediate or virtual basetype for `%T'",
931 cp_error ("type `%T' is not an immediate basetype for `%T'",
936 if (purpose_member (basetype, current_base_init_list))
938 cp_error ("base class `%T' already initialized", basetype);
942 if (warn_reorder && current_member_init_list)
944 cp_warning ("base initializer for `%T'", basetype);
945 warning (" will be re-ordered to precede member initializations");
948 base_init = build_tree_list (basetype, init);
949 current_base_init_list = chainon (current_base_init_list, base_init);
956 field = lookup_field (type, name, 1, 0);
958 if (! member_init_ok_or_else (field, type, IDENTIFIER_POINTER (name)))
961 if (purpose_member (name, current_member_init_list))
963 cp_error ("field `%D' already initialized", field);
967 member_init = build_tree_list (name, init);
968 current_member_init_list = chainon (current_member_init_list, member_init);
972 /* We are about to generate some complex initialization code.
973 Conceptually, it is all a single expression. However, we may want
974 to include conditionals, loops, and other such statement-level
975 constructs. Therefore, we build the initialization code inside a
976 statement-expression. This function starts such an expression.
977 STMT_EXPR_P and COMPOUND_STMT_P are filled in by this function;
978 pass them back to finish_init_stmts when the expression is
982 begin_init_stmts (stmt_expr_p, compound_stmt_p)
984 tree *compound_stmt_p;
986 *stmt_expr_p = begin_stmt_expr ();
987 *compound_stmt_p = begin_compound_stmt (/*has_no_scope=*/1);
990 /* Finish out the statement-expression begun by the previous call to
991 begin_init_stmts. Returns the statement-expression itself. */
994 finish_init_stmts (stmt_expr, compound_stmt)
998 finish_compound_stmt (/*has_no_scope=*/1, compound_stmt);
999 stmt_expr = finish_stmt_expr (stmt_expr);
1001 /* To avoid spurious warnings about unused values, we set
1004 TREE_USED (stmt_expr) = 1;
1009 /* This is like `expand_member_init', only it stores one aggregate
1012 INIT comes in two flavors: it is either a value which
1013 is to be stored in EXP, or it is a parameter list
1014 to go to a constructor, which will operate on EXP.
1015 If INIT is not a parameter list for a constructor, then set
1016 LOOKUP_ONLYCONVERTING.
1017 If FLAGS is LOOKUP_ONLYCONVERTING then it is the = init form of
1018 the initializer, if FLAGS is 0, then it is the (init) form.
1019 If `init' is a CONSTRUCTOR, then we emit a warning message,
1020 explaining that such initializations are invalid.
1022 ALIAS_THIS is nonzero iff we are initializing something which is
1023 essentially an alias for current_class_ref. In this case, the base
1024 constructor may move it on us, and we must keep track of such
1027 If INIT resolves to a CALL_EXPR which happens to return
1028 something of the type we are looking for, then we know
1029 that we can safely use that call to perform the
1032 The virtual function table pointer cannot be set up here, because
1033 we do not really know its type.
1035 Virtual baseclass pointers are also set up here.
1037 This never calls operator=().
1039 When initializing, nothing is CONST.
1041 A default copy constructor may have to be used to perform the
1044 A constructor or a conversion operator may have to be used to
1045 perform the initialization, but not both, as it would be ambiguous. */
1048 build_aggr_init (exp, init, flags)
1055 tree type = TREE_TYPE (exp);
1056 int was_const = TREE_READONLY (exp);
1057 int was_volatile = TREE_THIS_VOLATILE (exp);
1059 if (init == error_mark_node)
1060 return error_mark_node;
1062 TREE_READONLY (exp) = 0;
1063 TREE_THIS_VOLATILE (exp) = 0;
1065 if (init && TREE_CODE (init) != TREE_LIST)
1066 flags |= LOOKUP_ONLYCONVERTING;
1068 if (TREE_CODE (type) == ARRAY_TYPE)
1070 /* Must arrange to initialize each element of EXP
1071 from elements of INIT. */
1072 tree itype = init ? TREE_TYPE (init) : NULL_TREE;
1073 if (CP_TYPE_QUALS (type) != TYPE_UNQUALIFIED)
1075 TREE_TYPE (exp) = TYPE_MAIN_VARIANT (type);
1077 TREE_TYPE (init) = TYPE_MAIN_VARIANT (itype);
1079 if (init && TREE_TYPE (init) == NULL_TREE)
1081 /* Handle bad initializers like:
1085 COMPLEX(double r = 0.0, double i = 0.0) {re = r; im = i;};
1089 int main(int argc, char **argv) {
1090 COMPLEX zees(1.0, 0.0)[10];
1093 error ("bad array initializer");
1094 return error_mark_node;
1096 stmt_expr = build_vec_init (exp, exp, array_type_nelts (type), init,
1097 init && same_type_p (TREE_TYPE (init),
1099 TREE_READONLY (exp) = was_const;
1100 TREE_THIS_VOLATILE (exp) = was_volatile;
1101 TREE_TYPE (exp) = type;
1103 TREE_TYPE (init) = itype;
1107 if (TREE_CODE (exp) == VAR_DECL || TREE_CODE (exp) == PARM_DECL)
1108 /* just know that we've seen something for this node */
1109 TREE_USED (exp) = 1;
1111 TREE_TYPE (exp) = TYPE_MAIN_VARIANT (type);
1112 begin_init_stmts (&stmt_expr, &compound_stmt);
1113 destroy_temps = stmts_are_full_exprs_p;
1114 stmts_are_full_exprs_p = 0;
1115 expand_aggr_init_1 (TYPE_BINFO (type), exp, exp,
1116 init, LOOKUP_NORMAL|flags);
1117 stmt_expr = finish_init_stmts (stmt_expr, compound_stmt);
1118 stmts_are_full_exprs_p = destroy_temps;
1119 TREE_TYPE (exp) = type;
1120 TREE_READONLY (exp) = was_const;
1121 TREE_THIS_VOLATILE (exp) = was_volatile;
1127 expand_default_init (binfo, true_exp, exp, init, flags)
1133 tree type = TREE_TYPE (exp);
1135 /* It fails because there may not be a constructor which takes
1136 its own type as the first (or only parameter), but which does
1137 take other types via a conversion. So, if the thing initializing
1138 the expression is a unit element of type X, first try X(X&),
1139 followed by initialization by X. If neither of these work
1140 out, then look hard. */
1144 if (init && TREE_CODE (init) != TREE_LIST
1145 && (flags & LOOKUP_ONLYCONVERTING))
1147 /* Base subobjects should only get direct-initialization. */
1148 if (true_exp != exp)
1151 if (flags & DIRECT_BIND)
1152 /* Do nothing. We hit this in two cases: Reference initialization,
1153 where we aren't initializing a real variable, so we don't want
1154 to run a new constructor; and catching an exception, where we
1155 have already built up the constructor call so we could wrap it
1156 in an exception region. */;
1157 else if (TREE_CODE (init) == CONSTRUCTOR)
1158 /* A brace-enclosed initializer has whatever type is
1159 required. There's no need to convert it. */
1162 init = ocp_convert (type, init, CONV_IMPLICIT|CONV_FORCE_TEMP, flags);
1164 if (TREE_CODE (init) == TRY_CATCH_EXPR)
1165 /* We need to protect the initialization of a catch parm
1166 with a call to terminate(), which shows up as a TRY_CATCH_EXPR
1167 around the TARGET_EXPR for the copy constructor. See
1168 expand_start_catch_block. */
1169 TREE_OPERAND (init, 0) = build (INIT_EXPR, TREE_TYPE (exp), exp,
1170 TREE_OPERAND (init, 0));
1172 init = build (INIT_EXPR, TREE_TYPE (exp), exp, init);
1173 TREE_SIDE_EFFECTS (init) = 1;
1174 finish_expr_stmt (init);
1178 if (init == NULL_TREE
1179 || (TREE_CODE (init) == TREE_LIST && ! TREE_TYPE (init)))
1183 init = TREE_VALUE (parms);
1186 parms = build_expr_list (NULL_TREE, init);
1188 if (TYPE_USES_VIRTUAL_BASECLASSES (type))
1190 if (true_exp == exp)
1191 parms = tree_cons (NULL_TREE, integer_one_node, parms);
1193 parms = tree_cons (NULL_TREE, integer_zero_node, parms);
1194 flags |= LOOKUP_HAS_IN_CHARGE;
1197 rval = build_method_call (exp, ctor_identifier,
1198 parms, binfo, flags);
1199 if (TREE_SIDE_EFFECTS (rval))
1200 finish_expr_stmt (rval);
1203 /* This function is responsible for initializing EXP with INIT
1206 BINFO is the binfo of the type for who we are performing the
1207 initialization. For example, if W is a virtual base class of A and B,
1209 If we are initializing B, then W must contain B's W vtable, whereas
1210 were we initializing C, W must contain C's W vtable.
1212 TRUE_EXP is nonzero if it is the true expression being initialized.
1213 In this case, it may be EXP, or may just contain EXP. The reason we
1214 need this is because if EXP is a base element of TRUE_EXP, we
1215 don't necessarily know by looking at EXP where its virtual
1216 baseclass fields should really be pointing. But we do know
1217 from TRUE_EXP. In constructors, we don't know anything about
1218 the value being initialized.
1220 ALIAS_THIS serves the same purpose it serves for expand_aggr_init.
1222 FLAGS is just passes to `build_method_call'. See that function for
1226 expand_aggr_init_1 (binfo, true_exp, exp, init, flags)
1232 tree type = TREE_TYPE (exp);
1234 my_friendly_assert (init != error_mark_node && type != error_mark_node, 211);
1236 /* Use a function returning the desired type to initialize EXP for us.
1237 If the function is a constructor, and its first argument is
1238 NULL_TREE, know that it was meant for us--just slide exp on
1239 in and expand the constructor. Constructors now come
1242 if (init && TREE_CODE (exp) == VAR_DECL
1243 && TREE_CODE (init) == CONSTRUCTOR
1244 && TREE_HAS_CONSTRUCTOR (init))
1246 /* If store_init_value returns NULL_TREE, the INIT has been
1247 record in the DECL_INITIAL for EXP. That means there's
1248 nothing more we have to do. */
1249 if (!store_init_value (exp, init))
1251 if (!building_stmt_tree ())
1252 expand_decl_init (exp);
1255 finish_expr_stmt (build (INIT_EXPR, type, exp, init));
1259 /* We know that expand_default_init can handle everything we want
1261 expand_default_init (binfo, true_exp, exp, init, flags);
1264 /* Report an error if NAME is not the name of a user-defined,
1265 aggregate type. If OR_ELSE is nonzero, give an error message. */
1268 is_aggr_typedef (name, or_else)
1274 if (name == error_mark_node)
1277 if (IDENTIFIER_HAS_TYPE_VALUE (name))
1278 type = IDENTIFIER_TYPE_VALUE (name);
1282 cp_error ("`%T' is not an aggregate typedef", name);
1286 if (! IS_AGGR_TYPE (type)
1287 && TREE_CODE (type) != TEMPLATE_TYPE_PARM
1288 && TREE_CODE (type) != TEMPLATE_TEMPLATE_PARM)
1291 cp_error ("`%T' is not an aggregate type", type);
1297 /* Report an error if TYPE is not a user-defined, aggregate type. If
1298 OR_ELSE is nonzero, give an error message. */
1301 is_aggr_type (type, or_else)
1305 if (type == error_mark_node)
1308 if (! IS_AGGR_TYPE (type)
1309 && TREE_CODE (type) != TEMPLATE_TYPE_PARM
1310 && TREE_CODE (type) != TEMPLATE_TEMPLATE_PARM)
1313 cp_error ("`%T' is not an aggregate type", type);
1319 /* Like is_aggr_typedef, but returns typedef if successful. */
1322 get_aggr_from_typedef (name, or_else)
1328 if (name == error_mark_node)
1331 if (IDENTIFIER_HAS_TYPE_VALUE (name))
1332 type = IDENTIFIER_TYPE_VALUE (name);
1336 cp_error ("`%T' fails to be an aggregate typedef", name);
1340 if (! IS_AGGR_TYPE (type)
1341 && TREE_CODE (type) != TEMPLATE_TYPE_PARM
1342 && TREE_CODE (type) != TEMPLATE_TEMPLATE_PARM)
1345 cp_error ("type `%T' is of non-aggregate type", type);
1352 get_type_value (name)
1355 if (name == error_mark_node)
1358 if (IDENTIFIER_HAS_TYPE_VALUE (name))
1359 return IDENTIFIER_TYPE_VALUE (name);
1365 /* This code could just as well go in `class.c', but is placed here for
1368 /* For an expression of the form TYPE :: NAME (PARMLIST), build
1369 the appropriate function call. */
1372 build_member_call (type, name, parmlist)
1373 tree type, name, parmlist;
1378 tree basetype_path, decl;
1380 if (TREE_CODE (name) == TEMPLATE_ID_EXPR
1381 && TREE_CODE (type) == NAMESPACE_DECL)
1383 /* 'name' already refers to the decls from the namespace, since we
1384 hit do_identifier for template_ids. */
1385 method_name = TREE_OPERAND (name, 0);
1386 /* FIXME: Since we don't do independent names right yet, the
1387 name might also be a LOOKUP_EXPR. Once we resolve this to a
1388 real decl earlier, this can go. This may happen during
1390 if (TREE_CODE (method_name) == LOOKUP_EXPR)
1392 method_name = lookup_namespace_name
1393 (type, TREE_OPERAND (method_name, 0));
1394 TREE_OPERAND (name, 0) = method_name;
1396 my_friendly_assert (is_overloaded_fn (method_name), 980519);
1397 return build_x_function_call (name, parmlist, current_class_ref);
1400 if (type == std_node)
1401 return build_x_function_call (do_scoped_id (name, 0), parmlist,
1403 if (TREE_CODE (type) == NAMESPACE_DECL)
1404 return build_x_function_call (lookup_namespace_name (type, name),
1405 parmlist, current_class_ref);
1407 if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
1409 method_name = TREE_OPERAND (name, 0);
1410 if (TREE_CODE (method_name) == COMPONENT_REF)
1411 method_name = TREE_OPERAND (method_name, 1);
1412 if (is_overloaded_fn (method_name))
1413 method_name = DECL_NAME (OVL_CURRENT (method_name));
1414 TREE_OPERAND (name, 0) = method_name;
1419 if (TREE_CODE (method_name) == BIT_NOT_EXPR)
1421 method_name = TREE_OPERAND (method_name, 0);
1425 /* This shouldn't be here, and build_member_call shouldn't appear in
1427 if (type && TREE_CODE (type) == IDENTIFIER_NODE
1428 && get_aggr_from_typedef (type, 0) == 0)
1430 tree ns = lookup_name (type, 0);
1431 if (ns && TREE_CODE (ns) == NAMESPACE_DECL)
1433 return build_x_function_call (build_offset_ref (type, name), parmlist, current_class_ref);
1437 if (type == NULL_TREE || ! is_aggr_type (type, 1))
1438 return error_mark_node;
1440 /* An operator we did not like. */
1441 if (name == NULL_TREE)
1442 return error_mark_node;
1446 cp_error ("cannot call destructor `%T::~%T' without object", type,
1448 return error_mark_node;
1451 decl = maybe_dummy_object (type, &basetype_path);
1453 /* Convert 'this' to the specified type to disambiguate conversion
1454 to the function's context. Apparently Standard C++ says that we
1455 shouldn't do this. */
1456 if (decl == current_class_ref
1458 && ACCESSIBLY_UNIQUELY_DERIVED_P (type, current_class_type))
1460 tree olddecl = current_class_ptr;
1461 tree oldtype = TREE_TYPE (TREE_TYPE (olddecl));
1462 if (oldtype != type)
1464 tree newtype = build_qualified_type (type, TYPE_QUALS (oldtype));
1465 decl = convert_force (build_pointer_type (newtype), olddecl, 0);
1466 decl = build_indirect_ref (decl, NULL_PTR);
1470 if (method_name == constructor_name (type)
1471 || method_name == constructor_name_full (type))
1472 return build_functional_cast (type, parmlist);
1473 if (lookup_fnfields (basetype_path, method_name, 0))
1474 return build_method_call (decl,
1475 TREE_CODE (name) == TEMPLATE_ID_EXPR
1476 ? name : method_name,
1477 parmlist, basetype_path,
1478 LOOKUP_NORMAL|LOOKUP_NONVIRTUAL);
1479 if (TREE_CODE (name) == IDENTIFIER_NODE
1480 && ((t = lookup_field (TYPE_BINFO (type), name, 1, 0))))
1482 if (t == error_mark_node)
1483 return error_mark_node;
1484 if (TREE_CODE (t) == FIELD_DECL)
1486 if (is_dummy_object (decl))
1488 cp_error ("invalid use of non-static field `%D'", t);
1489 return error_mark_node;
1491 decl = build (COMPONENT_REF, TREE_TYPE (t), decl, t);
1493 else if (TREE_CODE (t) == VAR_DECL)
1497 cp_error ("invalid use of member `%D'", t);
1498 return error_mark_node;
1500 if (TYPE_LANG_SPECIFIC (TREE_TYPE (decl)))
1501 return build_opfncall (CALL_EXPR, LOOKUP_NORMAL, decl,
1502 parmlist, NULL_TREE);
1503 return build_function_call (decl, parmlist);
1507 cp_error ("no method `%T::%D'", type, name);
1508 return error_mark_node;
1512 /* Build a reference to a member of an aggregate. This is not a
1513 C++ `&', but really something which can have its address taken,
1514 and then act as a pointer to member, for example TYPE :: FIELD
1515 can have its address taken by saying & TYPE :: FIELD.
1517 @@ Prints out lousy diagnostics for operator <typename>
1520 @@ This function should be rewritten and placed in search.c. */
1523 build_offset_ref (type, name)
1526 tree decl, t = error_mark_node;
1528 tree basebinfo = NULL_TREE;
1529 tree orig_name = name;
1531 /* class templates can come in as TEMPLATE_DECLs here. */
1532 if (TREE_CODE (name) == TEMPLATE_DECL)
1535 if (type == std_node)
1536 return do_scoped_id (name, 0);
1538 if (processing_template_decl || uses_template_parms (type))
1539 return build_min_nt (SCOPE_REF, type, name);
1541 /* Handle namespace names fully here. */
1542 if (TREE_CODE (type) == NAMESPACE_DECL)
1544 t = lookup_namespace_name (type, name);
1545 if (t != error_mark_node && ! type_unknown_p (t))
1548 t = convert_from_reference (t);
1553 if (type == NULL_TREE || ! is_aggr_type (type, 1))
1554 return error_mark_node;
1556 if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
1558 /* If the NAME is a TEMPLATE_ID_EXPR, we are looking at
1559 something like `a.template f<int>' or the like. For the most
1560 part, we treat this just like a.f. We do remember, however,
1561 the template-id that was used. */
1562 name = TREE_OPERAND (orig_name, 0);
1564 if (TREE_CODE (name) == LOOKUP_EXPR)
1565 /* This can happen during tsubst'ing. */
1566 name = TREE_OPERAND (name, 0);
1568 my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 0);
1571 if (TREE_CODE (name) == BIT_NOT_EXPR)
1573 if (! check_dtor_name (type, name))
1574 cp_error ("qualified type `%T' does not match destructor name `~%T'",
1575 type, TREE_OPERAND (name, 0));
1576 name = dtor_identifier;
1579 /* I think this is wrong, but the draft is unclear. --jason 6/15/98 */
1580 else if (name == constructor_name_full (type)
1581 || name == constructor_name (type))
1582 name = ctor_identifier;
1585 if (TYPE_SIZE (complete_type (type)) == 0
1586 && !TYPE_BEING_DEFINED (type))
1588 cp_error ("incomplete type `%T' does not have member `%D'", type,
1590 return error_mark_node;
1593 decl = maybe_dummy_object (type, &basebinfo);
1595 member = lookup_member (basebinfo, name, 1, 0);
1597 if (member == error_mark_node)
1598 return error_mark_node;
1600 /* A lot of this logic is now handled in lookup_field and
1602 if (member && BASELINK_P (member))
1604 /* Go from the TREE_BASELINK to the member function info. */
1605 tree fnfields = member;
1606 t = TREE_VALUE (fnfields);
1608 if (TREE_CODE (orig_name) == TEMPLATE_ID_EXPR)
1610 /* The FNFIELDS are going to contain functions that aren't
1611 necessarily templates, and templates that don't
1612 necessarily match the explicit template parameters. We
1613 save all the functions, and the explicit parameters, and
1614 then figure out exactly what to instantiate with what
1615 arguments in instantiate_type. */
1617 if (TREE_CODE (t) != OVERLOAD)
1618 /* The code in instantiate_type which will process this
1619 expects to encounter OVERLOADs, not raw functions. */
1620 t = ovl_cons (t, NULL_TREE);
1622 return build (OFFSET_REF,
1625 build (TEMPLATE_ID_EXPR,
1628 TREE_OPERAND (orig_name, 1)));
1631 if (!really_overloaded_fn (t))
1633 /* Get rid of a potential OVERLOAD around it */
1634 t = OVL_CURRENT (t);
1636 /* unique functions are handled easily. */
1637 basebinfo = TREE_PURPOSE (fnfields);
1638 if (!enforce_access (basebinfo, t))
1639 return error_mark_node;
1641 if (DECL_STATIC_FUNCTION_P (t))
1643 return build (OFFSET_REF, TREE_TYPE (t), decl, t);
1646 TREE_TYPE (fnfields) = unknown_type_node;
1647 return build (OFFSET_REF, unknown_type_node, decl, fnfields);
1654 cp_error ("`%D' is not a member of type `%T'", name, type);
1655 return error_mark_node;
1658 if (TREE_CODE (t) == TYPE_DECL)
1663 /* static class members and class-specific enum
1664 values can be returned without further ado. */
1665 if (TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == CONST_DECL)
1668 return convert_from_reference (t);
1671 if (TREE_CODE (t) == FIELD_DECL && DECL_C_BIT_FIELD (t))
1673 cp_error ("illegal pointer to bit field `%D'", t);
1674 return error_mark_node;
1677 /* static class functions too. */
1678 if (TREE_CODE (t) == FUNCTION_DECL
1679 && TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
1680 my_friendly_abort (53);
1682 /* In member functions, the form `type::name' is no longer
1683 equivalent to `this->type::name', at least not until
1684 resolve_offset_ref. */
1685 return build (OFFSET_REF, build_offset_type (type, TREE_TYPE (t)), decl, t);
1688 /* If a OFFSET_REF made it through to here, then it did
1689 not have its address taken. */
1692 resolve_offset_ref (exp)
1695 tree type = TREE_TYPE (exp);
1696 tree base = NULL_TREE;
1698 tree basetype, addr;
1700 if (TREE_CODE (exp) == OFFSET_REF)
1702 member = TREE_OPERAND (exp, 1);
1703 base = TREE_OPERAND (exp, 0);
1707 my_friendly_assert (TREE_CODE (type) == OFFSET_TYPE, 214);
1708 if (TYPE_OFFSET_BASETYPE (type) != current_class_type)
1710 error ("object missing in use of pointer-to-member construct");
1711 return error_mark_node;
1714 type = TREE_TYPE (type);
1715 base = current_class_ref;
1718 if (BASELINK_P (member))
1720 if (! flag_ms_extensions)
1721 cp_pedwarn ("assuming & on overloaded member function");
1722 return build_unary_op (ADDR_EXPR, exp, 0);
1725 if (TREE_CODE (TREE_TYPE (member)) == METHOD_TYPE)
1727 if (! flag_ms_extensions)
1728 cp_pedwarn ("assuming & on `%E'", member);
1729 return build_unary_op (ADDR_EXPR, exp, 0);
1732 if ((TREE_CODE (member) == VAR_DECL
1733 && ! TYPE_PTRMEMFUNC_P (TREE_TYPE (member))
1734 && ! TYPE_PTRMEM_P (TREE_TYPE (member)))
1735 || TREE_CODE (TREE_TYPE (member)) == FUNCTION_TYPE)
1737 /* These were static members. */
1738 if (mark_addressable (member) == 0)
1739 return error_mark_node;
1743 if (TREE_CODE (TREE_TYPE (member)) == POINTER_TYPE
1744 && TREE_CODE (TREE_TYPE (TREE_TYPE (member))) == METHOD_TYPE)
1747 /* Syntax error can cause a member which should
1748 have been seen as static to be grok'd as non-static. */
1749 if (TREE_CODE (member) == FIELD_DECL && current_class_ref == NULL_TREE)
1751 if (TREE_ADDRESSABLE (member) == 0)
1753 cp_error_at ("member `%D' is non-static but referenced as a static member",
1755 error ("at this point in file");
1756 TREE_ADDRESSABLE (member) = 1;
1758 return error_mark_node;
1761 /* The first case is really just a reference to a member of `this'. */
1762 if (TREE_CODE (member) == FIELD_DECL
1763 && (base == current_class_ref || is_dummy_object (base)))
1768 if (TREE_CODE (exp) == OFFSET_REF && TREE_CODE (type) == OFFSET_TYPE)
1769 basetype = TYPE_OFFSET_BASETYPE (type);
1771 basetype = DECL_CONTEXT (member);
1773 base = current_class_ptr;
1775 if (get_base_distance (basetype, TREE_TYPE (TREE_TYPE (base)), 0, &basetype_path) < 0)
1777 error_not_base_type (basetype, TREE_TYPE (TREE_TYPE (base)));
1778 return error_mark_node;
1780 /* Kludge: we need to use basetype_path now, because
1781 convert_pointer_to will bash it. */
1782 enforce_access (basetype_path, member);
1783 addr = convert_pointer_to (basetype, base);
1785 /* Even in the case of illegal access, we form the
1786 COMPONENT_REF; that will allow better error recovery than
1787 just feeding back error_mark_node. */
1788 expr = build (COMPONENT_REF, TREE_TYPE (member),
1789 build_indirect_ref (addr, NULL_PTR), member);
1790 return convert_from_reference (expr);
1793 /* Ensure that we have an object. */
1794 if (is_dummy_object (base))
1795 addr = error_mark_node;
1797 /* If this is a reference to a member function, then return the
1798 address of the member function (which may involve going
1799 through the object's vtable), otherwise, return an expression
1800 for the dereferenced pointer-to-member construct. */
1801 addr = build_unary_op (ADDR_EXPR, base, 0);
1803 if (TYPE_PTRMEM_P (TREE_TYPE (member)))
1805 if (addr == error_mark_node)
1807 cp_error ("object missing in `%E'", exp);
1808 return error_mark_node;
1811 basetype = TYPE_OFFSET_BASETYPE (TREE_TYPE (TREE_TYPE (member)));
1812 addr = convert_pointer_to (basetype, addr);
1813 member = cp_convert (ptrdiff_type_node, member);
1815 /* Pointer to data members are offset by one, so that a null
1816 pointer with a real value of 0 is distinguishable from an
1817 offset of the first member of a structure. */
1818 member = build_binary_op (MINUS_EXPR, member,
1819 cp_convert (ptrdiff_type_node, integer_one_node));
1821 return build1 (INDIRECT_REF, type,
1822 build (PLUS_EXPR, build_pointer_type (type),
1825 else if (TYPE_PTRMEMFUNC_P (TREE_TYPE (member)))
1827 return get_member_function_from_ptrfunc (&addr, member);
1829 my_friendly_abort (56);
1834 /* Return either DECL or its known constant value (if it has one). */
1837 decl_constant_value (decl)
1840 if (! TREE_THIS_VOLATILE (decl)
1841 && DECL_INITIAL (decl)
1842 && DECL_INITIAL (decl) != error_mark_node
1843 /* This is invalid if initial value is not constant.
1844 If it has either a function call, a memory reference,
1845 or a variable, then re-evaluating it could give different results. */
1846 && TREE_CONSTANT (DECL_INITIAL (decl))
1847 /* Check for cases where this is sub-optimal, even though valid. */
1848 && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR)
1849 return DECL_INITIAL (decl);
1853 /* Common subroutines of build_new and build_vec_delete. */
1855 /* Call the global __builtin_delete to delete ADDR. */
1858 build_builtin_delete_call (addr)
1861 mark_used (global_delete_fndecl);
1862 return build_call (global_delete_fndecl,
1863 void_type_node, build_expr_list (NULL_TREE, addr));
1866 /* Generate a C++ "new" expression. DECL is either a TREE_LIST
1867 (which needs to go through some sort of groktypename) or it
1868 is the name of the class we are newing. INIT is an initialization value.
1869 It is either an EXPRLIST, an EXPR_NO_COMMAS, or something in braces.
1870 If INIT is void_type_node, it means do *not* call a constructor
1873 For types with constructors, the data returned is initialized
1874 by the appropriate constructor.
1876 Whether the type has a constructor or not, if it has a pointer
1877 to a virtual function table, then that pointer is set up
1880 Unless I am mistaken, a call to new () will return initialized
1881 data regardless of whether the constructor itself is private or
1882 not. NOPE; new fails if the constructor is private (jcm).
1884 Note that build_new does nothing to assure that any special
1885 alignment requirements of the type are met. Rather, it leaves
1886 it up to malloc to do the right thing. Otherwise, folding to
1887 the right alignment cal cause problems if the user tries to later
1888 free the memory returned by `new'.
1890 PLACEMENT is the `placement' list for user-defined operator new (). */
1892 extern int flag_check_new;
1895 build_new (placement, decl, init, use_global_new)
1901 tree nelts = NULL_TREE, t;
1904 if (decl == error_mark_node)
1905 return error_mark_node;
1907 if (TREE_CODE (decl) == TREE_LIST)
1909 tree absdcl = TREE_VALUE (decl);
1910 tree last_absdcl = NULL_TREE;
1912 if (current_function_decl
1913 && DECL_CONSTRUCTOR_P (current_function_decl))
1914 my_friendly_assert (immediate_size_expand == 0, 19990926);
1916 nelts = integer_one_node;
1918 if (absdcl && TREE_CODE (absdcl) == CALL_EXPR)
1919 my_friendly_abort (215);
1920 while (absdcl && TREE_CODE (absdcl) == INDIRECT_REF)
1922 last_absdcl = absdcl;
1923 absdcl = TREE_OPERAND (absdcl, 0);
1926 if (absdcl && TREE_CODE (absdcl) == ARRAY_REF)
1928 /* probably meant to be a vec new */
1931 while (TREE_OPERAND (absdcl, 0)
1932 && TREE_CODE (TREE_OPERAND (absdcl, 0)) == ARRAY_REF)
1934 last_absdcl = absdcl;
1935 absdcl = TREE_OPERAND (absdcl, 0);
1939 this_nelts = TREE_OPERAND (absdcl, 1);
1940 if (this_nelts != error_mark_node)
1942 if (this_nelts == NULL_TREE)
1943 error ("new of array type fails to specify size");
1944 else if (processing_template_decl)
1947 absdcl = TREE_OPERAND (absdcl, 0);
1951 int flags = pedantic ? WANT_INT : (WANT_INT | WANT_ENUM);
1952 if (build_expr_type_conversion (flags, this_nelts, 0)
1954 pedwarn ("size in array new must have integral type");
1956 this_nelts = save_expr (cp_convert (sizetype, this_nelts));
1957 absdcl = TREE_OPERAND (absdcl, 0);
1958 if (this_nelts == integer_zero_node)
1960 warning ("zero size array reserves no space");
1961 nelts = integer_zero_node;
1964 nelts = build_binary_op (MULT_EXPR, nelts, this_nelts);
1968 nelts = integer_zero_node;
1972 TREE_OPERAND (last_absdcl, 0) = absdcl;
1974 TREE_VALUE (decl) = absdcl;
1976 type = groktypename (decl);
1977 if (! type || type == error_mark_node)
1978 return error_mark_node;
1980 else if (TREE_CODE (decl) == IDENTIFIER_NODE)
1982 if (IDENTIFIER_HAS_TYPE_VALUE (decl))
1984 /* An aggregate type. */
1985 type = IDENTIFIER_TYPE_VALUE (decl);
1986 decl = TYPE_MAIN_DECL (type);
1990 /* A builtin type. */
1991 decl = lookup_name (decl, 1);
1992 my_friendly_assert (TREE_CODE (decl) == TYPE_DECL, 215);
1993 type = TREE_TYPE (decl);
1996 else if (TREE_CODE (decl) == TYPE_DECL)
1998 type = TREE_TYPE (decl);
2003 decl = TYPE_MAIN_DECL (type);
2006 if (processing_template_decl)
2009 t = tree_cons (tree_cons (NULL_TREE, type, NULL_TREE),
2010 build_min_nt (ARRAY_REF, NULL_TREE, nelts),
2015 rval = build_min_nt (NEW_EXPR, placement, t, init);
2016 NEW_EXPR_USE_GLOBAL (rval) = use_global_new;
2020 /* ``A reference cannot be created by the new operator. A reference
2021 is not an object (8.2.2, 8.4.3), so a pointer to it could not be
2022 returned by new.'' ARM 5.3.3 */
2023 if (TREE_CODE (type) == REFERENCE_TYPE)
2025 error ("new cannot be applied to a reference type");
2026 type = TREE_TYPE (type);
2029 if (TREE_CODE (type) == FUNCTION_TYPE)
2031 error ("new cannot be applied to a function type");
2032 return error_mark_node;
2035 /* When the object being created is an array, the new-expression yields a
2036 pointer to the initial element (if any) of the array. For example,
2037 both new int and new int[10] return an int*. 5.3.4. */
2038 if (TREE_CODE (type) == ARRAY_TYPE && has_array == 0)
2040 nelts = array_type_nelts_top (type);
2042 type = TREE_TYPE (type);
2046 t = build_nt (ARRAY_REF, type, nelts);
2050 rval = build (NEW_EXPR, build_pointer_type (type), placement, t, init);
2051 NEW_EXPR_USE_GLOBAL (rval) = use_global_new;
2052 TREE_SIDE_EFFECTS (rval) = 1;
2053 rval = build_new_1 (rval);
2054 if (rval == error_mark_node)
2055 return error_mark_node;
2057 /* Wrap it in a NOP_EXPR so warn_if_unused_value doesn't complain. */
2058 rval = build1 (NOP_EXPR, TREE_TYPE (rval), rval);
2059 TREE_NO_UNUSED_WARNING (rval) = 1;
2064 /* Given a Java class, return a decl for the corresponding java.lang.Class. */
2067 build_java_class_ref (type)
2070 tree name, class_decl;
2071 static tree CL_prefix = NULL_TREE;
2072 if (CL_prefix == NULL_TREE)
2073 CL_prefix = get_identifier("_CL_");
2074 if (jclass_node == NULL_TREE)
2076 jclass_node = IDENTIFIER_GLOBAL_VALUE (get_identifier("jclass"));
2077 if (jclass_node == NULL_TREE)
2078 fatal("call to Java constructor, while `jclass' undefined");
2079 jclass_node = TREE_TYPE (jclass_node);
2081 name = build_overload_with_type (CL_prefix, type);
2082 class_decl = IDENTIFIER_GLOBAL_VALUE (name);
2083 if (class_decl == NULL_TREE)
2085 class_decl = build_decl (VAR_DECL, name, TREE_TYPE (jclass_node));
2086 TREE_STATIC (class_decl) = 1;
2087 DECL_EXTERNAL (class_decl) = 1;
2088 TREE_PUBLIC (class_decl) = 1;
2089 DECL_ARTIFICIAL (class_decl) = 1;
2090 DECL_IGNORED_P (class_decl) = 1;
2091 pushdecl_top_level (class_decl);
2092 make_decl_rtl (class_decl, NULL_PTR, 1);
2097 /* Called from cplus_expand_expr when expanding a NEW_EXPR. The return
2098 value is immediately handed to expand_expr. */
2104 tree placement, init;
2105 tree type, true_type, size, rval;
2106 tree nelts = NULL_TREE;
2107 tree alloc_expr, alloc_node = NULL_TREE;
2109 enum tree_code code = NEW_EXPR;
2110 int use_cookie, nothrow, check_new;
2112 int use_java_new = 0;
2114 placement = TREE_OPERAND (exp, 0);
2115 type = TREE_OPERAND (exp, 1);
2116 init = TREE_OPERAND (exp, 2);
2117 use_global_new = NEW_EXPR_USE_GLOBAL (exp);
2119 if (TREE_CODE (type) == ARRAY_REF)
2122 nelts = TREE_OPERAND (type, 1);
2123 type = TREE_OPERAND (type, 0);
2127 if (CP_TYPE_QUALS (type))
2128 type = TYPE_MAIN_VARIANT (type);
2130 /* If our base type is an array, then make sure we know how many elements
2132 while (TREE_CODE (true_type) == ARRAY_TYPE)
2134 tree this_nelts = array_type_nelts_top (true_type);
2135 nelts = build_binary_op (MULT_EXPR, nelts, this_nelts);
2136 true_type = TREE_TYPE (true_type);
2139 if (!complete_type_or_else (true_type, exp))
2140 return error_mark_node;
2143 size = fold (build_binary_op (MULT_EXPR, size_in_bytes (true_type),
2146 size = size_in_bytes (type);
2148 if (TREE_CODE (true_type) == VOID_TYPE)
2150 error ("invalid type `void' for new");
2151 return error_mark_node;
2154 if (abstract_virtuals_error (NULL_TREE, true_type))
2155 return error_mark_node;
2157 /* When we allocate an array, and the corresponding deallocation
2158 function takes a second argument of type size_t, and that's the
2159 "usual deallocation function", we allocate some extra space at
2160 the beginning of the array to store the size of the array.
2162 Well, that's what we should do. For backwards compatibility, we
2163 have to do this whenever there's a two-argument array-delete
2166 FIXME: For -fnew-abi, we don't have to maintain backwards
2167 compatibility and we should fix this. */
2168 use_cookie = (has_array && TYPE_VEC_NEW_USES_COOKIE (true_type)
2169 && ! (placement && ! TREE_CHAIN (placement)
2170 && TREE_TYPE (TREE_VALUE (placement)) == ptr_type_node));
2173 size = size_binop (PLUS_EXPR, size, BI_header_size);
2177 code = VEC_NEW_EXPR;
2179 if (init && pedantic)
2180 cp_pedwarn ("initialization in array new");
2183 /* Allocate the object. */
2185 if (! placement && TYPE_FOR_JAVA (true_type))
2187 tree class_addr, alloc_decl;
2188 tree class_decl = build_java_class_ref (true_type);
2189 tree class_size = size_in_bytes (true_type);
2190 static char alloc_name[] = "_Jv_AllocObject";
2192 alloc_decl = IDENTIFIER_GLOBAL_VALUE (get_identifier (alloc_name));
2193 if (alloc_decl == NULL_TREE)
2194 fatal("call to Java constructor, while `%s' undefined", alloc_name);
2195 class_addr = build1 (ADDR_EXPR, jclass_node, class_decl);
2196 rval = build_function_call (alloc_decl,
2197 tree_cons (NULL_TREE, class_addr,
2198 build_tree_list (NULL_TREE,
2200 rval = cp_convert (build_pointer_type (true_type), rval);
2204 rval = build_op_new_call
2205 (code, true_type, tree_cons (NULL_TREE, size, placement),
2206 LOOKUP_NORMAL | (use_global_new * LOOKUP_GLOBAL));
2207 rval = cp_convert (build_pointer_type (true_type), rval);
2210 /* unless an allocation function is declared with an empty excep-
2211 tion-specification (_except.spec_), throw(), it indicates failure to
2212 allocate storage by throwing a bad_alloc exception (clause _except_,
2213 _lib.bad.alloc_); it returns a non-null pointer otherwise If the allo-
2214 cation function is declared with an empty exception-specification,
2215 throw(), it returns null to indicate failure to allocate storage and a
2216 non-null pointer otherwise.
2218 So check for a null exception spec on the op new we just called. */
2223 /* The CALL_EXPR. */
2224 tree t = TREE_OPERAND (rval, 0);
2226 t = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
2227 nothrow = TYPE_NOTHROW_P (TREE_TYPE (t));
2229 check_new = (flag_check_new || nothrow) && ! use_java_new;
2231 if ((check_new || flag_exceptions) && rval)
2233 alloc_expr = get_target_expr (rval);
2234 alloc_node = rval = TREE_OPERAND (alloc_expr, 0);
2237 alloc_expr = NULL_TREE;
2239 /* if rval is NULL_TREE I don't have to allocate it, but are we totally
2240 sure we have some extra bytes in that case for the BI_header_size
2241 cookies? And how does that interact with the code below? (mrs) */
2242 /* Finish up some magic for new'ed arrays */
2243 if (use_cookie && rval != NULL_TREE)
2245 tree extra = BI_header_size;
2247 rval = convert (string_type_node, rval); /* for ptr arithmetic */
2248 rval = save_expr (build_binary_op (PLUS_EXPR, rval, extra));
2249 /* Store header info. */
2250 cookie = build_indirect_ref (build (MINUS_EXPR,
2251 build_pointer_type (BI_header_type),
2252 rval, extra), NULL_PTR);
2253 exp1 = build (MODIFY_EXPR, void_type_node,
2254 build_component_ref (cookie, nelts_identifier,
2257 rval = cp_convert (build_pointer_type (true_type), rval);
2258 rval = build_compound_expr
2259 (tree_cons (NULL_TREE, exp1,
2260 build_expr_list (NULL_TREE, rval)));
2263 if (rval == error_mark_node)
2264 return error_mark_node;
2266 /* Don't call any constructors or do any initialization. */
2267 if (init == void_type_node)
2270 if (TYPE_NEEDS_CONSTRUCTING (type) || init)
2272 if (! TYPE_NEEDS_CONSTRUCTING (type)
2273 && ! IS_AGGR_TYPE (type) && ! has_array)
2275 /* We are processing something like `new int (10)', which
2276 means allocate an int, and initialize it with 10. */
2280 /* At present RVAL is a temporary variable, created to hold
2281 the value from the call to `operator new'. We transform
2282 it to (*RVAL = INIT, RVAL). */
2283 rval = save_expr (rval);
2284 deref = build_indirect_ref (rval, NULL_PTR);
2286 /* Even for something like `new const int (10)' we must
2287 allow the expression to be non-const while we do the
2289 deref_type = TREE_TYPE (deref);
2290 if (CP_TYPE_CONST_P (deref_type))
2292 = cp_build_qualified_type (deref_type,
2293 CP_TYPE_QUALS (deref_type)
2294 & ~TYPE_QUAL_CONST);
2295 TREE_READONLY (deref) = 0;
2297 if (TREE_CHAIN (init) != NULL_TREE)
2298 pedwarn ("initializer list being treated as compound expression");
2299 else if (TREE_CODE (init) == CONSTRUCTOR)
2301 pedwarn ("initializer list appears where operand should be used");
2302 init = TREE_OPERAND (init, 1);
2304 init = build_compound_expr (init);
2306 init = convert_for_initialization (deref, type, init, LOOKUP_NORMAL,
2307 "new", NULL_TREE, 0);
2308 rval = build (COMPOUND_EXPR, TREE_TYPE (rval),
2309 build_modify_expr (deref, NOP_EXPR, init),
2311 TREE_NO_UNUSED_WARNING (rval) = 1;
2312 TREE_SIDE_EFFECTS (rval) = 1;
2314 else if (! has_array)
2317 /* Constructors are never virtual. If it has an initialization, we
2318 need to complain if we aren't allowed to use the ctor that took
2320 int flags = LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_COMPLAIN;
2322 if (rval && TYPE_USES_VIRTUAL_BASECLASSES (true_type))
2324 init = tree_cons (NULL_TREE, integer_one_node, init);
2325 flags |= LOOKUP_HAS_IN_CHARGE;
2329 rval = save_expr (rval);
2332 if (newrval && TREE_CODE (TREE_TYPE (newrval)) == POINTER_TYPE)
2333 newrval = build_indirect_ref (newrval, NULL_PTR);
2335 newrval = build_method_call (newrval, ctor_identifier,
2336 init, TYPE_BINFO (true_type), flags);
2338 if (newrval == NULL_TREE || newrval == error_mark_node)
2339 return error_mark_node;
2341 /* Java constructors compiled by jc1 do not return this. */
2343 newrval = build (COMPOUND_EXPR, TREE_TYPE (newrval),
2346 TREE_HAS_CONSTRUCTOR (rval) = 1;
2349 rval = (build_vec_init
2352 build_binary_op (MINUS_EXPR, nelts, integer_one_node),
2356 /* If any part of the object initialization terminates by throwing an
2357 exception and a suitable deallocation function can be found, the
2358 deallocation function is called to free the memory in which the
2359 object was being constructed, after which the exception continues
2360 to propagate in the context of the new-expression. If no
2361 unambiguous matching deallocation function can be found,
2362 propagating the exception does not cause the object's memory to be
2364 if (flag_exceptions && alloc_expr && ! use_java_new)
2366 enum tree_code dcode = has_array ? VEC_DELETE_EXPR : DELETE_EXPR;
2367 tree cleanup, fn = NULL_TREE;
2368 int flags = LOOKUP_NORMAL | (use_global_new * LOOKUP_GLOBAL);
2370 /* The Standard is unclear here, but the right thing to do
2371 is to use the same method for finding deallocation
2372 functions that we use for finding allocation functions. */
2373 flags |= LOOKUP_SPECULATIVELY;
2375 /* We expect alloc_expr to look like a TARGET_EXPR around
2376 a NOP_EXPR around the CALL_EXPR we want. */
2377 fn = TREE_OPERAND (alloc_expr, 1);
2378 fn = TREE_OPERAND (fn, 0);
2380 cleanup = build_op_delete_call (dcode, alloc_node, size, flags, fn);
2382 /* Ack! First we allocate the memory. Then we set our sentry
2383 variable to true, and expand a cleanup that deletes the memory
2384 if sentry is true. Then we run the constructor and store the
2385 returned pointer in buf. Then we clear sentry and return buf. */
2389 tree end, sentry, begin, buf, t = TREE_TYPE (rval);
2391 begin = get_target_expr (boolean_true_node);
2392 sentry = TREE_OPERAND (begin, 0);
2394 TREE_OPERAND (begin, 2)
2395 = build (COND_EXPR, void_type_node, sentry,
2396 cleanup, void_zero_node);
2398 rval = get_target_expr (rval);
2400 end = build (MODIFY_EXPR, TREE_TYPE (sentry),
2401 sentry, boolean_false_node);
2403 buf = TREE_OPERAND (rval, 0);
2405 rval = build (COMPOUND_EXPR, t, begin,
2406 build (COMPOUND_EXPR, t, rval,
2407 build (COMPOUND_EXPR, t, end, buf)));
2411 else if (CP_TYPE_CONST_P (true_type))
2412 cp_error ("uninitialized const in `new' of `%#T'", true_type);
2416 if (alloc_expr && rval == alloc_node)
2418 rval = TREE_OPERAND (alloc_expr, 1);
2419 alloc_expr = NULL_TREE;
2422 if (check_new && alloc_expr)
2424 /* Did we modify the storage? */
2425 tree ifexp = build_binary_op (NE_EXPR, alloc_node,
2427 rval = build_conditional_expr (ifexp, rval, alloc_node);
2431 rval = build (COMPOUND_EXPR, TREE_TYPE (rval), alloc_expr, rval);
2433 if (rval && TREE_TYPE (rval) != build_pointer_type (type))
2435 /* The type of new int [3][3] is not int *, but int [3] * */
2436 rval = build_c_cast (build_pointer_type (type), rval);
2443 build_vec_delete_1 (base, maxindex, type, auto_delete_vec, use_global_delete)
2444 tree base, maxindex, type;
2445 tree auto_delete_vec;
2446 int use_global_delete;
2449 tree ptype = build_pointer_type (type = complete_type (type));
2450 tree size_exp = size_in_bytes (type);
2452 /* Temporary variables used by the loop. */
2453 tree tbase, tbase_init;
2455 /* This is the body of the loop that implements the deletion of a
2456 single element, and moves temp variables to next elements. */
2459 /* This is the LOOP_EXPR that governs the deletion of the elements. */
2462 /* This is the thing that governs what to do after the loop has run. */
2463 tree deallocate_expr = 0;
2465 /* This is the BIND_EXPR which holds the outermost iterator of the
2466 loop. It is convenient to set this variable up and test it before
2467 executing any other code in the loop.
2468 This is also the containing expression returned by this function. */
2469 tree controller = NULL_TREE;
2471 if (! IS_AGGR_TYPE (type) || ! TYPE_NEEDS_DESTRUCTOR (type))
2473 loop = integer_zero_node;
2477 /* The below is short by BI_header_size */
2478 virtual_size = fold (size_binop (MULT_EXPR, size_exp, maxindex));
2480 tbase = create_temporary_var (ptype);
2481 tbase_init = build_modify_expr (tbase, NOP_EXPR,
2482 fold (build (PLUS_EXPR, ptype,
2485 DECL_REGISTER (tbase) = 1;
2486 controller = build (BIND_EXPR, void_type_node, tbase, NULL_TREE, NULL_TREE);
2487 TREE_SIDE_EFFECTS (controller) = 1;
2491 body = tree_cons (NULL_TREE,
2492 build_delete (ptype, tbase, integer_two_node,
2493 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1),
2496 body = tree_cons (NULL_TREE,
2497 build_modify_expr (tbase, NOP_EXPR, build (MINUS_EXPR, ptype, tbase, size_exp)),
2500 body = tree_cons (NULL_TREE,
2501 build (EXIT_EXPR, void_type_node,
2502 build (EQ_EXPR, boolean_type_node, base, tbase)),
2505 loop = build (LOOP_EXPR, void_type_node, build_compound_expr (body));
2507 loop = tree_cons (NULL_TREE, tbase_init,
2508 tree_cons (NULL_TREE, loop, NULL_TREE));
2509 loop = build_compound_expr (loop);
2512 /* If the delete flag is one, or anything else with the low bit set,
2513 delete the storage. */
2514 if (auto_delete_vec == integer_zero_node)
2515 deallocate_expr = integer_zero_node;
2520 /* The below is short by BI_header_size */
2521 virtual_size = fold (size_binop (MULT_EXPR, size_exp, maxindex));
2523 if (! TYPE_VEC_NEW_USES_COOKIE (type))
2528 base_tbd = cp_convert (ptype,
2529 build_binary_op (MINUS_EXPR,
2530 cp_convert (string_type_node, base),
2532 /* True size with header. */
2533 virtual_size = size_binop (PLUS_EXPR, virtual_size, BI_header_size);
2535 deallocate_expr = build_x_delete (base_tbd,
2536 2 | use_global_delete,
2538 deallocate_expr = fold (build (COND_EXPR, void_type_node,
2539 fold (build (BIT_AND_EXPR,
2543 deallocate_expr, integer_zero_node));
2546 if (loop && deallocate_expr != integer_zero_node)
2548 body = tree_cons (NULL_TREE, loop,
2549 tree_cons (NULL_TREE, deallocate_expr, NULL_TREE));
2550 body = build_compound_expr (body);
2555 /* Outermost wrapper: If pointer is null, punt. */
2556 body = fold (build (COND_EXPR, void_type_node,
2557 fold (build (NE_EXPR, boolean_type_node, base,
2558 integer_zero_node)),
2559 body, integer_zero_node));
2560 body = build1 (NOP_EXPR, void_type_node, body);
2564 TREE_OPERAND (controller, 1) = body;
2568 return cp_convert (void_type_node, body);
2572 create_temporary_var (type)
2577 decl = build_decl (VAR_DECL, NULL_TREE, type);
2578 TREE_USED (decl) = 1;
2579 DECL_ARTIFICIAL (decl) = 1;
2580 DECL_SOURCE_FILE (decl) = input_filename;
2581 DECL_SOURCE_LINE (decl) = lineno;
2582 DECL_IGNORED_P (decl) = 1;
2583 DECL_CONTEXT (decl) = current_function_decl;
2588 /* Create a new temporary variable of the indicated TYPE, initialized
2591 It is not entered into current_binding_level, because that breaks
2592 things when it comes time to do final cleanups (which take place
2593 "outside" the binding contour of the function). */
2596 get_temp_regvar (type, init)
2601 decl = create_temporary_var (type);
2602 if (building_stmt_tree ())
2603 add_decl_stmt (decl);
2604 if (!building_stmt_tree ())
2605 DECL_RTL (decl) = assign_temp (type, 2, 0, 1);
2606 finish_expr_stmt (build_modify_expr (decl, INIT_EXPR, init));
2611 /* `build_vec_init' returns tree structure that performs
2612 initialization of a vector of aggregate types.
2614 DECL is passed only for error reporting, and provides line number
2615 and source file name information.
2616 BASE is the space where the vector will be. For a vector of Ts,
2617 the type of BASE is `T*'.
2618 MAXINDEX is the maximum index of the array (one less than the
2619 number of elements).
2620 INIT is the (possibly NULL) initializer.
2622 FROM_ARRAY is 0 if we should init everything with INIT
2623 (i.e., every element initialized from INIT).
2624 FROM_ARRAY is 1 if we should index into INIT in parallel
2625 with initialization of DECL.
2626 FROM_ARRAY is 2 if we should index into INIT in parallel,
2627 but use assignment instead of initialization. */
2630 build_vec_init (decl, base, maxindex, init, from_array)
2631 tree decl, base, maxindex, init;
2635 tree base2 = NULL_TREE;
2637 tree itype = NULL_TREE;
2639 /* The type of an element in the array. */
2641 /* The type of a pointer to an element in the array. */
2646 tree try_block = NULL_TREE;
2647 tree try_body = NULL_TREE;
2648 int num_initialized_elts = 0;
2650 maxindex = cp_convert (ptrdiff_type_node, maxindex);
2651 if (maxindex == error_mark_node)
2652 return error_mark_node;
2654 type = TREE_TYPE (TREE_TYPE (base));
2655 ptype = build_pointer_type (type);
2656 size = size_in_bytes (type);
2658 /* The code we are generating looks like:
2662 ptrdiff_t iterator = maxindex;
2664 ... initializations from CONSTRUCTOR ...
2665 if (iterator != -1) {
2667 ... initialize *base ...
2669 } while (--iterator != -1);
2672 ... destroy elements that were constructed ...
2675 We can omit the try and catch blocks if we know that the
2676 initialization will never throw an exception, or if the array
2677 elements do not have destructors. If we have a CONSTRUCTOR to
2678 give us initialization information, we emit code to initialize
2679 each of the elements before the loop in the try block, and then
2680 iterate over fewer elements. We can omit the loop completely if
2681 the elements of the array do not have constructors.
2683 We actually wrap the entire body of the above in a STMT_EXPR, for
2686 When copying from array to another, when the array elements have
2687 only trivial copy constructors, we should use __builtin_memcpy
2688 rather than generating a loop. That way, we could take advantage
2689 of whatever cleverness the back-end has for dealing with copies
2690 of blocks of memory. */
2692 begin_init_stmts (&stmt_expr, &compound_stmt);
2693 destroy_temps = stmts_are_full_exprs_p;
2694 stmts_are_full_exprs_p = 0;
2695 rval = get_temp_regvar (ptype,
2696 cp_convert (ptype, default_conversion (base)));
2697 base = get_temp_regvar (ptype, rval);
2698 iterator = get_temp_regvar (ptrdiff_type_node, maxindex);
2700 /* Protect the entire array initialization so that we can destroy
2701 the partially constructed array if an exception is thrown. */
2702 if (flag_exceptions && TYPE_NEEDS_DESTRUCTOR (type))
2704 try_block = begin_try_block ();
2705 try_body = begin_compound_stmt (/*has_no_scope=*/1);
2708 if (init != NULL_TREE && TREE_CODE (init) == CONSTRUCTOR
2709 && (!decl || same_type_p (TREE_TYPE (init), TREE_TYPE (decl))))
2711 /* Do non-default initialization resulting from brace-enclosed
2717 for (elts = CONSTRUCTOR_ELTS (init); elts; elts = TREE_CHAIN (elts))
2719 tree elt = TREE_VALUE (elts);
2720 tree baseref = build1 (INDIRECT_REF, type, base);
2722 num_initialized_elts++;
2724 if (IS_AGGR_TYPE (type) || TREE_CODE (type) == ARRAY_TYPE)
2725 finish_expr_stmt (build_aggr_init (baseref, elt, 0));
2727 finish_expr_stmt (build_modify_expr (baseref, NOP_EXPR,
2730 finish_expr_stmt (build_modify_expr
2733 build (PLUS_EXPR, build_pointer_type (type),
2735 finish_expr_stmt (build_modify_expr
2738 build (MINUS_EXPR, ptrdiff_type_node,
2739 iterator, integer_one_node)));
2742 /* Clear out INIT so that we don't get confused below. */
2745 else if (from_array)
2747 /* If initializing one array from another, initialize element by
2748 element. We rely upon the below calls the do argument
2750 if (decl == NULL_TREE)
2752 sorry ("initialization of array from dissimilar array type");
2753 return error_mark_node;
2757 base2 = default_conversion (init);
2758 itype = TREE_TYPE (base2);
2759 base2 = get_temp_regvar (itype, base2);
2760 itype = TREE_TYPE (itype);
2762 else if (TYPE_LANG_SPECIFIC (type)
2763 && TYPE_NEEDS_CONSTRUCTING (type)
2764 && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
2766 error ("initializer ends prematurely");
2767 return error_mark_node;
2771 /* Now, default-initialize any remaining elements. We don't need to
2772 do that if a) the type does not need constructing, or b) we've
2773 already initialized all the elements.
2775 We do need to keep going if we're copying an array. */
2778 || (TYPE_NEEDS_CONSTRUCTING (type)
2779 && !(TREE_CODE (maxindex) == INTEGER_CST
2780 && num_initialized_elts == TREE_INT_CST_LOW (maxindex) + 1)))
2782 /* If the ITERATOR is equal to -1, then we don't have to loop;
2783 we've already initialized all the elements. */
2789 if_stmt = begin_if_stmt ();
2790 finish_if_stmt_cond (build (NE_EXPR, boolean_type_node,
2791 iterator, minus_one_node),
2794 /* Otherwise, loop through the elements. */
2795 do_stmt = begin_do_stmt ();
2796 do_body = begin_compound_stmt (/*has_no_scope=*/1);
2798 /* When we're not building a statement-tree, things are a little
2799 complicated. If, when we recursively call build_aggr_init,
2800 an expression containing a TARGET_EXPR is expanded, then it
2801 may get a cleanup. Then, the result of that expression is
2802 passed to finish_expr_stmt, which will call
2803 expand_start_target_temps/expand_end_target_temps. However,
2804 the latter call will not cause the cleanup to run because
2805 that block will still be on the block stack. So, we call
2806 expand_start_target_temps here manually; the corresponding
2807 call to expand_end_target_temps below will cause the cleanup
2809 if (!building_stmt_tree ())
2810 expand_start_target_temps ();
2814 tree to = build1 (INDIRECT_REF, type, base);
2818 from = build1 (INDIRECT_REF, itype, base2);
2822 if (from_array == 2)
2823 elt_init = build_modify_expr (to, NOP_EXPR, from);
2824 else if (TYPE_NEEDS_CONSTRUCTING (type))
2825 elt_init = build_aggr_init (to, from, 0);
2827 elt_init = build_modify_expr (to, NOP_EXPR, from);
2829 my_friendly_abort (57);
2831 else if (TREE_CODE (type) == ARRAY_TYPE)
2834 sorry ("cannot initialize multi-dimensional array with initializer");
2835 elt_init = (build_vec_init
2838 build_pointer_type (TREE_TYPE (type)),
2840 array_type_nelts (type), 0, 0));
2843 elt_init = build_aggr_init (build1 (INDIRECT_REF, type, base),
2846 /* The initialization of each array element is a
2848 if (!building_stmt_tree ())
2850 finish_expr_stmt (elt_init);
2851 expand_end_target_temps ();
2855 stmts_are_full_exprs_p = 1;
2856 finish_expr_stmt (elt_init);
2857 stmts_are_full_exprs_p = 0;
2860 finish_expr_stmt (build_modify_expr
2863 build (PLUS_EXPR, build_pointer_type (type),
2866 finish_expr_stmt (build_modify_expr
2869 build (PLUS_EXPR, build_pointer_type (type),
2872 finish_compound_stmt (/*has_no_scope=*/1, do_body);
2873 finish_do_body (do_stmt);
2874 finish_do_stmt (build (NE_EXPR, boolean_type_node,
2875 build (PREDECREMENT_EXPR,
2882 finish_then_clause (if_stmt);
2886 /* Make sure to cleanup any partially constructed elements. */
2887 if (flag_exceptions && TYPE_NEEDS_DESTRUCTOR (type))
2891 finish_compound_stmt (/*has_no_scope=*/1, try_body);
2892 finish_cleanup_try_block (try_block);
2893 e = build_vec_delete_1 (rval,
2894 build_binary_op (MINUS_EXPR, maxindex,
2897 /*auto_delete_vec=*/integer_zero_node,
2898 /*use_global_delete=*/0);
2899 finish_cleanup (e, try_block);
2902 /* The value of the array initialization is the address of the
2903 first element in the array. */
2904 finish_expr_stmt (rval);
2906 stmt_expr = finish_init_stmts (stmt_expr, compound_stmt);
2907 stmts_are_full_exprs_p = destroy_temps;
2911 /* Free up storage of type TYPE, at address ADDR.
2913 TYPE is a POINTER_TYPE and can be ptr_type_node for no special type
2916 VIRTUAL_SIZE is the amount of storage that was allocated, and is
2917 used as the second argument to operator delete. It can include
2918 things like padding and magic size cookies. It has virtual in it,
2919 because if you have a base pointer and you delete through a virtual
2920 destructor, it should be the size of the dynamic object, not the
2921 static object, see Free Store 12.5 ANSI C++ WP.
2923 This does not call any destructors. */
2926 build_x_delete (addr, which_delete, virtual_size)
2931 int use_global_delete = which_delete & 1;
2932 int use_vec_delete = !!(which_delete & 2);
2933 enum tree_code code = use_vec_delete ? VEC_DELETE_EXPR : DELETE_EXPR;
2934 int flags = LOOKUP_NORMAL | (use_global_delete * LOOKUP_GLOBAL);
2936 return build_op_delete_call (code, addr, virtual_size, flags, NULL_TREE);
2939 /* Generate a call to a destructor. TYPE is the type to cast ADDR to.
2940 ADDR is an expression which yields the store to be destroyed.
2941 AUTO_DELETE is nonzero if a call to DELETE should be made or not.
2942 If in the program, (AUTO_DELETE & 2) is non-zero, we tear down the
2943 virtual baseclasses.
2944 If in the program, (AUTO_DELETE & 1) is non-zero, then we deallocate.
2946 FLAGS is the logical disjunction of zero or more LOOKUP_
2947 flags. See cp-tree.h for more info.
2949 This function does not delete an object's virtual base classes. */
2952 build_delete (type, addr, auto_delete, flags, use_global_delete)
2956 int use_global_delete;
2962 if (addr == error_mark_node)
2963 return error_mark_node;
2965 /* Can happen when CURRENT_EXCEPTION_OBJECT gets its type
2966 set to `error_mark_node' before it gets properly cleaned up. */
2967 if (type == error_mark_node)
2968 return error_mark_node;
2970 type = TYPE_MAIN_VARIANT (type);
2972 if (TREE_CODE (type) == POINTER_TYPE)
2974 type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
2975 if (type != void_type_node && !complete_type_or_else (type, addr))
2976 return error_mark_node;
2977 if (TREE_CODE (type) == ARRAY_TYPE)
2979 if (! IS_AGGR_TYPE (type))
2981 /* Call the builtin operator delete. */
2982 return build_builtin_delete_call (addr);
2984 if (TREE_SIDE_EFFECTS (addr))
2985 addr = save_expr (addr);
2987 /* throw away const and volatile on target type of addr */
2988 addr = convert_force (build_pointer_type (type), addr, 0);
2989 ref = build_indirect_ref (addr, NULL_PTR);
2991 else if (TREE_CODE (type) == ARRAY_TYPE)
2994 if (TREE_SIDE_EFFECTS (addr))
2995 addr = save_expr (addr);
2996 if (TYPE_DOMAIN (type) == NULL_TREE)
2998 error ("unknown array size in delete");
2999 return error_mark_node;
3001 return build_vec_delete (addr, array_type_nelts (type),
3002 auto_delete, use_global_delete);
3006 /* Don't check PROTECT here; leave that decision to the
3007 destructor. If the destructor is accessible, call it,
3008 else report error. */
3009 addr = build_unary_op (ADDR_EXPR, addr, 0);
3010 if (TREE_SIDE_EFFECTS (addr))
3011 addr = save_expr (addr);
3013 if (TREE_CONSTANT (addr))
3014 addr = convert_pointer_to (type, addr);
3016 addr = convert_force (build_pointer_type (type), addr, 0);
3018 ref = build_indirect_ref (addr, NULL_PTR);
3021 my_friendly_assert (IS_AGGR_TYPE (type), 220);
3023 if (! TYPE_NEEDS_DESTRUCTOR (type))
3025 if (auto_delete == integer_zero_node)
3026 return void_zero_node;
3028 return build_op_delete_call
3029 (DELETE_EXPR, addr, c_sizeof_nowarn (type),
3030 LOOKUP_NORMAL | (use_global_delete * LOOKUP_GLOBAL),
3034 /* Below, we will reverse the order in which these calls are made.
3035 If we have a destructor, then that destructor will take care
3036 of the base classes; otherwise, we must do that here. */
3037 if (TYPE_HAS_DESTRUCTOR (type))
3039 tree passed_auto_delete;
3040 tree do_delete = NULL_TREE;
3043 if (use_global_delete)
3045 tree cond = fold (build (BIT_AND_EXPR, integer_type_node,
3046 auto_delete, integer_one_node));
3047 tree call = build_builtin_delete_call (addr);
3049 cond = fold (build (COND_EXPR, void_type_node, cond,
3050 call, void_zero_node));
3051 if (cond != void_zero_node)
3054 passed_auto_delete = fold (build (BIT_AND_EXPR, integer_type_node,
3055 auto_delete, integer_two_node));
3058 passed_auto_delete = auto_delete;
3060 expr = build_method_call
3061 (ref, dtor_identifier, build_expr_list (NULL_TREE, passed_auto_delete),
3065 expr = build (COMPOUND_EXPR, void_type_node, expr, do_delete);
3067 if (flags & LOOKUP_DESTRUCTOR)
3068 /* Explicit destructor call; don't check for null pointer. */
3069 ifexp = integer_one_node;
3071 /* Handle deleting a null pointer. */
3072 ifexp = fold (build_binary_op (NE_EXPR, addr, integer_zero_node));
3074 if (ifexp != integer_one_node)
3075 expr = build (COND_EXPR, void_type_node,
3076 ifexp, expr, void_zero_node);
3082 /* We only get here from finish_function for a destructor. */
3083 tree binfos = BINFO_BASETYPES (TYPE_BINFO (type));
3084 int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
3085 tree base_binfo = n_baseclasses > 0 ? TREE_VEC_ELT (binfos, 0) : NULL_TREE;
3086 tree exprstmt = NULL_TREE;
3087 tree parent_auto_delete = auto_delete;
3090 /* Set this again before we call anything, as we might get called
3092 TYPE_HAS_DESTRUCTOR (type) = 1;
3094 /* If we have member delete or vbases, we call delete in
3096 if (auto_delete == integer_zero_node)
3098 else if (base_binfo == NULL_TREE
3099 || ! TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo)))
3101 cond = build (COND_EXPR, void_type_node,
3102 build (BIT_AND_EXPR, integer_type_node, auto_delete, integer_one_node),
3103 build_builtin_delete_call (addr),
3110 exprstmt = build_expr_list (NULL_TREE, cond);
3113 && ! TREE_VIA_VIRTUAL (base_binfo)
3114 && TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo)))
3116 tree this_auto_delete;
3118 if (BINFO_OFFSET_ZEROP (base_binfo))
3119 this_auto_delete = parent_auto_delete;
3121 this_auto_delete = integer_zero_node;
3123 expr = build_scoped_method_call
3124 (ref, base_binfo, dtor_identifier,
3125 build_expr_list (NULL_TREE, this_auto_delete));
3126 exprstmt = tree_cons (NULL_TREE, expr, exprstmt);
3129 /* Take care of the remaining baseclasses. */
3130 for (i = 1; i < n_baseclasses; i++)
3132 base_binfo = TREE_VEC_ELT (binfos, i);
3133 if (! TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo))
3134 || TREE_VIA_VIRTUAL (base_binfo))
3137 expr = build_scoped_method_call
3138 (ref, base_binfo, dtor_identifier,
3139 build_expr_list (NULL_TREE, integer_zero_node));
3141 exprstmt = tree_cons (NULL_TREE, expr, exprstmt);
3144 for (member = TYPE_FIELDS (type); member; member = TREE_CHAIN (member))
3146 if (TREE_CODE (member) != FIELD_DECL)
3148 if (TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (member)))
3150 tree this_member = build_component_ref (ref, DECL_NAME (member), NULL_TREE, 0);
3151 tree this_type = TREE_TYPE (member);
3152 expr = build_delete (this_type, this_member, integer_two_node, flags, 0);
3153 exprstmt = tree_cons (NULL_TREE, expr, exprstmt);
3158 return build_compound_expr (exprstmt);
3159 /* Virtual base classes make this function do nothing. */
3160 return void_zero_node;
3164 /* For type TYPE, delete the virtual baseclass objects of DECL. */
3167 build_vbase_delete (type, decl)
3170 tree vbases = CLASSTYPE_VBASECLASSES (type);
3171 tree result = NULL_TREE;
3172 tree addr = build_unary_op (ADDR_EXPR, decl, 0);
3174 my_friendly_assert (addr != error_mark_node, 222);
3178 tree this_addr = convert_force (build_pointer_type (BINFO_TYPE (vbases)),
3180 result = tree_cons (NULL_TREE,
3181 build_delete (TREE_TYPE (this_addr), this_addr,
3183 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 0),
3185 vbases = TREE_CHAIN (vbases);
3187 return build_compound_expr (nreverse (result));
3190 /* Build a C++ vector delete expression.
3191 MAXINDEX is the number of elements to be deleted.
3192 ELT_SIZE is the nominal size of each element in the vector.
3193 BASE is the expression that should yield the store to be deleted.
3194 This function expands (or synthesizes) these calls itself.
3195 AUTO_DELETE_VEC says whether the container (vector) should be deallocated.
3197 This also calls delete for virtual baseclasses of elements of the vector.
3199 Update: MAXINDEX is no longer needed. The size can be extracted from the
3200 start of the vector for pointers, and from the type for arrays. We still
3201 use MAXINDEX for arrays because it happens to already have one of the
3202 values we'd have to extract. (We could use MAXINDEX with pointers to
3203 confirm the size, and trap if the numbers differ; not clear that it'd
3204 be worth bothering.) */
3207 build_vec_delete (base, maxindex, auto_delete_vec, use_global_delete)
3208 tree base, maxindex;
3209 tree auto_delete_vec;
3210 int use_global_delete;
3214 if (TREE_CODE (base) == OFFSET_REF)
3215 base = resolve_offset_ref (base);
3217 type = TREE_TYPE (base);
3219 base = stabilize_reference (base);
3221 /* Since we can use base many times, save_expr it. */
3222 if (TREE_SIDE_EFFECTS (base))
3223 base = save_expr (base);
3225 if (TREE_CODE (type) == POINTER_TYPE)
3227 /* Step back one from start of vector, and read dimension. */
3228 tree cookie_addr = build (MINUS_EXPR, build_pointer_type (BI_header_type),
3229 base, BI_header_size);
3230 tree cookie = build_indirect_ref (cookie_addr, NULL_PTR);
3231 maxindex = build_component_ref (cookie, nelts_identifier, NULL_TREE, 0);
3233 type = TREE_TYPE (type);
3234 while (TREE_CODE (type) == ARRAY_TYPE);
3236 else if (TREE_CODE (type) == ARRAY_TYPE)
3238 /* get the total number of things in the array, maxindex is a bad name */
3239 maxindex = array_type_nelts_total (type);
3240 while (TREE_CODE (type) == ARRAY_TYPE)
3241 type = TREE_TYPE (type);
3242 base = build_unary_op (ADDR_EXPR, base, 1);
3246 if (base != error_mark_node)
3247 error ("type to vector delete is neither pointer or array type");
3248 return error_mark_node;
3251 return build_vec_delete_1 (base, maxindex, type, auto_delete_vec,