2014-01-30 Alangi Derick <alangiderick@gmail.com>
[official-gcc.git] / gcc / cp / init.c
blob194a79777f4754298587d3d727fe37d90780acfd
1 /* Handle initialization things in C++.
2 Copyright (C) 1987-2014 Free Software Foundation, Inc.
3 Contributed by Michael Tiemann (tiemann@cygnus.com)
5 This file is part of GCC.
7 GCC 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 3, or (at your option)
10 any later version.
12 GCC 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 GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 /* High-level class interface. */
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "tree.h"
28 #include "stringpool.h"
29 #include "varasm.h"
30 #include "cp-tree.h"
31 #include "flags.h"
32 #include "target.h"
33 #include "gimplify.h"
35 static bool begin_init_stmts (tree *, tree *);
36 static tree finish_init_stmts (bool, tree, tree);
37 static void construct_virtual_base (tree, tree);
38 static void expand_aggr_init_1 (tree, tree, tree, tree, int, tsubst_flags_t);
39 static void expand_default_init (tree, tree, tree, tree, int, tsubst_flags_t);
40 static void perform_member_init (tree, tree);
41 static tree build_builtin_delete_call (tree);
42 static int member_init_ok_or_else (tree, tree, tree);
43 static void expand_virtual_init (tree, tree);
44 static tree sort_mem_initializers (tree, tree);
45 static tree initializing_context (tree);
46 static void expand_cleanup_for_base (tree, tree);
47 static tree dfs_initialize_vtbl_ptrs (tree, void *);
48 static tree build_field_list (tree, tree, int *);
49 static int diagnose_uninitialized_cst_or_ref_member_1 (tree, tree, bool, bool);
51 /* We are about to generate some complex initialization code.
52 Conceptually, it is all a single expression. However, we may want
53 to include conditionals, loops, and other such statement-level
54 constructs. Therefore, we build the initialization code inside a
55 statement-expression. This function starts such an expression.
56 STMT_EXPR_P and COMPOUND_STMT_P are filled in by this function;
57 pass them back to finish_init_stmts when the expression is
58 complete. */
60 static bool
61 begin_init_stmts (tree *stmt_expr_p, tree *compound_stmt_p)
63 bool is_global = !building_stmt_list_p ();
65 *stmt_expr_p = begin_stmt_expr ();
66 *compound_stmt_p = begin_compound_stmt (BCS_NO_SCOPE);
68 return is_global;
71 /* Finish out the statement-expression begun by the previous call to
72 begin_init_stmts. Returns the statement-expression itself. */
74 static tree
75 finish_init_stmts (bool is_global, tree stmt_expr, tree compound_stmt)
77 finish_compound_stmt (compound_stmt);
79 stmt_expr = finish_stmt_expr (stmt_expr, true);
81 gcc_assert (!building_stmt_list_p () == is_global);
83 return stmt_expr;
86 /* Constructors */
88 /* Called from initialize_vtbl_ptrs via dfs_walk. BINFO is the base
89 which we want to initialize the vtable pointer for, DATA is
90 TREE_LIST whose TREE_VALUE is the this ptr expression. */
92 static tree
93 dfs_initialize_vtbl_ptrs (tree binfo, void *data)
95 if (!TYPE_CONTAINS_VPTR_P (BINFO_TYPE (binfo)))
96 return dfs_skip_bases;
98 if (!BINFO_PRIMARY_P (binfo) || BINFO_VIRTUAL_P (binfo))
100 tree base_ptr = TREE_VALUE ((tree) data);
102 base_ptr = build_base_path (PLUS_EXPR, base_ptr, binfo, /*nonnull=*/1,
103 tf_warning_or_error);
105 expand_virtual_init (binfo, base_ptr);
108 return NULL_TREE;
111 /* Initialize all the vtable pointers in the object pointed to by
112 ADDR. */
114 void
115 initialize_vtbl_ptrs (tree addr)
117 tree list;
118 tree type;
120 type = TREE_TYPE (TREE_TYPE (addr));
121 list = build_tree_list (type, addr);
123 /* Walk through the hierarchy, initializing the vptr in each base
124 class. We do these in pre-order because we can't find the virtual
125 bases for a class until we've initialized the vtbl for that
126 class. */
127 dfs_walk_once (TYPE_BINFO (type), dfs_initialize_vtbl_ptrs, NULL, list);
130 /* Return an expression for the zero-initialization of an object with
131 type T. This expression will either be a constant (in the case
132 that T is a scalar), or a CONSTRUCTOR (in the case that T is an
133 aggregate), or NULL (in the case that T does not require
134 initialization). In either case, the value can be used as
135 DECL_INITIAL for a decl of the indicated TYPE; it is a valid static
136 initializer. If NELTS is non-NULL, and TYPE is an ARRAY_TYPE, NELTS
137 is the number of elements in the array. If STATIC_STORAGE_P is
138 TRUE, initializers are only generated for entities for which
139 zero-initialization does not simply mean filling the storage with
140 zero bytes. FIELD_SIZE, if non-NULL, is the bit size of the field,
141 subfields with bit positions at or above that bit size shouldn't
142 be added. Note that this only works when the result is assigned
143 to a base COMPONENT_REF; if we only have a pointer to the base subobject,
144 expand_assignment will end up clearing the full size of TYPE. */
146 static tree
147 build_zero_init_1 (tree type, tree nelts, bool static_storage_p,
148 tree field_size)
150 tree init = NULL_TREE;
152 /* [dcl.init]
154 To zero-initialize an object of type T means:
156 -- if T is a scalar type, the storage is set to the value of zero
157 converted to T.
159 -- if T is a non-union class type, the storage for each nonstatic
160 data member and each base-class subobject is zero-initialized.
162 -- if T is a union type, the storage for its first data member is
163 zero-initialized.
165 -- if T is an array type, the storage for each element is
166 zero-initialized.
168 -- if T is a reference type, no initialization is performed. */
170 gcc_assert (nelts == NULL_TREE || TREE_CODE (nelts) == INTEGER_CST);
172 if (type == error_mark_node)
174 else if (static_storage_p && zero_init_p (type))
175 /* In order to save space, we do not explicitly build initializers
176 for items that do not need them. GCC's semantics are that
177 items with static storage duration that are not otherwise
178 initialized are initialized to zero. */
180 else if (TYPE_PTR_OR_PTRMEM_P (type))
181 init = convert (type, nullptr_node);
182 else if (SCALAR_TYPE_P (type))
183 init = convert (type, integer_zero_node);
184 else if (RECORD_OR_UNION_CODE_P (TREE_CODE (type)))
186 tree field;
187 vec<constructor_elt, va_gc> *v = NULL;
189 /* Iterate over the fields, building initializations. */
190 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
192 if (TREE_CODE (field) != FIELD_DECL)
193 continue;
195 /* Don't add virtual bases for base classes if they are beyond
196 the size of the current field, that means it is present
197 somewhere else in the object. */
198 if (field_size)
200 tree bitpos = bit_position (field);
201 if (TREE_CODE (bitpos) == INTEGER_CST
202 && !tree_int_cst_lt (bitpos, field_size))
203 continue;
206 /* Note that for class types there will be FIELD_DECLs
207 corresponding to base classes as well. Thus, iterating
208 over TYPE_FIELDs will result in correct initialization of
209 all of the subobjects. */
210 if (!static_storage_p || !zero_init_p (TREE_TYPE (field)))
212 tree new_field_size
213 = (DECL_FIELD_IS_BASE (field)
214 && DECL_SIZE (field)
215 && TREE_CODE (DECL_SIZE (field)) == INTEGER_CST)
216 ? DECL_SIZE (field) : NULL_TREE;
217 tree value = build_zero_init_1 (TREE_TYPE (field),
218 /*nelts=*/NULL_TREE,
219 static_storage_p,
220 new_field_size);
221 if (value)
222 CONSTRUCTOR_APPEND_ELT(v, field, value);
225 /* For unions, only the first field is initialized. */
226 if (TREE_CODE (type) == UNION_TYPE)
227 break;
230 /* Build a constructor to contain the initializations. */
231 init = build_constructor (type, v);
233 else if (TREE_CODE (type) == ARRAY_TYPE)
235 tree max_index;
236 vec<constructor_elt, va_gc> *v = NULL;
238 /* Iterate over the array elements, building initializations. */
239 if (nelts)
240 max_index = fold_build2_loc (input_location,
241 MINUS_EXPR, TREE_TYPE (nelts),
242 nelts, integer_one_node);
243 else
244 max_index = array_type_nelts (type);
246 /* If we have an error_mark here, we should just return error mark
247 as we don't know the size of the array yet. */
248 if (max_index == error_mark_node)
249 return error_mark_node;
250 gcc_assert (TREE_CODE (max_index) == INTEGER_CST);
252 /* A zero-sized array, which is accepted as an extension, will
253 have an upper bound of -1. */
254 if (!tree_int_cst_equal (max_index, integer_minus_one_node))
256 constructor_elt ce;
258 /* If this is a one element array, we just use a regular init. */
259 if (tree_int_cst_equal (size_zero_node, max_index))
260 ce.index = size_zero_node;
261 else
262 ce.index = build2 (RANGE_EXPR, sizetype, size_zero_node,
263 max_index);
265 ce.value = build_zero_init_1 (TREE_TYPE (type),
266 /*nelts=*/NULL_TREE,
267 static_storage_p, NULL_TREE);
268 if (ce.value)
270 vec_alloc (v, 1);
271 v->quick_push (ce);
275 /* Build a constructor to contain the initializations. */
276 init = build_constructor (type, v);
278 else if (TREE_CODE (type) == VECTOR_TYPE)
279 init = build_zero_cst (type);
280 else
281 gcc_assert (TREE_CODE (type) == REFERENCE_TYPE);
283 /* In all cases, the initializer is a constant. */
284 if (init)
285 TREE_CONSTANT (init) = 1;
287 return init;
290 /* Return an expression for the zero-initialization of an object with
291 type T. This expression will either be a constant (in the case
292 that T is a scalar), or a CONSTRUCTOR (in the case that T is an
293 aggregate), or NULL (in the case that T does not require
294 initialization). In either case, the value can be used as
295 DECL_INITIAL for a decl of the indicated TYPE; it is a valid static
296 initializer. If NELTS is non-NULL, and TYPE is an ARRAY_TYPE, NELTS
297 is the number of elements in the array. If STATIC_STORAGE_P is
298 TRUE, initializers are only generated for entities for which
299 zero-initialization does not simply mean filling the storage with
300 zero bytes. */
302 tree
303 build_zero_init (tree type, tree nelts, bool static_storage_p)
305 return build_zero_init_1 (type, nelts, static_storage_p, NULL_TREE);
308 /* Return a suitable initializer for value-initializing an object of type
309 TYPE, as described in [dcl.init]. */
311 tree
312 build_value_init (tree type, tsubst_flags_t complain)
314 /* [dcl.init]
316 To value-initialize an object of type T means:
318 - if T is a class type (clause 9) with either no default constructor
319 (12.1) or a default constructor that is user-provided or deleted,
320 then then the object is default-initialized;
322 - if T is a (possibly cv-qualified) class type without a user-provided
323 or deleted default constructor, then the object is zero-initialized
324 and the semantic constraints for default-initialization are checked,
325 and if T has a non-trivial default constructor, the object is
326 default-initialized;
328 - if T is an array type, then each element is value-initialized;
330 - otherwise, the object is zero-initialized.
332 A program that calls for default-initialization or
333 value-initialization of an entity of reference type is ill-formed. */
335 /* The AGGR_INIT_EXPR tweaking below breaks in templates. */
336 gcc_assert (!processing_template_decl
337 || (SCALAR_TYPE_P (type) || TREE_CODE (type) == ARRAY_TYPE));
339 if (type_build_ctor_call (type))
341 tree ctor = build_aggr_init_expr
342 (type,
343 build_special_member_call (NULL_TREE, complete_ctor_identifier,
344 NULL, type, LOOKUP_NORMAL,
345 complain));
346 if (ctor == error_mark_node
347 || type_has_user_provided_default_constructor (type))
348 return ctor;
349 else if (TYPE_HAS_COMPLEX_DFLT (type))
351 /* This is a class that needs constructing, but doesn't have
352 a user-provided constructor. So we need to zero-initialize
353 the object and then call the implicitly defined ctor.
354 This will be handled in simplify_aggr_init_expr. */
355 AGGR_INIT_ZERO_FIRST (ctor) = 1;
356 return ctor;
360 /* Discard any access checking during subobject initialization;
361 the checks are implied by the call to the ctor which we have
362 verified is OK (cpp0x/defaulted46.C). */
363 push_deferring_access_checks (dk_deferred);
364 tree r = build_value_init_noctor (type, complain);
365 pop_deferring_access_checks ();
366 return r;
369 /* Like build_value_init, but don't call the constructor for TYPE. Used
370 for base initializers. */
372 tree
373 build_value_init_noctor (tree type, tsubst_flags_t complain)
375 if (!COMPLETE_TYPE_P (type))
377 if (complain & tf_error)
378 error ("value-initialization of incomplete type %qT", type);
379 return error_mark_node;
381 /* FIXME the class and array cases should just use digest_init once it is
382 SFINAE-enabled. */
383 if (CLASS_TYPE_P (type))
385 gcc_assert (!TYPE_HAS_COMPLEX_DFLT (type)
386 || errorcount != 0);
388 if (TREE_CODE (type) != UNION_TYPE)
390 tree field;
391 vec<constructor_elt, va_gc> *v = NULL;
393 /* Iterate over the fields, building initializations. */
394 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
396 tree ftype, value;
398 if (TREE_CODE (field) != FIELD_DECL)
399 continue;
401 ftype = TREE_TYPE (field);
403 if (ftype == error_mark_node)
404 continue;
406 /* We could skip vfields and fields of types with
407 user-defined constructors, but I think that won't improve
408 performance at all; it should be simpler in general just
409 to zero out the entire object than try to only zero the
410 bits that actually need it. */
412 /* Note that for class types there will be FIELD_DECLs
413 corresponding to base classes as well. Thus, iterating
414 over TYPE_FIELDs will result in correct initialization of
415 all of the subobjects. */
416 value = build_value_init (ftype, complain);
418 if (value == error_mark_node)
419 return error_mark_node;
421 if (value)
422 CONSTRUCTOR_APPEND_ELT(v, field, value);
425 /* Build a constructor to contain the zero- initializations. */
426 return build_constructor (type, v);
429 else if (TREE_CODE (type) == ARRAY_TYPE)
431 vec<constructor_elt, va_gc> *v = NULL;
433 /* Iterate over the array elements, building initializations. */
434 tree max_index = array_type_nelts (type);
436 /* If we have an error_mark here, we should just return error mark
437 as we don't know the size of the array yet. */
438 if (max_index == error_mark_node)
440 if (complain & tf_error)
441 error ("cannot value-initialize array of unknown bound %qT",
442 type);
443 return error_mark_node;
445 gcc_assert (TREE_CODE (max_index) == INTEGER_CST);
447 /* A zero-sized array, which is accepted as an extension, will
448 have an upper bound of -1. */
449 if (!tree_int_cst_equal (max_index, integer_minus_one_node))
451 constructor_elt ce;
453 /* If this is a one element array, we just use a regular init. */
454 if (tree_int_cst_equal (size_zero_node, max_index))
455 ce.index = size_zero_node;
456 else
457 ce.index = build2 (RANGE_EXPR, sizetype, size_zero_node, max_index);
459 ce.value = build_value_init (TREE_TYPE (type), complain);
460 if (ce.value)
462 if (ce.value == error_mark_node)
463 return error_mark_node;
465 vec_alloc (v, 1);
466 v->quick_push (ce);
468 /* We shouldn't have gotten here for anything that would need
469 non-trivial initialization, and gimplify_init_ctor_preeval
470 would need to be fixed to allow it. */
471 gcc_assert (TREE_CODE (ce.value) != TARGET_EXPR
472 && TREE_CODE (ce.value) != AGGR_INIT_EXPR);
476 /* Build a constructor to contain the initializations. */
477 return build_constructor (type, v);
479 else if (TREE_CODE (type) == FUNCTION_TYPE)
481 if (complain & tf_error)
482 error ("value-initialization of function type %qT", type);
483 return error_mark_node;
485 else if (TREE_CODE (type) == REFERENCE_TYPE)
487 if (complain & tf_error)
488 error ("value-initialization of reference type %qT", type);
489 return error_mark_node;
492 return build_zero_init (type, NULL_TREE, /*static_storage_p=*/false);
495 /* Initialize current class with INIT, a TREE_LIST of
496 arguments for a target constructor. If TREE_LIST is void_type_node,
497 an empty initializer list was given. */
499 static void
500 perform_target_ctor (tree init)
502 tree decl = current_class_ref;
503 tree type = current_class_type;
505 finish_expr_stmt (build_aggr_init (decl, init,
506 LOOKUP_NORMAL|LOOKUP_DELEGATING_CONS,
507 tf_warning_or_error));
508 if (type_build_dtor_call (type))
510 tree expr = build_delete (type, decl, sfk_complete_destructor,
511 LOOKUP_NORMAL
512 |LOOKUP_NONVIRTUAL
513 |LOOKUP_DESTRUCTOR,
514 0, tf_warning_or_error);
515 if (expr != error_mark_node
516 && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type))
517 finish_eh_cleanup (expr);
521 /* Initialize MEMBER, a FIELD_DECL, with INIT, a TREE_LIST of
522 arguments. If TREE_LIST is void_type_node, an empty initializer
523 list was given; if NULL_TREE no initializer was given. */
525 static void
526 perform_member_init (tree member, tree init)
528 tree decl;
529 tree type = TREE_TYPE (member);
531 /* Use the non-static data member initializer if there was no
532 mem-initializer for this field. */
533 if (init == NULL_TREE)
535 if (DECL_LANG_SPECIFIC (member) && DECL_TEMPLATE_INFO (member))
536 /* Do deferred instantiation of the NSDMI. */
537 init = (tsubst_copy_and_build
538 (DECL_INITIAL (DECL_TI_TEMPLATE (member)),
539 DECL_TI_ARGS (member),
540 tf_warning_or_error, member, /*function_p=*/false,
541 /*integral_constant_expression_p=*/false));
542 else
544 init = DECL_INITIAL (member);
545 if (init && TREE_CODE (init) == DEFAULT_ARG)
547 error ("constructor required before non-static data member "
548 "for %qD has been parsed", member);
549 init = NULL_TREE;
551 /* Strip redundant TARGET_EXPR so we don't need to remap it, and
552 so the aggregate init code below will see a CONSTRUCTOR. */
553 if (init && TREE_CODE (init) == TARGET_EXPR
554 && !VOID_TYPE_P (TREE_TYPE (TARGET_EXPR_INITIAL (init))))
555 init = TARGET_EXPR_INITIAL (init);
556 init = break_out_target_exprs (init);
560 if (init == error_mark_node)
561 return;
563 /* Effective C++ rule 12 requires that all data members be
564 initialized. */
565 if (warn_ecpp && init == NULL_TREE && TREE_CODE (type) != ARRAY_TYPE)
566 warning_at (DECL_SOURCE_LOCATION (current_function_decl), OPT_Weffc__,
567 "%qD should be initialized in the member initialization list",
568 member);
570 /* Get an lvalue for the data member. */
571 decl = build_class_member_access_expr (current_class_ref, member,
572 /*access_path=*/NULL_TREE,
573 /*preserve_reference=*/true,
574 tf_warning_or_error);
575 if (decl == error_mark_node)
576 return;
578 if (warn_init_self && init && TREE_CODE (init) == TREE_LIST
579 && TREE_CHAIN (init) == NULL_TREE)
581 tree val = TREE_VALUE (init);
582 if (TREE_CODE (val) == COMPONENT_REF && TREE_OPERAND (val, 1) == member
583 && TREE_OPERAND (val, 0) == current_class_ref)
584 warning_at (DECL_SOURCE_LOCATION (current_function_decl),
585 OPT_Winit_self, "%qD is initialized with itself",
586 member);
589 if (init == void_type_node)
591 /* mem() means value-initialization. */
592 if (TREE_CODE (type) == ARRAY_TYPE)
594 init = build_vec_init_expr (type, init, tf_warning_or_error);
595 init = build2 (INIT_EXPR, type, decl, init);
596 finish_expr_stmt (init);
598 else
600 tree value = build_value_init (type, tf_warning_or_error);
601 if (value == error_mark_node)
602 return;
603 init = build2 (INIT_EXPR, type, decl, value);
604 finish_expr_stmt (init);
607 /* Deal with this here, as we will get confused if we try to call the
608 assignment op for an anonymous union. This can happen in a
609 synthesized copy constructor. */
610 else if (ANON_AGGR_TYPE_P (type))
612 if (init)
614 init = build2 (INIT_EXPR, type, decl, TREE_VALUE (init));
615 finish_expr_stmt (init);
618 else if (init
619 && (TREE_CODE (type) == REFERENCE_TYPE
620 /* Pre-digested NSDMI. */
621 || (((TREE_CODE (init) == CONSTRUCTOR
622 && TREE_TYPE (init) == type)
623 /* { } mem-initializer. */
624 || (TREE_CODE (init) == TREE_LIST
625 && TREE_CODE (TREE_VALUE (init)) == CONSTRUCTOR
626 && CONSTRUCTOR_IS_DIRECT_INIT (TREE_VALUE (init))))
627 && (CP_AGGREGATE_TYPE_P (type)
628 || is_std_init_list (type)))))
630 /* With references and list-initialization, we need to deal with
631 extending temporary lifetimes. 12.2p5: "A temporary bound to a
632 reference member in a constructor’s ctor-initializer (12.6.2)
633 persists until the constructor exits." */
634 unsigned i; tree t;
635 vec<tree, va_gc> *cleanups = make_tree_vector ();
636 if (TREE_CODE (init) == TREE_LIST)
637 init = build_x_compound_expr_from_list (init, ELK_MEM_INIT,
638 tf_warning_or_error);
639 if (TREE_TYPE (init) != type)
641 if (BRACE_ENCLOSED_INITIALIZER_P (init)
642 && CP_AGGREGATE_TYPE_P (type))
643 init = reshape_init (type, init, tf_warning_or_error);
644 init = digest_init (type, init, tf_warning_or_error);
646 if (init == error_mark_node)
647 return;
648 /* A FIELD_DECL doesn't really have a suitable lifetime, but
649 make_temporary_var_for_ref_to_temp will treat it as automatic and
650 set_up_extended_ref_temp wants to use the decl in a warning. */
651 init = extend_ref_init_temps (member, init, &cleanups);
652 if (TREE_CODE (type) == ARRAY_TYPE
653 && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (type)))
654 init = build_vec_init_expr (type, init, tf_warning_or_error);
655 init = build2 (INIT_EXPR, type, decl, init);
656 finish_expr_stmt (init);
657 FOR_EACH_VEC_ELT (*cleanups, i, t)
658 push_cleanup (decl, t, false);
659 release_tree_vector (cleanups);
661 else if (type_build_ctor_call (type)
662 || (init && CLASS_TYPE_P (strip_array_types (type))))
664 if (TREE_CODE (type) == ARRAY_TYPE)
666 if (init)
668 if (TREE_CHAIN (init))
669 init = error_mark_node;
670 else
671 init = TREE_VALUE (init);
672 if (BRACE_ENCLOSED_INITIALIZER_P (init))
673 init = digest_init (type, init, tf_warning_or_error);
675 if (init == NULL_TREE
676 || same_type_ignoring_top_level_qualifiers_p (type,
677 TREE_TYPE (init)))
679 init = build_vec_init_expr (type, init, tf_warning_or_error);
680 init = build2 (INIT_EXPR, type, decl, init);
681 finish_expr_stmt (init);
683 else
684 error ("invalid initializer for array member %q#D", member);
686 else
688 int flags = LOOKUP_NORMAL;
689 if (DECL_DEFAULTED_FN (current_function_decl))
690 flags |= LOOKUP_DEFAULTED;
691 if (CP_TYPE_CONST_P (type)
692 && init == NULL_TREE
693 && default_init_uninitialized_part (type))
694 /* TYPE_NEEDS_CONSTRUCTING can be set just because we have a
695 vtable; still give this diagnostic. */
696 permerror (DECL_SOURCE_LOCATION (current_function_decl),
697 "uninitialized member %qD with %<const%> type %qT",
698 member, type);
699 finish_expr_stmt (build_aggr_init (decl, init, flags,
700 tf_warning_or_error));
703 else
705 if (init == NULL_TREE)
707 tree core_type;
708 /* member traversal: note it leaves init NULL */
709 if (TREE_CODE (type) == REFERENCE_TYPE)
710 permerror (DECL_SOURCE_LOCATION (current_function_decl),
711 "uninitialized reference member %qD",
712 member);
713 else if (CP_TYPE_CONST_P (type))
714 permerror (DECL_SOURCE_LOCATION (current_function_decl),
715 "uninitialized member %qD with %<const%> type %qT",
716 member, type);
718 core_type = strip_array_types (type);
720 if (CLASS_TYPE_P (core_type)
721 && (CLASSTYPE_READONLY_FIELDS_NEED_INIT (core_type)
722 || CLASSTYPE_REF_FIELDS_NEED_INIT (core_type)))
723 diagnose_uninitialized_cst_or_ref_member (core_type,
724 /*using_new=*/false,
725 /*complain=*/true);
727 else if (TREE_CODE (init) == TREE_LIST)
728 /* There was an explicit member initialization. Do some work
729 in that case. */
730 init = build_x_compound_expr_from_list (init, ELK_MEM_INIT,
731 tf_warning_or_error);
733 if (init)
734 finish_expr_stmt (cp_build_modify_expr (decl, INIT_EXPR, init,
735 tf_warning_or_error));
738 if (type_build_dtor_call (type))
740 tree expr;
742 expr = build_class_member_access_expr (current_class_ref, member,
743 /*access_path=*/NULL_TREE,
744 /*preserve_reference=*/false,
745 tf_warning_or_error);
746 expr = build_delete (type, expr, sfk_complete_destructor,
747 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0,
748 tf_warning_or_error);
750 if (expr != error_mark_node
751 && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type))
752 finish_eh_cleanup (expr);
756 /* Returns a TREE_LIST containing (as the TREE_PURPOSE of each node) all
757 the FIELD_DECLs on the TYPE_FIELDS list for T, in reverse order. */
759 static tree
760 build_field_list (tree t, tree list, int *uses_unions_p)
762 tree fields;
764 /* Note whether or not T is a union. */
765 if (TREE_CODE (t) == UNION_TYPE)
766 *uses_unions_p = 1;
768 for (fields = TYPE_FIELDS (t); fields; fields = DECL_CHAIN (fields))
770 tree fieldtype;
772 /* Skip CONST_DECLs for enumeration constants and so forth. */
773 if (TREE_CODE (fields) != FIELD_DECL || DECL_ARTIFICIAL (fields))
774 continue;
776 fieldtype = TREE_TYPE (fields);
777 /* Keep track of whether or not any fields are unions. */
778 if (TREE_CODE (fieldtype) == UNION_TYPE)
779 *uses_unions_p = 1;
781 /* For an anonymous struct or union, we must recursively
782 consider the fields of the anonymous type. They can be
783 directly initialized from the constructor. */
784 if (ANON_AGGR_TYPE_P (fieldtype))
786 /* Add this field itself. Synthesized copy constructors
787 initialize the entire aggregate. */
788 list = tree_cons (fields, NULL_TREE, list);
789 /* And now add the fields in the anonymous aggregate. */
790 list = build_field_list (fieldtype, list, uses_unions_p);
792 /* Add this field. */
793 else if (DECL_NAME (fields))
794 list = tree_cons (fields, NULL_TREE, list);
797 return list;
800 /* The MEM_INITS are a TREE_LIST. The TREE_PURPOSE of each list gives
801 a FIELD_DECL or BINFO in T that needs initialization. The
802 TREE_VALUE gives the initializer, or list of initializer arguments.
804 Return a TREE_LIST containing all of the initializations required
805 for T, in the order in which they should be performed. The output
806 list has the same format as the input. */
808 static tree
809 sort_mem_initializers (tree t, tree mem_inits)
811 tree init;
812 tree base, binfo, base_binfo;
813 tree sorted_inits;
814 tree next_subobject;
815 vec<tree, va_gc> *vbases;
816 int i;
817 int uses_unions_p = 0;
819 /* Build up a list of initializations. The TREE_PURPOSE of entry
820 will be the subobject (a FIELD_DECL or BINFO) to initialize. The
821 TREE_VALUE will be the constructor arguments, or NULL if no
822 explicit initialization was provided. */
823 sorted_inits = NULL_TREE;
825 /* Process the virtual bases. */
826 for (vbases = CLASSTYPE_VBASECLASSES (t), i = 0;
827 vec_safe_iterate (vbases, i, &base); i++)
828 sorted_inits = tree_cons (base, NULL_TREE, sorted_inits);
830 /* Process the direct bases. */
831 for (binfo = TYPE_BINFO (t), i = 0;
832 BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i)
833 if (!BINFO_VIRTUAL_P (base_binfo))
834 sorted_inits = tree_cons (base_binfo, NULL_TREE, sorted_inits);
836 /* Process the non-static data members. */
837 sorted_inits = build_field_list (t, sorted_inits, &uses_unions_p);
838 /* Reverse the entire list of initializations, so that they are in
839 the order that they will actually be performed. */
840 sorted_inits = nreverse (sorted_inits);
842 /* If the user presented the initializers in an order different from
843 that in which they will actually occur, we issue a warning. Keep
844 track of the next subobject which can be explicitly initialized
845 without issuing a warning. */
846 next_subobject = sorted_inits;
848 /* Go through the explicit initializers, filling in TREE_PURPOSE in
849 the SORTED_INITS. */
850 for (init = mem_inits; init; init = TREE_CHAIN (init))
852 tree subobject;
853 tree subobject_init;
855 subobject = TREE_PURPOSE (init);
857 /* If the explicit initializers are in sorted order, then
858 SUBOBJECT will be NEXT_SUBOBJECT, or something following
859 it. */
860 for (subobject_init = next_subobject;
861 subobject_init;
862 subobject_init = TREE_CHAIN (subobject_init))
863 if (TREE_PURPOSE (subobject_init) == subobject)
864 break;
866 /* Issue a warning if the explicit initializer order does not
867 match that which will actually occur.
868 ??? Are all these on the correct lines? */
869 if (warn_reorder && !subobject_init)
871 if (TREE_CODE (TREE_PURPOSE (next_subobject)) == FIELD_DECL)
872 warning (OPT_Wreorder, "%q+D will be initialized after",
873 TREE_PURPOSE (next_subobject));
874 else
875 warning (OPT_Wreorder, "base %qT will be initialized after",
876 TREE_PURPOSE (next_subobject));
877 if (TREE_CODE (subobject) == FIELD_DECL)
878 warning (OPT_Wreorder, " %q+#D", subobject);
879 else
880 warning (OPT_Wreorder, " base %qT", subobject);
881 warning_at (DECL_SOURCE_LOCATION (current_function_decl),
882 OPT_Wreorder, " when initialized here");
885 /* Look again, from the beginning of the list. */
886 if (!subobject_init)
888 subobject_init = sorted_inits;
889 while (TREE_PURPOSE (subobject_init) != subobject)
890 subobject_init = TREE_CHAIN (subobject_init);
893 /* It is invalid to initialize the same subobject more than
894 once. */
895 if (TREE_VALUE (subobject_init))
897 if (TREE_CODE (subobject) == FIELD_DECL)
898 error_at (DECL_SOURCE_LOCATION (current_function_decl),
899 "multiple initializations given for %qD",
900 subobject);
901 else
902 error_at (DECL_SOURCE_LOCATION (current_function_decl),
903 "multiple initializations given for base %qT",
904 subobject);
907 /* Record the initialization. */
908 TREE_VALUE (subobject_init) = TREE_VALUE (init);
909 next_subobject = subobject_init;
912 /* [class.base.init]
914 If a ctor-initializer specifies more than one mem-initializer for
915 multiple members of the same union (including members of
916 anonymous unions), the ctor-initializer is ill-formed.
918 Here we also splice out uninitialized union members. */
919 if (uses_unions_p)
921 tree *last_p = NULL;
922 tree *p;
923 for (p = &sorted_inits; *p; )
925 tree field;
926 tree ctx;
928 init = *p;
930 field = TREE_PURPOSE (init);
932 /* Skip base classes. */
933 if (TREE_CODE (field) != FIELD_DECL)
934 goto next;
936 /* If this is an anonymous union with no explicit initializer,
937 splice it out. */
938 if (!TREE_VALUE (init) && ANON_UNION_TYPE_P (TREE_TYPE (field)))
939 goto splice;
941 /* See if this field is a member of a union, or a member of a
942 structure contained in a union, etc. */
943 for (ctx = DECL_CONTEXT (field);
944 !same_type_p (ctx, t);
945 ctx = TYPE_CONTEXT (ctx))
946 if (TREE_CODE (ctx) == UNION_TYPE
947 || !ANON_AGGR_TYPE_P (ctx))
948 break;
949 /* If this field is not a member of a union, skip it. */
950 if (TREE_CODE (ctx) != UNION_TYPE)
951 goto next;
953 /* If this union member has no explicit initializer and no NSDMI,
954 splice it out. */
955 if (TREE_VALUE (init) || DECL_INITIAL (field))
956 /* OK. */;
957 else
958 goto splice;
960 /* It's only an error if we have two initializers for the same
961 union type. */
962 if (!last_p)
964 last_p = p;
965 goto next;
968 /* See if LAST_FIELD and the field initialized by INIT are
969 members of the same union. If so, there's a problem,
970 unless they're actually members of the same structure
971 which is itself a member of a union. For example, given:
973 union { struct { int i; int j; }; };
975 initializing both `i' and `j' makes sense. */
976 ctx = common_enclosing_class (DECL_CONTEXT (field),
977 DECL_CONTEXT (TREE_PURPOSE (*last_p)));
979 if (ctx && TREE_CODE (ctx) == UNION_TYPE)
981 /* A mem-initializer hides an NSDMI. */
982 if (TREE_VALUE (init) && !TREE_VALUE (*last_p))
983 *last_p = TREE_CHAIN (*last_p);
984 else if (TREE_VALUE (*last_p) && !TREE_VALUE (init))
985 goto splice;
986 else
988 error_at (DECL_SOURCE_LOCATION (current_function_decl),
989 "initializations for multiple members of %qT",
990 ctx);
991 goto splice;
995 last_p = p;
997 next:
998 p = &TREE_CHAIN (*p);
999 continue;
1000 splice:
1001 *p = TREE_CHAIN (*p);
1002 continue;
1006 return sorted_inits;
1009 /* Initialize all bases and members of CURRENT_CLASS_TYPE. MEM_INITS
1010 is a TREE_LIST giving the explicit mem-initializer-list for the
1011 constructor. The TREE_PURPOSE of each entry is a subobject (a
1012 FIELD_DECL or a BINFO) of the CURRENT_CLASS_TYPE. The TREE_VALUE
1013 is a TREE_LIST giving the arguments to the constructor or
1014 void_type_node for an empty list of arguments. */
1016 void
1017 emit_mem_initializers (tree mem_inits)
1019 int flags = LOOKUP_NORMAL;
1021 /* We will already have issued an error message about the fact that
1022 the type is incomplete. */
1023 if (!COMPLETE_TYPE_P (current_class_type))
1024 return;
1026 if (mem_inits
1027 && TYPE_P (TREE_PURPOSE (mem_inits))
1028 && same_type_p (TREE_PURPOSE (mem_inits), current_class_type))
1030 /* Delegating constructor. */
1031 gcc_assert (TREE_CHAIN (mem_inits) == NULL_TREE);
1032 perform_target_ctor (TREE_VALUE (mem_inits));
1033 return;
1036 if (DECL_DEFAULTED_FN (current_function_decl)
1037 && ! DECL_INHERITED_CTOR_BASE (current_function_decl))
1038 flags |= LOOKUP_DEFAULTED;
1040 /* Sort the mem-initializers into the order in which the
1041 initializations should be performed. */
1042 mem_inits = sort_mem_initializers (current_class_type, mem_inits);
1044 in_base_initializer = 1;
1046 /* Initialize base classes. */
1047 for (; (mem_inits
1048 && TREE_CODE (TREE_PURPOSE (mem_inits)) != FIELD_DECL);
1049 mem_inits = TREE_CHAIN (mem_inits))
1051 tree subobject = TREE_PURPOSE (mem_inits);
1052 tree arguments = TREE_VALUE (mem_inits);
1054 /* We already have issued an error message. */
1055 if (arguments == error_mark_node)
1056 continue;
1058 if (arguments == NULL_TREE)
1060 /* If these initializations are taking place in a copy constructor,
1061 the base class should probably be explicitly initialized if there
1062 is a user-defined constructor in the base class (other than the
1063 default constructor, which will be called anyway). */
1064 if (extra_warnings
1065 && DECL_COPY_CONSTRUCTOR_P (current_function_decl)
1066 && type_has_user_nondefault_constructor (BINFO_TYPE (subobject)))
1067 warning_at (DECL_SOURCE_LOCATION (current_function_decl),
1068 OPT_Wextra, "base class %q#T should be explicitly "
1069 "initialized in the copy constructor",
1070 BINFO_TYPE (subobject));
1073 /* Initialize the base. */
1074 if (BINFO_VIRTUAL_P (subobject))
1075 construct_virtual_base (subobject, arguments);
1076 else
1078 tree base_addr;
1080 base_addr = build_base_path (PLUS_EXPR, current_class_ptr,
1081 subobject, 1, tf_warning_or_error);
1082 expand_aggr_init_1 (subobject, NULL_TREE,
1083 cp_build_indirect_ref (base_addr, RO_NULL,
1084 tf_warning_or_error),
1085 arguments,
1086 flags,
1087 tf_warning_or_error);
1088 expand_cleanup_for_base (subobject, NULL_TREE);
1091 in_base_initializer = 0;
1093 /* Initialize the vptrs. */
1094 initialize_vtbl_ptrs (current_class_ptr);
1096 /* Initialize the data members. */
1097 while (mem_inits)
1099 perform_member_init (TREE_PURPOSE (mem_inits),
1100 TREE_VALUE (mem_inits));
1101 mem_inits = TREE_CHAIN (mem_inits);
1105 /* Returns the address of the vtable (i.e., the value that should be
1106 assigned to the vptr) for BINFO. */
1108 tree
1109 build_vtbl_address (tree binfo)
1111 tree binfo_for = binfo;
1112 tree vtbl;
1114 if (BINFO_VPTR_INDEX (binfo) && BINFO_VIRTUAL_P (binfo))
1115 /* If this is a virtual primary base, then the vtable we want to store
1116 is that for the base this is being used as the primary base of. We
1117 can't simply skip the initialization, because we may be expanding the
1118 inits of a subobject constructor where the virtual base layout
1119 can be different. */
1120 while (BINFO_PRIMARY_P (binfo_for))
1121 binfo_for = BINFO_INHERITANCE_CHAIN (binfo_for);
1123 /* Figure out what vtable BINFO's vtable is based on, and mark it as
1124 used. */
1125 vtbl = get_vtbl_decl_for_binfo (binfo_for);
1126 TREE_USED (vtbl) = 1;
1128 /* Now compute the address to use when initializing the vptr. */
1129 vtbl = unshare_expr (BINFO_VTABLE (binfo_for));
1130 if (VAR_P (vtbl))
1131 vtbl = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (vtbl)), vtbl);
1133 return vtbl;
1136 /* This code sets up the virtual function tables appropriate for
1137 the pointer DECL. It is a one-ply initialization.
1139 BINFO is the exact type that DECL is supposed to be. In
1140 multiple inheritance, this might mean "C's A" if C : A, B. */
1142 static void
1143 expand_virtual_init (tree binfo, tree decl)
1145 tree vtbl, vtbl_ptr;
1146 tree vtt_index;
1148 /* Compute the initializer for vptr. */
1149 vtbl = build_vtbl_address (binfo);
1151 /* We may get this vptr from a VTT, if this is a subobject
1152 constructor or subobject destructor. */
1153 vtt_index = BINFO_VPTR_INDEX (binfo);
1154 if (vtt_index)
1156 tree vtbl2;
1157 tree vtt_parm;
1159 /* Compute the value to use, when there's a VTT. */
1160 vtt_parm = current_vtt_parm;
1161 vtbl2 = fold_build_pointer_plus (vtt_parm, vtt_index);
1162 vtbl2 = cp_build_indirect_ref (vtbl2, RO_NULL, tf_warning_or_error);
1163 vtbl2 = convert (TREE_TYPE (vtbl), vtbl2);
1165 /* The actual initializer is the VTT value only in the subobject
1166 constructor. In maybe_clone_body we'll substitute NULL for
1167 the vtt_parm in the case of the non-subobject constructor. */
1168 vtbl = build3 (COND_EXPR,
1169 TREE_TYPE (vtbl),
1170 build2 (EQ_EXPR, boolean_type_node,
1171 current_in_charge_parm, integer_zero_node),
1172 vtbl2,
1173 vtbl);
1176 /* Compute the location of the vtpr. */
1177 vtbl_ptr = build_vfield_ref (cp_build_indirect_ref (decl, RO_NULL,
1178 tf_warning_or_error),
1179 TREE_TYPE (binfo));
1180 gcc_assert (vtbl_ptr != error_mark_node);
1182 /* Assign the vtable to the vptr. */
1183 vtbl = convert_force (TREE_TYPE (vtbl_ptr), vtbl, 0, tf_warning_or_error);
1184 finish_expr_stmt (cp_build_modify_expr (vtbl_ptr, NOP_EXPR, vtbl,
1185 tf_warning_or_error));
1188 /* If an exception is thrown in a constructor, those base classes already
1189 constructed must be destroyed. This function creates the cleanup
1190 for BINFO, which has just been constructed. If FLAG is non-NULL,
1191 it is a DECL which is nonzero when this base needs to be
1192 destroyed. */
1194 static void
1195 expand_cleanup_for_base (tree binfo, tree flag)
1197 tree expr;
1199 if (!type_build_dtor_call (BINFO_TYPE (binfo)))
1200 return;
1202 /* Call the destructor. */
1203 expr = build_special_member_call (current_class_ref,
1204 base_dtor_identifier,
1205 NULL,
1206 binfo,
1207 LOOKUP_NORMAL | LOOKUP_NONVIRTUAL,
1208 tf_warning_or_error);
1210 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (BINFO_TYPE (binfo)))
1211 return;
1213 if (flag)
1214 expr = fold_build3_loc (input_location,
1215 COND_EXPR, void_type_node,
1216 c_common_truthvalue_conversion (input_location, flag),
1217 expr, integer_zero_node);
1219 finish_eh_cleanup (expr);
1222 /* Construct the virtual base-class VBASE passing the ARGUMENTS to its
1223 constructor. */
1225 static void
1226 construct_virtual_base (tree vbase, tree arguments)
1228 tree inner_if_stmt;
1229 tree exp;
1230 tree flag;
1232 /* If there are virtual base classes with destructors, we need to
1233 emit cleanups to destroy them if an exception is thrown during
1234 the construction process. These exception regions (i.e., the
1235 period during which the cleanups must occur) begin from the time
1236 the construction is complete to the end of the function. If we
1237 create a conditional block in which to initialize the
1238 base-classes, then the cleanup region for the virtual base begins
1239 inside a block, and ends outside of that block. This situation
1240 confuses the sjlj exception-handling code. Therefore, we do not
1241 create a single conditional block, but one for each
1242 initialization. (That way the cleanup regions always begin
1243 in the outer block.) We trust the back end to figure out
1244 that the FLAG will not change across initializations, and
1245 avoid doing multiple tests. */
1246 flag = DECL_CHAIN (DECL_ARGUMENTS (current_function_decl));
1247 inner_if_stmt = begin_if_stmt ();
1248 finish_if_stmt_cond (flag, inner_if_stmt);
1250 /* Compute the location of the virtual base. If we're
1251 constructing virtual bases, then we must be the most derived
1252 class. Therefore, we don't have to look up the virtual base;
1253 we already know where it is. */
1254 exp = convert_to_base_statically (current_class_ref, vbase);
1256 expand_aggr_init_1 (vbase, current_class_ref, exp, arguments,
1257 0, tf_warning_or_error);
1258 finish_then_clause (inner_if_stmt);
1259 finish_if_stmt (inner_if_stmt);
1261 expand_cleanup_for_base (vbase, flag);
1264 /* Find the context in which this FIELD can be initialized. */
1266 static tree
1267 initializing_context (tree field)
1269 tree t = DECL_CONTEXT (field);
1271 /* Anonymous union members can be initialized in the first enclosing
1272 non-anonymous union context. */
1273 while (t && ANON_AGGR_TYPE_P (t))
1274 t = TYPE_CONTEXT (t);
1275 return t;
1278 /* Function to give error message if member initialization specification
1279 is erroneous. FIELD is the member we decided to initialize.
1280 TYPE is the type for which the initialization is being performed.
1281 FIELD must be a member of TYPE.
1283 MEMBER_NAME is the name of the member. */
1285 static int
1286 member_init_ok_or_else (tree field, tree type, tree member_name)
1288 if (field == error_mark_node)
1289 return 0;
1290 if (!field)
1292 error ("class %qT does not have any field named %qD", type,
1293 member_name);
1294 return 0;
1296 if (VAR_P (field))
1298 error ("%q#D is a static data member; it can only be "
1299 "initialized at its definition",
1300 field);
1301 return 0;
1303 if (TREE_CODE (field) != FIELD_DECL)
1305 error ("%q#D is not a non-static data member of %qT",
1306 field, type);
1307 return 0;
1309 if (initializing_context (field) != type)
1311 error ("class %qT does not have any field named %qD", type,
1312 member_name);
1313 return 0;
1316 return 1;
1319 /* NAME is a FIELD_DECL, an IDENTIFIER_NODE which names a field, or it
1320 is a _TYPE node or TYPE_DECL which names a base for that type.
1321 Check the validity of NAME, and return either the base _TYPE, base
1322 binfo, or the FIELD_DECL of the member. If NAME is invalid, return
1323 NULL_TREE and issue a diagnostic.
1325 An old style unnamed direct single base construction is permitted,
1326 where NAME is NULL. */
1328 tree
1329 expand_member_init (tree name)
1331 tree basetype;
1332 tree field;
1334 if (!current_class_ref)
1335 return NULL_TREE;
1337 if (!name)
1339 /* This is an obsolete unnamed base class initializer. The
1340 parser will already have warned about its use. */
1341 switch (BINFO_N_BASE_BINFOS (TYPE_BINFO (current_class_type)))
1343 case 0:
1344 error ("unnamed initializer for %qT, which has no base classes",
1345 current_class_type);
1346 return NULL_TREE;
1347 case 1:
1348 basetype = BINFO_TYPE
1349 (BINFO_BASE_BINFO (TYPE_BINFO (current_class_type), 0));
1350 break;
1351 default:
1352 error ("unnamed initializer for %qT, which uses multiple inheritance",
1353 current_class_type);
1354 return NULL_TREE;
1357 else if (TYPE_P (name))
1359 basetype = TYPE_MAIN_VARIANT (name);
1360 name = TYPE_NAME (name);
1362 else if (TREE_CODE (name) == TYPE_DECL)
1363 basetype = TYPE_MAIN_VARIANT (TREE_TYPE (name));
1364 else
1365 basetype = NULL_TREE;
1367 if (basetype)
1369 tree class_binfo;
1370 tree direct_binfo;
1371 tree virtual_binfo;
1372 int i;
1374 if (current_template_parms
1375 || same_type_p (basetype, current_class_type))
1376 return basetype;
1378 class_binfo = TYPE_BINFO (current_class_type);
1379 direct_binfo = NULL_TREE;
1380 virtual_binfo = NULL_TREE;
1382 /* Look for a direct base. */
1383 for (i = 0; BINFO_BASE_ITERATE (class_binfo, i, direct_binfo); ++i)
1384 if (SAME_BINFO_TYPE_P (BINFO_TYPE (direct_binfo), basetype))
1385 break;
1387 /* Look for a virtual base -- unless the direct base is itself
1388 virtual. */
1389 if (!direct_binfo || !BINFO_VIRTUAL_P (direct_binfo))
1390 virtual_binfo = binfo_for_vbase (basetype, current_class_type);
1392 /* [class.base.init]
1394 If a mem-initializer-id is ambiguous because it designates
1395 both a direct non-virtual base class and an inherited virtual
1396 base class, the mem-initializer is ill-formed. */
1397 if (direct_binfo && virtual_binfo)
1399 error ("%qD is both a direct base and an indirect virtual base",
1400 basetype);
1401 return NULL_TREE;
1404 if (!direct_binfo && !virtual_binfo)
1406 if (CLASSTYPE_VBASECLASSES (current_class_type))
1407 error ("type %qT is not a direct or virtual base of %qT",
1408 basetype, current_class_type);
1409 else
1410 error ("type %qT is not a direct base of %qT",
1411 basetype, current_class_type);
1412 return NULL_TREE;
1415 return direct_binfo ? direct_binfo : virtual_binfo;
1417 else
1419 if (identifier_p (name))
1420 field = lookup_field (current_class_type, name, 1, false);
1421 else
1422 field = name;
1424 if (member_init_ok_or_else (field, current_class_type, name))
1425 return field;
1428 return NULL_TREE;
1431 /* This is like `expand_member_init', only it stores one aggregate
1432 value into another.
1434 INIT comes in two flavors: it is either a value which
1435 is to be stored in EXP, or it is a parameter list
1436 to go to a constructor, which will operate on EXP.
1437 If INIT is not a parameter list for a constructor, then set
1438 LOOKUP_ONLYCONVERTING.
1439 If FLAGS is LOOKUP_ONLYCONVERTING then it is the = init form of
1440 the initializer, if FLAGS is 0, then it is the (init) form.
1441 If `init' is a CONSTRUCTOR, then we emit a warning message,
1442 explaining that such initializations are invalid.
1444 If INIT resolves to a CALL_EXPR which happens to return
1445 something of the type we are looking for, then we know
1446 that we can safely use that call to perform the
1447 initialization.
1449 The virtual function table pointer cannot be set up here, because
1450 we do not really know its type.
1452 This never calls operator=().
1454 When initializing, nothing is CONST.
1456 A default copy constructor may have to be used to perform the
1457 initialization.
1459 A constructor or a conversion operator may have to be used to
1460 perform the initialization, but not both, as it would be ambiguous. */
1462 tree
1463 build_aggr_init (tree exp, tree init, int flags, tsubst_flags_t complain)
1465 tree stmt_expr;
1466 tree compound_stmt;
1467 int destroy_temps;
1468 tree type = TREE_TYPE (exp);
1469 int was_const = TREE_READONLY (exp);
1470 int was_volatile = TREE_THIS_VOLATILE (exp);
1471 int is_global;
1473 if (init == error_mark_node)
1474 return error_mark_node;
1476 TREE_READONLY (exp) = 0;
1477 TREE_THIS_VOLATILE (exp) = 0;
1479 if (init && init != void_type_node
1480 && TREE_CODE (init) != TREE_LIST
1481 && !(TREE_CODE (init) == TARGET_EXPR
1482 && TARGET_EXPR_DIRECT_INIT_P (init))
1483 && !(BRACE_ENCLOSED_INITIALIZER_P (init)
1484 && CONSTRUCTOR_IS_DIRECT_INIT (init)))
1485 flags |= LOOKUP_ONLYCONVERTING;
1487 if (TREE_CODE (type) == ARRAY_TYPE)
1489 tree itype;
1491 /* An array may not be initialized use the parenthesized
1492 initialization form -- unless the initializer is "()". */
1493 if (init && TREE_CODE (init) == TREE_LIST)
1495 if (complain & tf_error)
1496 error ("bad array initializer");
1497 return error_mark_node;
1499 /* Must arrange to initialize each element of EXP
1500 from elements of INIT. */
1501 itype = init ? TREE_TYPE (init) : NULL_TREE;
1502 if (cv_qualified_p (type))
1503 TREE_TYPE (exp) = cv_unqualified (type);
1504 if (itype && cv_qualified_p (itype))
1505 TREE_TYPE (init) = cv_unqualified (itype);
1506 stmt_expr = build_vec_init (exp, NULL_TREE, init,
1507 /*explicit_value_init_p=*/false,
1508 itype && same_type_p (TREE_TYPE (init),
1509 TREE_TYPE (exp)),
1510 complain);
1511 TREE_READONLY (exp) = was_const;
1512 TREE_THIS_VOLATILE (exp) = was_volatile;
1513 TREE_TYPE (exp) = type;
1514 /* Restore the type of init unless it was used directly. */
1515 if (init && TREE_CODE (stmt_expr) != INIT_EXPR)
1516 TREE_TYPE (init) = itype;
1517 return stmt_expr;
1520 if ((VAR_P (exp) || TREE_CODE (exp) == PARM_DECL)
1521 && !lookup_attribute ("warn_unused", TYPE_ATTRIBUTES (type)))
1522 /* Just know that we've seen something for this node. */
1523 TREE_USED (exp) = 1;
1525 is_global = begin_init_stmts (&stmt_expr, &compound_stmt);
1526 destroy_temps = stmts_are_full_exprs_p ();
1527 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
1528 expand_aggr_init_1 (TYPE_BINFO (type), exp, exp,
1529 init, LOOKUP_NORMAL|flags, complain);
1530 stmt_expr = finish_init_stmts (is_global, stmt_expr, compound_stmt);
1531 current_stmt_tree ()->stmts_are_full_exprs_p = destroy_temps;
1532 TREE_READONLY (exp) = was_const;
1533 TREE_THIS_VOLATILE (exp) = was_volatile;
1535 return stmt_expr;
1538 static void
1539 expand_default_init (tree binfo, tree true_exp, tree exp, tree init, int flags,
1540 tsubst_flags_t complain)
1542 tree type = TREE_TYPE (exp);
1543 tree ctor_name;
1545 /* It fails because there may not be a constructor which takes
1546 its own type as the first (or only parameter), but which does
1547 take other types via a conversion. So, if the thing initializing
1548 the expression is a unit element of type X, first try X(X&),
1549 followed by initialization by X. If neither of these work
1550 out, then look hard. */
1551 tree rval;
1552 vec<tree, va_gc> *parms;
1554 /* If we have direct-initialization from an initializer list, pull
1555 it out of the TREE_LIST so the code below can see it. */
1556 if (init && TREE_CODE (init) == TREE_LIST
1557 && BRACE_ENCLOSED_INITIALIZER_P (TREE_VALUE (init))
1558 && CONSTRUCTOR_IS_DIRECT_INIT (TREE_VALUE (init)))
1560 gcc_checking_assert ((flags & LOOKUP_ONLYCONVERTING) == 0
1561 && TREE_CHAIN (init) == NULL_TREE);
1562 init = TREE_VALUE (init);
1565 if (init && BRACE_ENCLOSED_INITIALIZER_P (init)
1566 && CP_AGGREGATE_TYPE_P (type))
1567 /* A brace-enclosed initializer for an aggregate. In C++0x this can
1568 happen for direct-initialization, too. */
1569 init = digest_init (type, init, complain);
1571 /* A CONSTRUCTOR of the target's type is a previously digested
1572 initializer, whether that happened just above or in
1573 cp_parser_late_parsing_nsdmi.
1575 A TARGET_EXPR with TARGET_EXPR_DIRECT_INIT_P or TARGET_EXPR_LIST_INIT_P
1576 set represents the whole initialization, so we shouldn't build up
1577 another ctor call. */
1578 if (init
1579 && (TREE_CODE (init) == CONSTRUCTOR
1580 || (TREE_CODE (init) == TARGET_EXPR
1581 && (TARGET_EXPR_DIRECT_INIT_P (init)
1582 || TARGET_EXPR_LIST_INIT_P (init))))
1583 && same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (init), type))
1585 /* Early initialization via a TARGET_EXPR only works for
1586 complete objects. */
1587 gcc_assert (TREE_CODE (init) == CONSTRUCTOR || true_exp == exp);
1589 init = build2 (INIT_EXPR, TREE_TYPE (exp), exp, init);
1590 TREE_SIDE_EFFECTS (init) = 1;
1591 finish_expr_stmt (init);
1592 return;
1595 if (init && TREE_CODE (init) != TREE_LIST
1596 && (flags & LOOKUP_ONLYCONVERTING))
1598 /* Base subobjects should only get direct-initialization. */
1599 gcc_assert (true_exp == exp);
1601 if (flags & DIRECT_BIND)
1602 /* Do nothing. We hit this in two cases: Reference initialization,
1603 where we aren't initializing a real variable, so we don't want
1604 to run a new constructor; and catching an exception, where we
1605 have already built up the constructor call so we could wrap it
1606 in an exception region. */;
1607 else
1608 init = ocp_convert (type, init, CONV_IMPLICIT|CONV_FORCE_TEMP,
1609 flags, complain);
1611 if (TREE_CODE (init) == MUST_NOT_THROW_EXPR)
1612 /* We need to protect the initialization of a catch parm with a
1613 call to terminate(), which shows up as a MUST_NOT_THROW_EXPR
1614 around the TARGET_EXPR for the copy constructor. See
1615 initialize_handler_parm. */
1617 TREE_OPERAND (init, 0) = build2 (INIT_EXPR, TREE_TYPE (exp), exp,
1618 TREE_OPERAND (init, 0));
1619 TREE_TYPE (init) = void_type_node;
1621 else
1622 init = build2 (INIT_EXPR, TREE_TYPE (exp), exp, init);
1623 TREE_SIDE_EFFECTS (init) = 1;
1624 finish_expr_stmt (init);
1625 return;
1628 if (init == NULL_TREE)
1629 parms = NULL;
1630 else if (TREE_CODE (init) == TREE_LIST && !TREE_TYPE (init))
1632 parms = make_tree_vector ();
1633 for (; init != NULL_TREE; init = TREE_CHAIN (init))
1634 vec_safe_push (parms, TREE_VALUE (init));
1636 else
1637 parms = make_tree_vector_single (init);
1639 if (exp == current_class_ref && current_function_decl
1640 && DECL_HAS_IN_CHARGE_PARM_P (current_function_decl))
1642 /* Delegating constructor. */
1643 tree complete;
1644 tree base;
1645 tree elt; unsigned i;
1647 /* Unshare the arguments for the second call. */
1648 vec<tree, va_gc> *parms2 = make_tree_vector ();
1649 FOR_EACH_VEC_SAFE_ELT (parms, i, elt)
1651 elt = break_out_target_exprs (elt);
1652 vec_safe_push (parms2, elt);
1654 complete = build_special_member_call (exp, complete_ctor_identifier,
1655 &parms2, binfo, flags,
1656 complain);
1657 complete = fold_build_cleanup_point_expr (void_type_node, complete);
1658 release_tree_vector (parms2);
1660 base = build_special_member_call (exp, base_ctor_identifier,
1661 &parms, binfo, flags,
1662 complain);
1663 base = fold_build_cleanup_point_expr (void_type_node, base);
1664 rval = build3 (COND_EXPR, void_type_node,
1665 build2 (EQ_EXPR, boolean_type_node,
1666 current_in_charge_parm, integer_zero_node),
1667 base,
1668 complete);
1670 else
1672 if (true_exp == exp)
1673 ctor_name = complete_ctor_identifier;
1674 else
1675 ctor_name = base_ctor_identifier;
1676 rval = build_special_member_call (exp, ctor_name, &parms, binfo, flags,
1677 complain);
1680 if (parms != NULL)
1681 release_tree_vector (parms);
1683 if (exp == true_exp && TREE_CODE (rval) == CALL_EXPR)
1685 tree fn = get_callee_fndecl (rval);
1686 if (fn && DECL_DECLARED_CONSTEXPR_P (fn))
1688 tree e = maybe_constant_init (rval);
1689 if (TREE_CONSTANT (e))
1690 rval = build2 (INIT_EXPR, type, exp, e);
1694 /* FIXME put back convert_to_void? */
1695 if (TREE_SIDE_EFFECTS (rval))
1696 finish_expr_stmt (rval);
1699 /* This function is responsible for initializing EXP with INIT
1700 (if any).
1702 BINFO is the binfo of the type for who we are performing the
1703 initialization. For example, if W is a virtual base class of A and B,
1704 and C : A, B.
1705 If we are initializing B, then W must contain B's W vtable, whereas
1706 were we initializing C, W must contain C's W vtable.
1708 TRUE_EXP is nonzero if it is the true expression being initialized.
1709 In this case, it may be EXP, or may just contain EXP. The reason we
1710 need this is because if EXP is a base element of TRUE_EXP, we
1711 don't necessarily know by looking at EXP where its virtual
1712 baseclass fields should really be pointing. But we do know
1713 from TRUE_EXP. In constructors, we don't know anything about
1714 the value being initialized.
1716 FLAGS is just passed to `build_new_method_call'. See that function
1717 for its description. */
1719 static void
1720 expand_aggr_init_1 (tree binfo, tree true_exp, tree exp, tree init, int flags,
1721 tsubst_flags_t complain)
1723 tree type = TREE_TYPE (exp);
1725 gcc_assert (init != error_mark_node && type != error_mark_node);
1726 gcc_assert (building_stmt_list_p ());
1728 /* Use a function returning the desired type to initialize EXP for us.
1729 If the function is a constructor, and its first argument is
1730 NULL_TREE, know that it was meant for us--just slide exp on
1731 in and expand the constructor. Constructors now come
1732 as TARGET_EXPRs. */
1734 if (init && VAR_P (exp)
1735 && COMPOUND_LITERAL_P (init))
1737 vec<tree, va_gc> *cleanups = NULL;
1738 /* If store_init_value returns NULL_TREE, the INIT has been
1739 recorded as the DECL_INITIAL for EXP. That means there's
1740 nothing more we have to do. */
1741 init = store_init_value (exp, init, &cleanups, flags);
1742 if (init)
1743 finish_expr_stmt (init);
1744 gcc_assert (!cleanups);
1745 return;
1748 /* If an explicit -- but empty -- initializer list was present,
1749 that's value-initialization. */
1750 if (init == void_type_node)
1752 /* If the type has data but no user-provided ctor, we need to zero
1753 out the object. */
1754 if (!type_has_user_provided_constructor (type)
1755 && !is_really_empty_class (type))
1757 tree field_size = NULL_TREE;
1758 if (exp != true_exp && CLASSTYPE_AS_BASE (type) != type)
1759 /* Don't clobber already initialized virtual bases. */
1760 field_size = TYPE_SIZE (CLASSTYPE_AS_BASE (type));
1761 init = build_zero_init_1 (type, NULL_TREE, /*static_storage_p=*/false,
1762 field_size);
1763 init = build2 (INIT_EXPR, type, exp, init);
1764 finish_expr_stmt (init);
1767 /* If we don't need to mess with the constructor at all,
1768 then we're done. */
1769 if (! type_build_ctor_call (type))
1770 return;
1772 /* Otherwise fall through and call the constructor. */
1773 init = NULL_TREE;
1776 /* We know that expand_default_init can handle everything we want
1777 at this point. */
1778 expand_default_init (binfo, true_exp, exp, init, flags, complain);
1781 /* Report an error if TYPE is not a user-defined, class type. If
1782 OR_ELSE is nonzero, give an error message. */
1785 is_class_type (tree type, int or_else)
1787 if (type == error_mark_node)
1788 return 0;
1790 if (! CLASS_TYPE_P (type))
1792 if (or_else)
1793 error ("%qT is not a class type", type);
1794 return 0;
1796 return 1;
1799 tree
1800 get_type_value (tree name)
1802 if (name == error_mark_node)
1803 return NULL_TREE;
1805 if (IDENTIFIER_HAS_TYPE_VALUE (name))
1806 return IDENTIFIER_TYPE_VALUE (name);
1807 else
1808 return NULL_TREE;
1811 /* Build a reference to a member of an aggregate. This is not a C++
1812 `&', but really something which can have its address taken, and
1813 then act as a pointer to member, for example TYPE :: FIELD can have
1814 its address taken by saying & TYPE :: FIELD. ADDRESS_P is true if
1815 this expression is the operand of "&".
1817 @@ Prints out lousy diagnostics for operator <typename>
1818 @@ fields.
1820 @@ This function should be rewritten and placed in search.c. */
1822 tree
1823 build_offset_ref (tree type, tree member, bool address_p,
1824 tsubst_flags_t complain)
1826 tree decl;
1827 tree basebinfo = NULL_TREE;
1829 /* class templates can come in as TEMPLATE_DECLs here. */
1830 if (TREE_CODE (member) == TEMPLATE_DECL)
1831 return member;
1833 if (dependent_scope_p (type) || type_dependent_expression_p (member))
1834 return build_qualified_name (NULL_TREE, type, member,
1835 /*template_p=*/false);
1837 gcc_assert (TYPE_P (type));
1838 if (! is_class_type (type, 1))
1839 return error_mark_node;
1841 gcc_assert (DECL_P (member) || BASELINK_P (member));
1842 /* Callers should call mark_used before this point. */
1843 gcc_assert (!DECL_P (member) || TREE_USED (member));
1845 type = TYPE_MAIN_VARIANT (type);
1846 if (!COMPLETE_OR_OPEN_TYPE_P (complete_type (type)))
1848 if (complain & tf_error)
1849 error ("incomplete type %qT does not have member %qD", type, member);
1850 return error_mark_node;
1853 /* Entities other than non-static members need no further
1854 processing. */
1855 if (TREE_CODE (member) == TYPE_DECL)
1856 return member;
1857 if (VAR_P (member) || TREE_CODE (member) == CONST_DECL)
1858 return convert_from_reference (member);
1860 if (TREE_CODE (member) == FIELD_DECL && DECL_C_BIT_FIELD (member))
1862 if (complain & tf_error)
1863 error ("invalid pointer to bit-field %qD", member);
1864 return error_mark_node;
1867 /* Set up BASEBINFO for member lookup. */
1868 decl = maybe_dummy_object (type, &basebinfo);
1870 /* A lot of this logic is now handled in lookup_member. */
1871 if (BASELINK_P (member))
1873 /* Go from the TREE_BASELINK to the member function info. */
1874 tree t = BASELINK_FUNCTIONS (member);
1876 if (TREE_CODE (t) != TEMPLATE_ID_EXPR && !really_overloaded_fn (t))
1878 /* Get rid of a potential OVERLOAD around it. */
1879 t = OVL_CURRENT (t);
1881 /* Unique functions are handled easily. */
1883 /* For non-static member of base class, we need a special rule
1884 for access checking [class.protected]:
1886 If the access is to form a pointer to member, the
1887 nested-name-specifier shall name the derived class
1888 (or any class derived from that class). */
1889 if (address_p && DECL_P (t)
1890 && DECL_NONSTATIC_MEMBER_P (t))
1891 perform_or_defer_access_check (TYPE_BINFO (type), t, t,
1892 complain);
1893 else
1894 perform_or_defer_access_check (basebinfo, t, t,
1895 complain);
1897 if (DECL_STATIC_FUNCTION_P (t))
1898 return t;
1899 member = t;
1901 else
1902 TREE_TYPE (member) = unknown_type_node;
1904 else if (address_p && TREE_CODE (member) == FIELD_DECL)
1905 /* We need additional test besides the one in
1906 check_accessibility_of_qualified_id in case it is
1907 a pointer to non-static member. */
1908 perform_or_defer_access_check (TYPE_BINFO (type), member, member,
1909 complain);
1911 if (!address_p)
1913 /* If MEMBER is non-static, then the program has fallen afoul of
1914 [expr.prim]:
1916 An id-expression that denotes a nonstatic data member or
1917 nonstatic member function of a class can only be used:
1919 -- as part of a class member access (_expr.ref_) in which the
1920 object-expression refers to the member's class or a class
1921 derived from that class, or
1923 -- to form a pointer to member (_expr.unary.op_), or
1925 -- in the body of a nonstatic member function of that class or
1926 of a class derived from that class (_class.mfct.nonstatic_), or
1928 -- in a mem-initializer for a constructor for that class or for
1929 a class derived from that class (_class.base.init_). */
1930 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (member))
1932 /* Build a representation of the qualified name suitable
1933 for use as the operand to "&" -- even though the "&" is
1934 not actually present. */
1935 member = build2 (OFFSET_REF, TREE_TYPE (member), decl, member);
1936 /* In Microsoft mode, treat a non-static member function as if
1937 it were a pointer-to-member. */
1938 if (flag_ms_extensions)
1940 PTRMEM_OK_P (member) = 1;
1941 return cp_build_addr_expr (member, complain);
1943 if (complain & tf_error)
1944 error ("invalid use of non-static member function %qD",
1945 TREE_OPERAND (member, 1));
1946 return error_mark_node;
1948 else if (TREE_CODE (member) == FIELD_DECL)
1950 if (complain & tf_error)
1951 error ("invalid use of non-static data member %qD", member);
1952 return error_mark_node;
1954 return member;
1957 member = build2 (OFFSET_REF, TREE_TYPE (member), decl, member);
1958 PTRMEM_OK_P (member) = 1;
1959 return member;
1962 /* If DECL is a scalar enumeration constant or variable with a
1963 constant initializer, return the initializer (or, its initializers,
1964 recursively); otherwise, return DECL. If INTEGRAL_P, the
1965 initializer is only returned if DECL is an integral
1966 constant-expression. If RETURN_AGGREGATE_CST_OK_P, it is ok to
1967 return an aggregate constant. */
1969 static tree
1970 constant_value_1 (tree decl, bool integral_p, bool return_aggregate_cst_ok_p)
1972 while (TREE_CODE (decl) == CONST_DECL
1973 || (integral_p
1974 ? decl_constant_var_p (decl)
1975 : (VAR_P (decl)
1976 && CP_TYPE_CONST_NON_VOLATILE_P (TREE_TYPE (decl)))))
1978 tree init;
1979 /* If DECL is a static data member in a template
1980 specialization, we must instantiate it here. The
1981 initializer for the static data member is not processed
1982 until needed; we need it now. */
1983 mark_used (decl);
1984 mark_rvalue_use (decl);
1985 init = DECL_INITIAL (decl);
1986 if (init == error_mark_node)
1988 if (DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl))
1989 /* Treat the error as a constant to avoid cascading errors on
1990 excessively recursive template instantiation (c++/9335). */
1991 return init;
1992 else
1993 return decl;
1995 /* Initializers in templates are generally expanded during
1996 instantiation, so before that for const int i(2)
1997 INIT is a TREE_LIST with the actual initializer as
1998 TREE_VALUE. */
1999 if (processing_template_decl
2000 && init
2001 && TREE_CODE (init) == TREE_LIST
2002 && TREE_CHAIN (init) == NULL_TREE)
2003 init = TREE_VALUE (init);
2004 if (!init
2005 || !TREE_TYPE (init)
2006 || !TREE_CONSTANT (init)
2007 || (!integral_p && !return_aggregate_cst_ok_p
2008 /* Unless RETURN_AGGREGATE_CST_OK_P is true, do not
2009 return an aggregate constant (of which string
2010 literals are a special case), as we do not want
2011 to make inadvertent copies of such entities, and
2012 we must be sure that their addresses are the
2013 same everywhere. */
2014 && (TREE_CODE (init) == CONSTRUCTOR
2015 || TREE_CODE (init) == STRING_CST)))
2016 break;
2017 decl = unshare_expr (init);
2019 return decl;
2022 /* If DECL is a CONST_DECL, or a constant VAR_DECL initialized by
2023 constant of integral or enumeration type, then return that value.
2024 These are those variables permitted in constant expressions by
2025 [5.19/1]. */
2027 tree
2028 integral_constant_value (tree decl)
2030 return constant_value_1 (decl, /*integral_p=*/true,
2031 /*return_aggregate_cst_ok_p=*/false);
2034 /* A more relaxed version of integral_constant_value, used by the
2035 common C/C++ code. */
2037 tree
2038 decl_constant_value (tree decl)
2040 return constant_value_1 (decl, /*integral_p=*/processing_template_decl,
2041 /*return_aggregate_cst_ok_p=*/true);
2044 /* A version of integral_constant_value used by the C++ front end for
2045 optimization purposes. */
2047 tree
2048 decl_constant_value_safe (tree decl)
2050 return constant_value_1 (decl, /*integral_p=*/processing_template_decl,
2051 /*return_aggregate_cst_ok_p=*/false);
2054 /* Common subroutines of build_new and build_vec_delete. */
2056 /* Call the global __builtin_delete to delete ADDR. */
2058 static tree
2059 build_builtin_delete_call (tree addr)
2061 mark_used (global_delete_fndecl);
2062 return build_call_n (global_delete_fndecl, 1, addr);
2065 /* Build and return a NEW_EXPR. If NELTS is non-NULL, TYPE[NELTS] is
2066 the type of the object being allocated; otherwise, it's just TYPE.
2067 INIT is the initializer, if any. USE_GLOBAL_NEW is true if the
2068 user explicitly wrote "::operator new". PLACEMENT, if non-NULL, is
2069 a vector of arguments to be provided as arguments to a placement
2070 new operator. This routine performs no semantic checks; it just
2071 creates and returns a NEW_EXPR. */
2073 static tree
2074 build_raw_new_expr (vec<tree, va_gc> *placement, tree type, tree nelts,
2075 vec<tree, va_gc> *init, int use_global_new)
2077 tree init_list;
2078 tree new_expr;
2080 /* If INIT is NULL, the we want to store NULL_TREE in the NEW_EXPR.
2081 If INIT is not NULL, then we want to store VOID_ZERO_NODE. This
2082 permits us to distinguish the case of a missing initializer "new
2083 int" from an empty initializer "new int()". */
2084 if (init == NULL)
2085 init_list = NULL_TREE;
2086 else if (init->is_empty ())
2087 init_list = void_zero_node;
2088 else
2089 init_list = build_tree_list_vec (init);
2091 new_expr = build4 (NEW_EXPR, build_pointer_type (type),
2092 build_tree_list_vec (placement), type, nelts,
2093 init_list);
2094 NEW_EXPR_USE_GLOBAL (new_expr) = use_global_new;
2095 TREE_SIDE_EFFECTS (new_expr) = 1;
2097 return new_expr;
2100 /* Diagnose uninitialized const members or reference members of type
2101 TYPE. USING_NEW is used to disambiguate the diagnostic between a
2102 new expression without a new-initializer and a declaration. Returns
2103 the error count. */
2105 static int
2106 diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin,
2107 bool using_new, bool complain)
2109 tree field;
2110 int error_count = 0;
2112 if (type_has_user_provided_constructor (type))
2113 return 0;
2115 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
2117 tree field_type;
2119 if (TREE_CODE (field) != FIELD_DECL)
2120 continue;
2122 field_type = strip_array_types (TREE_TYPE (field));
2124 if (type_has_user_provided_constructor (field_type))
2125 continue;
2127 if (TREE_CODE (field_type) == REFERENCE_TYPE)
2129 ++ error_count;
2130 if (complain)
2132 if (DECL_CONTEXT (field) == origin)
2134 if (using_new)
2135 error ("uninitialized reference member in %q#T "
2136 "using %<new%> without new-initializer", origin);
2137 else
2138 error ("uninitialized reference member in %q#T", origin);
2140 else
2142 if (using_new)
2143 error ("uninitialized reference member in base %q#T "
2144 "of %q#T using %<new%> without new-initializer",
2145 DECL_CONTEXT (field), origin);
2146 else
2147 error ("uninitialized reference member in base %q#T "
2148 "of %q#T", DECL_CONTEXT (field), origin);
2150 inform (DECL_SOURCE_LOCATION (field),
2151 "%qD should be initialized", field);
2155 if (CP_TYPE_CONST_P (field_type))
2157 ++ error_count;
2158 if (complain)
2160 if (DECL_CONTEXT (field) == origin)
2162 if (using_new)
2163 error ("uninitialized const member in %q#T "
2164 "using %<new%> without new-initializer", origin);
2165 else
2166 error ("uninitialized const member in %q#T", origin);
2168 else
2170 if (using_new)
2171 error ("uninitialized const member in base %q#T "
2172 "of %q#T using %<new%> without new-initializer",
2173 DECL_CONTEXT (field), origin);
2174 else
2175 error ("uninitialized const member in base %q#T "
2176 "of %q#T", DECL_CONTEXT (field), origin);
2178 inform (DECL_SOURCE_LOCATION (field),
2179 "%qD should be initialized", field);
2183 if (CLASS_TYPE_P (field_type))
2184 error_count
2185 += diagnose_uninitialized_cst_or_ref_member_1 (field_type, origin,
2186 using_new, complain);
2188 return error_count;
2192 diagnose_uninitialized_cst_or_ref_member (tree type, bool using_new, bool complain)
2194 return diagnose_uninitialized_cst_or_ref_member_1 (type, type, using_new, complain);
2197 /* Call __cxa_bad_array_new_length to indicate that the size calculation
2198 overflowed. Pretend it returns sizetype so that it plays nicely in the
2199 COND_EXPR. */
2201 tree
2202 throw_bad_array_new_length (void)
2204 tree fn = get_identifier ("__cxa_throw_bad_array_new_length");
2205 if (!get_global_value_if_present (fn, &fn))
2206 fn = push_throw_library_fn (fn, build_function_type_list (sizetype,
2207 NULL_TREE));
2209 return build_cxx_call (fn, 0, NULL, tf_warning_or_error);
2212 /* Call __cxa_bad_array_length to indicate that there were too many
2213 initializers. */
2215 tree
2216 throw_bad_array_length (void)
2218 tree fn = get_identifier ("__cxa_throw_bad_array_length");
2219 if (!get_global_value_if_present (fn, &fn))
2220 fn = push_throw_library_fn (fn, build_function_type_list (void_type_node,
2221 NULL_TREE));
2223 return build_cxx_call (fn, 0, NULL, tf_warning_or_error);
2226 /* Generate code for a new-expression, including calling the "operator
2227 new" function, initializing the object, and, if an exception occurs
2228 during construction, cleaning up. The arguments are as for
2229 build_raw_new_expr. This may change PLACEMENT and INIT. */
2231 static tree
2232 build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
2233 vec<tree, va_gc> **init, bool globally_qualified_p,
2234 tsubst_flags_t complain)
2236 tree size, rval;
2237 /* True iff this is a call to "operator new[]" instead of just
2238 "operator new". */
2239 bool array_p = false;
2240 /* If ARRAY_P is true, the element type of the array. This is never
2241 an ARRAY_TYPE; for something like "new int[3][4]", the
2242 ELT_TYPE is "int". If ARRAY_P is false, this is the same type as
2243 TYPE. */
2244 tree elt_type;
2245 /* The type of the new-expression. (This type is always a pointer
2246 type.) */
2247 tree pointer_type;
2248 tree non_const_pointer_type;
2249 tree outer_nelts = NULL_TREE;
2250 /* For arrays, a bounds checks on the NELTS parameter. */
2251 tree outer_nelts_check = NULL_TREE;
2252 bool outer_nelts_from_type = false;
2253 double_int inner_nelts_count = double_int_one;
2254 tree alloc_call, alloc_expr;
2255 /* Size of the inner array elements. */
2256 double_int inner_size;
2257 /* The address returned by the call to "operator new". This node is
2258 a VAR_DECL and is therefore reusable. */
2259 tree alloc_node;
2260 tree alloc_fn;
2261 tree cookie_expr, init_expr;
2262 int nothrow, check_new;
2263 int use_java_new = 0;
2264 /* If non-NULL, the number of extra bytes to allocate at the
2265 beginning of the storage allocated for an array-new expression in
2266 order to store the number of elements. */
2267 tree cookie_size = NULL_TREE;
2268 tree placement_first;
2269 tree placement_expr = NULL_TREE;
2270 /* True if the function we are calling is a placement allocation
2271 function. */
2272 bool placement_allocation_fn_p;
2273 /* True if the storage must be initialized, either by a constructor
2274 or due to an explicit new-initializer. */
2275 bool is_initialized;
2276 /* The address of the thing allocated, not including any cookie. In
2277 particular, if an array cookie is in use, DATA_ADDR is the
2278 address of the first array element. This node is a VAR_DECL, and
2279 is therefore reusable. */
2280 tree data_addr;
2281 tree init_preeval_expr = NULL_TREE;
2283 if (nelts)
2285 outer_nelts = nelts;
2286 array_p = true;
2288 else if (TREE_CODE (type) == ARRAY_TYPE)
2290 /* Transforms new (T[N]) to new T[N]. The former is a GNU
2291 extension for variable N. (This also covers new T where T is
2292 a VLA typedef.) */
2293 array_p = true;
2294 nelts = array_type_nelts_top (type);
2295 outer_nelts = nelts;
2296 type = TREE_TYPE (type);
2297 outer_nelts_from_type = true;
2300 /* If our base type is an array, then make sure we know how many elements
2301 it has. */
2302 for (elt_type = type;
2303 TREE_CODE (elt_type) == ARRAY_TYPE;
2304 elt_type = TREE_TYPE (elt_type))
2306 tree inner_nelts = array_type_nelts_top (elt_type);
2307 tree inner_nelts_cst = maybe_constant_value (inner_nelts);
2308 if (TREE_CODE (inner_nelts_cst) == INTEGER_CST)
2310 bool overflow;
2311 double_int result = TREE_INT_CST (inner_nelts_cst)
2312 .mul_with_sign (inner_nelts_count,
2313 false, &overflow);
2314 if (overflow)
2316 if (complain & tf_error)
2317 error ("integer overflow in array size");
2318 nelts = error_mark_node;
2320 inner_nelts_count = result;
2322 else
2324 if (complain & tf_error)
2326 error_at (EXPR_LOC_OR_LOC (inner_nelts, input_location),
2327 "array size in operator new must be constant");
2328 cxx_constant_value(inner_nelts);
2330 nelts = error_mark_node;
2332 if (nelts != error_mark_node)
2333 nelts = cp_build_binary_op (input_location,
2334 MULT_EXPR, nelts,
2335 inner_nelts_cst,
2336 complain);
2339 if (variably_modified_type_p (elt_type, NULL_TREE) && (complain & tf_error))
2341 error ("variably modified type not allowed in operator new");
2342 return error_mark_node;
2345 if (nelts == error_mark_node)
2346 return error_mark_node;
2348 /* Warn if we performed the (T[N]) to T[N] transformation and N is
2349 variable. */
2350 if (outer_nelts_from_type
2351 && !TREE_CONSTANT (maybe_constant_value (outer_nelts)))
2353 if (complain & tf_warning_or_error)
2354 pedwarn(EXPR_LOC_OR_LOC (outer_nelts, input_location), OPT_Wvla,
2355 "ISO C++ does not support variable-length array types");
2356 else
2357 return error_mark_node;
2360 if (VOID_TYPE_P (elt_type))
2362 if (complain & tf_error)
2363 error ("invalid type %<void%> for new");
2364 return error_mark_node;
2367 if (abstract_virtuals_error_sfinae (ACU_NEW, elt_type, complain))
2368 return error_mark_node;
2370 is_initialized = (type_build_ctor_call (elt_type) || *init != NULL);
2372 if (*init == NULL && cxx_dialect < cxx11)
2374 bool maybe_uninitialized_error = false;
2375 /* A program that calls for default-initialization [...] of an
2376 entity of reference type is ill-formed. */
2377 if (CLASSTYPE_REF_FIELDS_NEED_INIT (elt_type))
2378 maybe_uninitialized_error = true;
2380 /* A new-expression that creates an object of type T initializes
2381 that object as follows:
2382 - If the new-initializer is omitted:
2383 -- If T is a (possibly cv-qualified) non-POD class type
2384 (or array thereof), the object is default-initialized (8.5).
2385 [...]
2386 -- Otherwise, the object created has indeterminate
2387 value. If T is a const-qualified type, or a (possibly
2388 cv-qualified) POD class type (or array thereof)
2389 containing (directly or indirectly) a member of
2390 const-qualified type, the program is ill-formed; */
2392 if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (elt_type))
2393 maybe_uninitialized_error = true;
2395 if (maybe_uninitialized_error
2396 && diagnose_uninitialized_cst_or_ref_member (elt_type,
2397 /*using_new=*/true,
2398 complain & tf_error))
2399 return error_mark_node;
2402 if (CP_TYPE_CONST_P (elt_type) && *init == NULL
2403 && default_init_uninitialized_part (elt_type))
2405 if (complain & tf_error)
2406 error ("uninitialized const in %<new%> of %q#T", elt_type);
2407 return error_mark_node;
2410 size = size_in_bytes (elt_type);
2411 if (array_p)
2413 /* Maximum available size in bytes. Half of the address space
2414 minus the cookie size. */
2415 double_int max_size
2416 = double_int_one.llshift (TYPE_PRECISION (sizetype) - 1,
2417 HOST_BITS_PER_DOUBLE_INT);
2418 /* Maximum number of outer elements which can be allocated. */
2419 double_int max_outer_nelts;
2420 tree max_outer_nelts_tree;
2422 gcc_assert (TREE_CODE (size) == INTEGER_CST);
2423 cookie_size = targetm.cxx.get_cookie_size (elt_type);
2424 gcc_assert (TREE_CODE (cookie_size) == INTEGER_CST);
2425 gcc_checking_assert (TREE_INT_CST (cookie_size).ult (max_size));
2426 /* Unconditionally subtract the cookie size. This decreases the
2427 maximum object size and is safe even if we choose not to use
2428 a cookie after all. */
2429 max_size -= TREE_INT_CST (cookie_size);
2430 bool overflow;
2431 inner_size = TREE_INT_CST (size)
2432 .mul_with_sign (inner_nelts_count, false, &overflow);
2433 if (overflow || inner_size.ugt (max_size))
2435 if (complain & tf_error)
2436 error ("size of array is too large");
2437 return error_mark_node;
2439 max_outer_nelts = max_size.udiv (inner_size, TRUNC_DIV_EXPR);
2440 /* Only keep the top-most seven bits, to simplify encoding the
2441 constant in the instruction stream. */
2443 unsigned shift = HOST_BITS_PER_DOUBLE_INT - 7
2444 - (max_outer_nelts.high ? clz_hwi (max_outer_nelts.high)
2445 : (HOST_BITS_PER_WIDE_INT + clz_hwi (max_outer_nelts.low)));
2446 max_outer_nelts
2447 = max_outer_nelts.lrshift (shift, HOST_BITS_PER_DOUBLE_INT)
2448 .llshift (shift, HOST_BITS_PER_DOUBLE_INT);
2450 max_outer_nelts_tree = double_int_to_tree (sizetype, max_outer_nelts);
2452 size = size_binop (MULT_EXPR, size, convert (sizetype, nelts));
2453 outer_nelts_check = fold_build2 (LE_EXPR, boolean_type_node,
2454 outer_nelts,
2455 max_outer_nelts_tree);
2458 alloc_fn = NULL_TREE;
2460 /* If PLACEMENT is a single simple pointer type not passed by
2461 reference, prepare to capture it in a temporary variable. Do
2462 this now, since PLACEMENT will change in the calls below. */
2463 placement_first = NULL_TREE;
2464 if (vec_safe_length (*placement) == 1
2465 && (TYPE_PTR_P (TREE_TYPE ((**placement)[0]))))
2466 placement_first = (**placement)[0];
2468 /* Allocate the object. */
2469 if (vec_safe_is_empty (*placement) && TYPE_FOR_JAVA (elt_type))
2471 tree class_addr;
2472 tree class_decl;
2473 static const char alloc_name[] = "_Jv_AllocObject";
2475 if (!MAYBE_CLASS_TYPE_P (elt_type))
2477 error ("%qT isn%'t a valid Java class type", elt_type);
2478 return error_mark_node;
2481 class_decl = build_java_class_ref (elt_type);
2482 if (class_decl == error_mark_node)
2483 return error_mark_node;
2485 use_java_new = 1;
2486 if (!get_global_value_if_present (get_identifier (alloc_name),
2487 &alloc_fn))
2489 if (complain & tf_error)
2490 error ("call to Java constructor with %qs undefined", alloc_name);
2491 return error_mark_node;
2493 else if (really_overloaded_fn (alloc_fn))
2495 if (complain & tf_error)
2496 error ("%qD should never be overloaded", alloc_fn);
2497 return error_mark_node;
2499 alloc_fn = OVL_CURRENT (alloc_fn);
2500 class_addr = build1 (ADDR_EXPR, jclass_node, class_decl);
2501 alloc_call = cp_build_function_call_nary (alloc_fn, complain,
2502 class_addr, NULL_TREE);
2504 else if (TYPE_FOR_JAVA (elt_type) && MAYBE_CLASS_TYPE_P (elt_type))
2506 error ("Java class %q#T object allocated using placement new", elt_type);
2507 return error_mark_node;
2509 else
2511 tree fnname;
2512 tree fns;
2514 fnname = ansi_opname (array_p ? VEC_NEW_EXPR : NEW_EXPR);
2516 if (!globally_qualified_p
2517 && CLASS_TYPE_P (elt_type)
2518 && (array_p
2519 ? TYPE_HAS_ARRAY_NEW_OPERATOR (elt_type)
2520 : TYPE_HAS_NEW_OPERATOR (elt_type)))
2522 /* Use a class-specific operator new. */
2523 /* If a cookie is required, add some extra space. */
2524 if (array_p && TYPE_VEC_NEW_USES_COOKIE (elt_type))
2525 size = size_binop (PLUS_EXPR, size, cookie_size);
2526 else
2528 cookie_size = NULL_TREE;
2529 /* No size arithmetic necessary, so the size check is
2530 not needed. */
2531 if (outer_nelts_check != NULL && inner_size.is_one ())
2532 outer_nelts_check = NULL_TREE;
2534 /* Perform the overflow check. */
2535 tree errval = TYPE_MAX_VALUE (sizetype);
2536 if (cxx_dialect >= cxx11 && flag_exceptions)
2537 errval = throw_bad_array_new_length ();
2538 if (outer_nelts_check != NULL_TREE)
2539 size = fold_build3 (COND_EXPR, sizetype, outer_nelts_check,
2540 size, errval);
2541 /* Create the argument list. */
2542 vec_safe_insert (*placement, 0, size);
2543 /* Do name-lookup to find the appropriate operator. */
2544 fns = lookup_fnfields (elt_type, fnname, /*protect=*/2);
2545 if (fns == NULL_TREE)
2547 if (complain & tf_error)
2548 error ("no suitable %qD found in class %qT", fnname, elt_type);
2549 return error_mark_node;
2551 if (TREE_CODE (fns) == TREE_LIST)
2553 if (complain & tf_error)
2555 error ("request for member %qD is ambiguous", fnname);
2556 print_candidates (fns);
2558 return error_mark_node;
2560 alloc_call = build_new_method_call (build_dummy_object (elt_type),
2561 fns, placement,
2562 /*conversion_path=*/NULL_TREE,
2563 LOOKUP_NORMAL,
2564 &alloc_fn,
2565 complain);
2567 else
2569 /* Use a global operator new. */
2570 /* See if a cookie might be required. */
2571 if (!(array_p && TYPE_VEC_NEW_USES_COOKIE (elt_type)))
2573 cookie_size = NULL_TREE;
2574 /* No size arithmetic necessary, so the size check is
2575 not needed. */
2576 if (outer_nelts_check != NULL && inner_size.is_one ())
2577 outer_nelts_check = NULL_TREE;
2580 alloc_call = build_operator_new_call (fnname, placement,
2581 &size, &cookie_size,
2582 outer_nelts_check,
2583 &alloc_fn, complain);
2587 if (alloc_call == error_mark_node)
2588 return error_mark_node;
2590 gcc_assert (alloc_fn != NULL_TREE);
2592 /* If we found a simple case of PLACEMENT_EXPR above, then copy it
2593 into a temporary variable. */
2594 if (!processing_template_decl
2595 && placement_first != NULL_TREE
2596 && TREE_CODE (alloc_call) == CALL_EXPR
2597 && call_expr_nargs (alloc_call) == 2
2598 && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (alloc_call, 0))) == INTEGER_TYPE
2599 && TYPE_PTR_P (TREE_TYPE (CALL_EXPR_ARG (alloc_call, 1))))
2601 tree placement_arg = CALL_EXPR_ARG (alloc_call, 1);
2603 if (INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (TREE_TYPE (placement_arg)))
2604 || VOID_TYPE_P (TREE_TYPE (TREE_TYPE (placement_arg))))
2606 placement_expr = get_target_expr (placement_first);
2607 CALL_EXPR_ARG (alloc_call, 1)
2608 = convert (TREE_TYPE (placement_arg), placement_expr);
2612 /* In the simple case, we can stop now. */
2613 pointer_type = build_pointer_type (type);
2614 if (!cookie_size && !is_initialized)
2615 return build_nop (pointer_type, alloc_call);
2617 /* Store the result of the allocation call in a variable so that we can
2618 use it more than once. */
2619 alloc_expr = get_target_expr (alloc_call);
2620 alloc_node = TARGET_EXPR_SLOT (alloc_expr);
2622 /* Strip any COMPOUND_EXPRs from ALLOC_CALL. */
2623 while (TREE_CODE (alloc_call) == COMPOUND_EXPR)
2624 alloc_call = TREE_OPERAND (alloc_call, 1);
2626 /* Now, check to see if this function is actually a placement
2627 allocation function. This can happen even when PLACEMENT is NULL
2628 because we might have something like:
2630 struct S { void* operator new (size_t, int i = 0); };
2632 A call to `new S' will get this allocation function, even though
2633 there is no explicit placement argument. If there is more than
2634 one argument, or there are variable arguments, then this is a
2635 placement allocation function. */
2636 placement_allocation_fn_p
2637 = (type_num_arguments (TREE_TYPE (alloc_fn)) > 1
2638 || varargs_function_p (alloc_fn));
2640 /* Preevaluate the placement args so that we don't reevaluate them for a
2641 placement delete. */
2642 if (placement_allocation_fn_p)
2644 tree inits;
2645 stabilize_call (alloc_call, &inits);
2646 if (inits)
2647 alloc_expr = build2 (COMPOUND_EXPR, TREE_TYPE (alloc_expr), inits,
2648 alloc_expr);
2651 /* unless an allocation function is declared with an empty excep-
2652 tion-specification (_except.spec_), throw(), it indicates failure to
2653 allocate storage by throwing a bad_alloc exception (clause _except_,
2654 _lib.bad.alloc_); it returns a non-null pointer otherwise If the allo-
2655 cation function is declared with an empty exception-specification,
2656 throw(), it returns null to indicate failure to allocate storage and a
2657 non-null pointer otherwise.
2659 So check for a null exception spec on the op new we just called. */
2661 nothrow = TYPE_NOTHROW_P (TREE_TYPE (alloc_fn));
2662 check_new = (flag_check_new || nothrow) && ! use_java_new;
2664 if (cookie_size)
2666 tree cookie;
2667 tree cookie_ptr;
2668 tree size_ptr_type;
2670 /* Adjust so we're pointing to the start of the object. */
2671 data_addr = fold_build_pointer_plus (alloc_node, cookie_size);
2673 /* Store the number of bytes allocated so that we can know how
2674 many elements to destroy later. We use the last sizeof
2675 (size_t) bytes to store the number of elements. */
2676 cookie_ptr = size_binop (MINUS_EXPR, cookie_size, size_in_bytes (sizetype));
2677 cookie_ptr = fold_build_pointer_plus_loc (input_location,
2678 alloc_node, cookie_ptr);
2679 size_ptr_type = build_pointer_type (sizetype);
2680 cookie_ptr = fold_convert (size_ptr_type, cookie_ptr);
2681 cookie = cp_build_indirect_ref (cookie_ptr, RO_NULL, complain);
2683 cookie_expr = build2 (MODIFY_EXPR, sizetype, cookie, nelts);
2685 if (targetm.cxx.cookie_has_size ())
2687 /* Also store the element size. */
2688 cookie_ptr = fold_build_pointer_plus (cookie_ptr,
2689 fold_build1_loc (input_location,
2690 NEGATE_EXPR, sizetype,
2691 size_in_bytes (sizetype)));
2693 cookie = cp_build_indirect_ref (cookie_ptr, RO_NULL, complain);
2694 cookie = build2 (MODIFY_EXPR, sizetype, cookie,
2695 size_in_bytes (elt_type));
2696 cookie_expr = build2 (COMPOUND_EXPR, TREE_TYPE (cookie_expr),
2697 cookie, cookie_expr);
2700 else
2702 cookie_expr = NULL_TREE;
2703 data_addr = alloc_node;
2706 /* Now use a pointer to the type we've actually allocated. */
2708 /* But we want to operate on a non-const version to start with,
2709 since we'll be modifying the elements. */
2710 non_const_pointer_type = build_pointer_type
2711 (cp_build_qualified_type (type, cp_type_quals (type) & ~TYPE_QUAL_CONST));
2713 data_addr = fold_convert (non_const_pointer_type, data_addr);
2714 /* Any further uses of alloc_node will want this type, too. */
2715 alloc_node = fold_convert (non_const_pointer_type, alloc_node);
2717 /* Now initialize the allocated object. Note that we preevaluate the
2718 initialization expression, apart from the actual constructor call or
2719 assignment--we do this because we want to delay the allocation as long
2720 as possible in order to minimize the size of the exception region for
2721 placement delete. */
2722 if (is_initialized)
2724 bool stable;
2725 bool explicit_value_init_p = false;
2727 if (*init != NULL && (*init)->is_empty ())
2729 *init = NULL;
2730 explicit_value_init_p = true;
2733 if (processing_template_decl && explicit_value_init_p)
2735 /* build_value_init doesn't work in templates, and we don't need
2736 the initializer anyway since we're going to throw it away and
2737 rebuild it at instantiation time, so just build up a single
2738 constructor call to get any appropriate diagnostics. */
2739 init_expr = cp_build_indirect_ref (data_addr, RO_NULL, complain);
2740 if (type_build_ctor_call (elt_type))
2741 init_expr = build_special_member_call (init_expr,
2742 complete_ctor_identifier,
2743 init, elt_type,
2744 LOOKUP_NORMAL,
2745 complain);
2746 stable = stabilize_init (init_expr, &init_preeval_expr);
2748 else if (array_p)
2750 tree vecinit = NULL_TREE;
2751 if (vec_safe_length (*init) == 1
2752 && BRACE_ENCLOSED_INITIALIZER_P ((**init)[0])
2753 && CONSTRUCTOR_IS_DIRECT_INIT ((**init)[0]))
2755 vecinit = (**init)[0];
2756 if (CONSTRUCTOR_NELTS (vecinit) == 0)
2757 /* List-value-initialization, leave it alone. */;
2758 else
2760 tree arraytype, domain;
2761 if (TREE_CONSTANT (nelts))
2762 domain = compute_array_index_type (NULL_TREE, nelts,
2763 complain);
2764 else
2765 /* We'll check the length at runtime. */
2766 domain = NULL_TREE;
2767 arraytype = build_cplus_array_type (type, domain);
2768 vecinit = digest_init (arraytype, vecinit, complain);
2771 else if (*init)
2773 if (complain & tf_error)
2774 permerror (input_location,
2775 "parenthesized initializer in array new");
2776 else
2777 return error_mark_node;
2778 vecinit = build_tree_list_vec (*init);
2780 init_expr
2781 = build_vec_init (data_addr,
2782 cp_build_binary_op (input_location,
2783 MINUS_EXPR, outer_nelts,
2784 integer_one_node,
2785 complain),
2786 vecinit,
2787 explicit_value_init_p,
2788 /*from_array=*/0,
2789 complain);
2791 /* An array initialization is stable because the initialization
2792 of each element is a full-expression, so the temporaries don't
2793 leak out. */
2794 stable = true;
2796 else
2798 init_expr = cp_build_indirect_ref (data_addr, RO_NULL, complain);
2800 if (type_build_ctor_call (type) && !explicit_value_init_p)
2802 init_expr = build_special_member_call (init_expr,
2803 complete_ctor_identifier,
2804 init, elt_type,
2805 LOOKUP_NORMAL,
2806 complain);
2808 else if (explicit_value_init_p)
2810 /* Something like `new int()'. */
2811 tree val = build_value_init (type, complain);
2812 if (val == error_mark_node)
2813 return error_mark_node;
2814 init_expr = build2 (INIT_EXPR, type, init_expr, val);
2816 else
2818 tree ie;
2820 /* We are processing something like `new int (10)', which
2821 means allocate an int, and initialize it with 10. */
2823 ie = build_x_compound_expr_from_vec (*init, "new initializer",
2824 complain);
2825 init_expr = cp_build_modify_expr (init_expr, INIT_EXPR, ie,
2826 complain);
2828 stable = stabilize_init (init_expr, &init_preeval_expr);
2831 if (init_expr == error_mark_node)
2832 return error_mark_node;
2834 /* If any part of the object initialization terminates by throwing an
2835 exception and a suitable deallocation function can be found, the
2836 deallocation function is called to free the memory in which the
2837 object was being constructed, after which the exception continues
2838 to propagate in the context of the new-expression. If no
2839 unambiguous matching deallocation function can be found,
2840 propagating the exception does not cause the object's memory to be
2841 freed. */
2842 if (flag_exceptions && ! use_java_new)
2844 enum tree_code dcode = array_p ? VEC_DELETE_EXPR : DELETE_EXPR;
2845 tree cleanup;
2847 /* The Standard is unclear here, but the right thing to do
2848 is to use the same method for finding deallocation
2849 functions that we use for finding allocation functions. */
2850 cleanup = (build_op_delete_call
2851 (dcode,
2852 alloc_node,
2853 size,
2854 globally_qualified_p,
2855 placement_allocation_fn_p ? alloc_call : NULL_TREE,
2856 alloc_fn,
2857 complain));
2859 if (!cleanup)
2860 /* We're done. */;
2861 else if (stable)
2862 /* This is much simpler if we were able to preevaluate all of
2863 the arguments to the constructor call. */
2865 /* CLEANUP is compiler-generated, so no diagnostics. */
2866 TREE_NO_WARNING (cleanup) = true;
2867 init_expr = build2 (TRY_CATCH_EXPR, void_type_node,
2868 init_expr, cleanup);
2869 /* Likewise, this try-catch is compiler-generated. */
2870 TREE_NO_WARNING (init_expr) = true;
2872 else
2873 /* Ack! First we allocate the memory. Then we set our sentry
2874 variable to true, and expand a cleanup that deletes the
2875 memory if sentry is true. Then we run the constructor, and
2876 finally clear the sentry.
2878 We need to do this because we allocate the space first, so
2879 if there are any temporaries with cleanups in the
2880 constructor args and we weren't able to preevaluate them, we
2881 need this EH region to extend until end of full-expression
2882 to preserve nesting. */
2884 tree end, sentry, begin;
2886 begin = get_target_expr (boolean_true_node);
2887 CLEANUP_EH_ONLY (begin) = 1;
2889 sentry = TARGET_EXPR_SLOT (begin);
2891 /* CLEANUP is compiler-generated, so no diagnostics. */
2892 TREE_NO_WARNING (cleanup) = true;
2894 TARGET_EXPR_CLEANUP (begin)
2895 = build3 (COND_EXPR, void_type_node, sentry,
2896 cleanup, void_zero_node);
2898 end = build2 (MODIFY_EXPR, TREE_TYPE (sentry),
2899 sentry, boolean_false_node);
2901 init_expr
2902 = build2 (COMPOUND_EXPR, void_type_node, begin,
2903 build2 (COMPOUND_EXPR, void_type_node, init_expr,
2904 end));
2905 /* Likewise, this is compiler-generated. */
2906 TREE_NO_WARNING (init_expr) = true;
2910 else
2911 init_expr = NULL_TREE;
2913 /* Now build up the return value in reverse order. */
2915 rval = data_addr;
2917 if (init_expr)
2918 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), init_expr, rval);
2919 if (cookie_expr)
2920 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), cookie_expr, rval);
2922 if (rval == data_addr)
2923 /* If we don't have an initializer or a cookie, strip the TARGET_EXPR
2924 and return the call (which doesn't need to be adjusted). */
2925 rval = TARGET_EXPR_INITIAL (alloc_expr);
2926 else
2928 if (check_new)
2930 tree ifexp = cp_build_binary_op (input_location,
2931 NE_EXPR, alloc_node,
2932 nullptr_node,
2933 complain);
2934 rval = build_conditional_expr (input_location, ifexp, rval,
2935 alloc_node, complain);
2938 /* Perform the allocation before anything else, so that ALLOC_NODE
2939 has been initialized before we start using it. */
2940 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), alloc_expr, rval);
2943 if (init_preeval_expr)
2944 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), init_preeval_expr, rval);
2946 /* A new-expression is never an lvalue. */
2947 gcc_assert (!lvalue_p (rval));
2949 return convert (pointer_type, rval);
2952 /* Generate a representation for a C++ "new" expression. *PLACEMENT
2953 is a vector of placement-new arguments (or NULL if none). If NELTS
2954 is NULL, TYPE is the type of the storage to be allocated. If NELTS
2955 is not NULL, then this is an array-new allocation; TYPE is the type
2956 of the elements in the array and NELTS is the number of elements in
2957 the array. *INIT, if non-NULL, is the initializer for the new
2958 object, or an empty vector to indicate an initializer of "()". If
2959 USE_GLOBAL_NEW is true, then the user explicitly wrote "::new"
2960 rather than just "new". This may change PLACEMENT and INIT. */
2962 tree
2963 build_new (vec<tree, va_gc> **placement, tree type, tree nelts,
2964 vec<tree, va_gc> **init, int use_global_new, tsubst_flags_t complain)
2966 tree rval;
2967 vec<tree, va_gc> *orig_placement = NULL;
2968 tree orig_nelts = NULL_TREE;
2969 vec<tree, va_gc> *orig_init = NULL;
2971 if (type == error_mark_node)
2972 return error_mark_node;
2974 if (nelts == NULL_TREE && vec_safe_length (*init) == 1
2975 /* Don't do auto deduction where it might affect mangling. */
2976 && (!processing_template_decl || at_function_scope_p ()))
2978 tree auto_node = type_uses_auto (type);
2979 if (auto_node)
2981 tree d_init = (**init)[0];
2982 d_init = resolve_nondeduced_context (d_init);
2983 type = do_auto_deduction (type, d_init, auto_node);
2987 if (processing_template_decl)
2989 if (dependent_type_p (type)
2990 || any_type_dependent_arguments_p (*placement)
2991 || (nelts && type_dependent_expression_p (nelts))
2992 || (nelts && *init)
2993 || any_type_dependent_arguments_p (*init))
2994 return build_raw_new_expr (*placement, type, nelts, *init,
2995 use_global_new);
2997 orig_placement = make_tree_vector_copy (*placement);
2998 orig_nelts = nelts;
2999 if (*init)
3000 orig_init = make_tree_vector_copy (*init);
3002 make_args_non_dependent (*placement);
3003 if (nelts)
3004 nelts = build_non_dependent_expr (nelts);
3005 make_args_non_dependent (*init);
3008 if (nelts)
3010 if (!build_expr_type_conversion (WANT_INT | WANT_ENUM, nelts, false))
3012 if (complain & tf_error)
3013 permerror (input_location, "size in array new must have integral type");
3014 else
3015 return error_mark_node;
3017 nelts = mark_rvalue_use (nelts);
3018 nelts = cp_save_expr (cp_convert (sizetype, nelts, complain));
3021 /* ``A reference cannot be created by the new operator. A reference
3022 is not an object (8.2.2, 8.4.3), so a pointer to it could not be
3023 returned by new.'' ARM 5.3.3 */
3024 if (TREE_CODE (type) == REFERENCE_TYPE)
3026 if (complain & tf_error)
3027 error ("new cannot be applied to a reference type");
3028 else
3029 return error_mark_node;
3030 type = TREE_TYPE (type);
3033 if (TREE_CODE (type) == FUNCTION_TYPE)
3035 if (complain & tf_error)
3036 error ("new cannot be applied to a function type");
3037 return error_mark_node;
3040 /* The type allocated must be complete. If the new-type-id was
3041 "T[N]" then we are just checking that "T" is complete here, but
3042 that is equivalent, since the value of "N" doesn't matter. */
3043 if (!complete_type_or_maybe_complain (type, NULL_TREE, complain))
3044 return error_mark_node;
3046 rval = build_new_1 (placement, type, nelts, init, use_global_new, complain);
3047 if (rval == error_mark_node)
3048 return error_mark_node;
3050 if (processing_template_decl)
3052 tree ret = build_raw_new_expr (orig_placement, type, orig_nelts,
3053 orig_init, use_global_new);
3054 release_tree_vector (orig_placement);
3055 release_tree_vector (orig_init);
3056 return ret;
3059 /* Wrap it in a NOP_EXPR so warn_if_unused_value doesn't complain. */
3060 rval = build1 (NOP_EXPR, TREE_TYPE (rval), rval);
3061 TREE_NO_WARNING (rval) = 1;
3063 return rval;
3066 /* Given a Java class, return a decl for the corresponding java.lang.Class. */
3068 tree
3069 build_java_class_ref (tree type)
3071 tree name = NULL_TREE, class_decl;
3072 static tree CL_suffix = NULL_TREE;
3073 if (CL_suffix == NULL_TREE)
3074 CL_suffix = get_identifier("class$");
3075 if (jclass_node == NULL_TREE)
3077 jclass_node = IDENTIFIER_GLOBAL_VALUE (get_identifier ("jclass"));
3078 if (jclass_node == NULL_TREE)
3080 error ("call to Java constructor, while %<jclass%> undefined");
3081 return error_mark_node;
3083 jclass_node = TREE_TYPE (jclass_node);
3086 /* Mangle the class$ field. */
3088 tree field;
3089 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
3090 if (DECL_NAME (field) == CL_suffix)
3092 mangle_decl (field);
3093 name = DECL_ASSEMBLER_NAME (field);
3094 break;
3096 if (!field)
3098 error ("can%'t find %<class$%> in %qT", type);
3099 return error_mark_node;
3103 class_decl = IDENTIFIER_GLOBAL_VALUE (name);
3104 if (class_decl == NULL_TREE)
3106 class_decl = build_decl (input_location,
3107 VAR_DECL, name, TREE_TYPE (jclass_node));
3108 TREE_STATIC (class_decl) = 1;
3109 DECL_EXTERNAL (class_decl) = 1;
3110 TREE_PUBLIC (class_decl) = 1;
3111 DECL_ARTIFICIAL (class_decl) = 1;
3112 DECL_IGNORED_P (class_decl) = 1;
3113 pushdecl_top_level (class_decl);
3114 make_decl_rtl (class_decl);
3116 return class_decl;
3119 static tree
3120 build_vec_delete_1 (tree base, tree maxindex, tree type,
3121 special_function_kind auto_delete_vec,
3122 int use_global_delete, tsubst_flags_t complain)
3124 tree virtual_size;
3125 tree ptype = build_pointer_type (type = complete_type (type));
3126 tree size_exp;
3128 /* Temporary variables used by the loop. */
3129 tree tbase, tbase_init;
3131 /* This is the body of the loop that implements the deletion of a
3132 single element, and moves temp variables to next elements. */
3133 tree body;
3135 /* This is the LOOP_EXPR that governs the deletion of the elements. */
3136 tree loop = 0;
3138 /* This is the thing that governs what to do after the loop has run. */
3139 tree deallocate_expr = 0;
3141 /* This is the BIND_EXPR which holds the outermost iterator of the
3142 loop. It is convenient to set this variable up and test it before
3143 executing any other code in the loop.
3144 This is also the containing expression returned by this function. */
3145 tree controller = NULL_TREE;
3146 tree tmp;
3148 /* We should only have 1-D arrays here. */
3149 gcc_assert (TREE_CODE (type) != ARRAY_TYPE);
3151 if (base == error_mark_node || maxindex == error_mark_node)
3152 return error_mark_node;
3154 if (!COMPLETE_TYPE_P (type))
3156 if ((complain & tf_warning)
3157 && warning (OPT_Wdelete_incomplete,
3158 "possible problem detected in invocation of "
3159 "delete [] operator:"))
3161 cxx_incomplete_type_diagnostic (base, type, DK_WARNING);
3162 inform (input_location, "neither the destructor nor the "
3163 "class-specific operator delete [] will be called, "
3164 "even if they are declared when the class is defined");
3166 return build_builtin_delete_call (base);
3169 size_exp = size_in_bytes (type);
3171 if (! MAYBE_CLASS_TYPE_P (type))
3172 goto no_destructor;
3173 else if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
3175 /* Make sure the destructor is callable. */
3176 if (type_build_dtor_call (type))
3178 tmp = build_delete (ptype, base, sfk_complete_destructor,
3179 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1,
3180 complain);
3181 if (tmp == error_mark_node)
3182 return error_mark_node;
3184 goto no_destructor;
3187 /* The below is short by the cookie size. */
3188 virtual_size = size_binop (MULT_EXPR, size_exp,
3189 convert (sizetype, maxindex));
3191 tbase = create_temporary_var (ptype);
3192 tbase_init
3193 = cp_build_modify_expr (tbase, NOP_EXPR,
3194 fold_build_pointer_plus_loc (input_location,
3195 fold_convert (ptype,
3196 base),
3197 virtual_size),
3198 complain);
3199 if (tbase_init == error_mark_node)
3200 return error_mark_node;
3201 controller = build3 (BIND_EXPR, void_type_node, tbase,
3202 NULL_TREE, NULL_TREE);
3203 TREE_SIDE_EFFECTS (controller) = 1;
3205 body = build1 (EXIT_EXPR, void_type_node,
3206 build2 (EQ_EXPR, boolean_type_node, tbase,
3207 fold_convert (ptype, base)));
3208 tmp = fold_build1_loc (input_location, NEGATE_EXPR, sizetype, size_exp);
3209 tmp = fold_build_pointer_plus (tbase, tmp);
3210 tmp = cp_build_modify_expr (tbase, NOP_EXPR, tmp, complain);
3211 if (tmp == error_mark_node)
3212 return error_mark_node;
3213 body = build_compound_expr (input_location, body, tmp);
3214 tmp = build_delete (ptype, tbase, sfk_complete_destructor,
3215 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1,
3216 complain);
3217 if (tmp == error_mark_node)
3218 return error_mark_node;
3219 body = build_compound_expr (input_location, body, tmp);
3221 loop = build1 (LOOP_EXPR, void_type_node, body);
3222 loop = build_compound_expr (input_location, tbase_init, loop);
3224 no_destructor:
3225 /* Delete the storage if appropriate. */
3226 if (auto_delete_vec == sfk_deleting_destructor)
3228 tree base_tbd;
3230 /* The below is short by the cookie size. */
3231 virtual_size = size_binop (MULT_EXPR, size_exp,
3232 convert (sizetype, maxindex));
3234 if (! TYPE_VEC_NEW_USES_COOKIE (type))
3235 /* no header */
3236 base_tbd = base;
3237 else
3239 tree cookie_size;
3241 cookie_size = targetm.cxx.get_cookie_size (type);
3242 base_tbd = cp_build_binary_op (input_location,
3243 MINUS_EXPR,
3244 cp_convert (string_type_node,
3245 base, complain),
3246 cookie_size,
3247 complain);
3248 if (base_tbd == error_mark_node)
3249 return error_mark_node;
3250 base_tbd = cp_convert (ptype, base_tbd, complain);
3251 /* True size with header. */
3252 virtual_size = size_binop (PLUS_EXPR, virtual_size, cookie_size);
3255 deallocate_expr = build_op_delete_call (VEC_DELETE_EXPR,
3256 base_tbd, virtual_size,
3257 use_global_delete & 1,
3258 /*placement=*/NULL_TREE,
3259 /*alloc_fn=*/NULL_TREE,
3260 complain);
3263 body = loop;
3264 if (!deallocate_expr)
3266 else if (!body)
3267 body = deallocate_expr;
3268 else
3269 body = build_compound_expr (input_location, body, deallocate_expr);
3271 if (!body)
3272 body = integer_zero_node;
3274 /* Outermost wrapper: If pointer is null, punt. */
3275 body = fold_build3_loc (input_location, COND_EXPR, void_type_node,
3276 fold_build2_loc (input_location,
3277 NE_EXPR, boolean_type_node, base,
3278 convert (TREE_TYPE (base),
3279 nullptr_node)),
3280 body, integer_zero_node);
3281 body = build1 (NOP_EXPR, void_type_node, body);
3283 if (controller)
3285 TREE_OPERAND (controller, 1) = body;
3286 body = controller;
3289 if (TREE_CODE (base) == SAVE_EXPR)
3290 /* Pre-evaluate the SAVE_EXPR outside of the BIND_EXPR. */
3291 body = build2 (COMPOUND_EXPR, void_type_node, base, body);
3293 return convert_to_void (body, ICV_CAST, complain);
3296 /* Create an unnamed variable of the indicated TYPE. */
3298 tree
3299 create_temporary_var (tree type)
3301 tree decl;
3303 decl = build_decl (input_location,
3304 VAR_DECL, NULL_TREE, type);
3305 TREE_USED (decl) = 1;
3306 DECL_ARTIFICIAL (decl) = 1;
3307 DECL_IGNORED_P (decl) = 1;
3308 DECL_CONTEXT (decl) = current_function_decl;
3310 return decl;
3313 /* Create a new temporary variable of the indicated TYPE, initialized
3314 to INIT.
3316 It is not entered into current_binding_level, because that breaks
3317 things when it comes time to do final cleanups (which take place
3318 "outside" the binding contour of the function). */
3320 tree
3321 get_temp_regvar (tree type, tree init)
3323 tree decl;
3325 decl = create_temporary_var (type);
3326 add_decl_expr (decl);
3328 finish_expr_stmt (cp_build_modify_expr (decl, INIT_EXPR, init,
3329 tf_warning_or_error));
3331 return decl;
3334 /* `build_vec_init' returns tree structure that performs
3335 initialization of a vector of aggregate types.
3337 BASE is a reference to the vector, of ARRAY_TYPE, or a pointer
3338 to the first element, of POINTER_TYPE.
3339 MAXINDEX is the maximum index of the array (one less than the
3340 number of elements). It is only used if BASE is a pointer or
3341 TYPE_DOMAIN (TREE_TYPE (BASE)) == NULL_TREE.
3343 INIT is the (possibly NULL) initializer.
3345 If EXPLICIT_VALUE_INIT_P is true, then INIT must be NULL. All
3346 elements in the array are value-initialized.
3348 FROM_ARRAY is 0 if we should init everything with INIT
3349 (i.e., every element initialized from INIT).
3350 FROM_ARRAY is 1 if we should index into INIT in parallel
3351 with initialization of DECL.
3352 FROM_ARRAY is 2 if we should index into INIT in parallel,
3353 but use assignment instead of initialization. */
3355 tree
3356 build_vec_init (tree base, tree maxindex, tree init,
3357 bool explicit_value_init_p,
3358 int from_array, tsubst_flags_t complain)
3360 tree rval;
3361 tree base2 = NULL_TREE;
3362 tree itype = NULL_TREE;
3363 tree iterator;
3364 /* The type of BASE. */
3365 tree atype = TREE_TYPE (base);
3366 /* The type of an element in the array. */
3367 tree type = TREE_TYPE (atype);
3368 /* The element type reached after removing all outer array
3369 types. */
3370 tree inner_elt_type;
3371 /* The type of a pointer to an element in the array. */
3372 tree ptype;
3373 tree stmt_expr;
3374 tree compound_stmt;
3375 int destroy_temps;
3376 tree try_block = NULL_TREE;
3377 int num_initialized_elts = 0;
3378 bool is_global;
3379 tree const_init = NULL_TREE;
3380 tree obase = base;
3381 bool xvalue = false;
3382 bool errors = false;
3383 tree length_check = NULL_TREE;
3385 if (TREE_CODE (atype) == ARRAY_TYPE && TYPE_DOMAIN (atype))
3386 maxindex = array_type_nelts (atype);
3388 if (maxindex == NULL_TREE || maxindex == error_mark_node)
3389 return error_mark_node;
3391 if (explicit_value_init_p)
3392 gcc_assert (!init);
3394 inner_elt_type = strip_array_types (type);
3396 /* Look through the TARGET_EXPR around a compound literal. */
3397 if (init && TREE_CODE (init) == TARGET_EXPR
3398 && TREE_CODE (TARGET_EXPR_INITIAL (init)) == CONSTRUCTOR
3399 && from_array != 2)
3400 init = TARGET_EXPR_INITIAL (init);
3402 /* If we have a braced-init-list, make sure that the array
3403 is big enough for all the initializers. */
3404 if (init && TREE_CODE (init) == CONSTRUCTOR
3405 && CONSTRUCTOR_NELTS (init) > 0
3406 && !TREE_CONSTANT (maxindex)
3407 && flag_exceptions)
3408 length_check = fold_build2 (LT_EXPR, boolean_type_node, maxindex,
3409 size_int (CONSTRUCTOR_NELTS (init) - 1));
3411 if (init
3412 && TREE_CODE (atype) == ARRAY_TYPE
3413 && TREE_CONSTANT (maxindex)
3414 && (from_array == 2
3415 ? (!CLASS_TYPE_P (inner_elt_type)
3416 || !TYPE_HAS_COMPLEX_COPY_ASSIGN (inner_elt_type))
3417 : !TYPE_NEEDS_CONSTRUCTING (type))
3418 && ((TREE_CODE (init) == CONSTRUCTOR
3419 /* Don't do this if the CONSTRUCTOR might contain something
3420 that might throw and require us to clean up. */
3421 && (vec_safe_is_empty (CONSTRUCTOR_ELTS (init))
3422 || ! TYPE_HAS_NONTRIVIAL_DESTRUCTOR (inner_elt_type)))
3423 || from_array))
3425 /* Do non-default initialization of trivial arrays resulting from
3426 brace-enclosed initializers. In this case, digest_init and
3427 store_constructor will handle the semantics for us. */
3429 if (BRACE_ENCLOSED_INITIALIZER_P (init))
3430 init = digest_init (atype, init, complain);
3431 stmt_expr = build2 (INIT_EXPR, atype, base, init);
3432 if (length_check)
3433 stmt_expr = build3 (COND_EXPR, atype, length_check,
3434 throw_bad_array_length (),
3435 stmt_expr);
3436 return stmt_expr;
3439 maxindex = cp_convert (ptrdiff_type_node, maxindex, complain);
3440 if (TREE_CODE (atype) == ARRAY_TYPE)
3442 ptype = build_pointer_type (type);
3443 base = decay_conversion (base, complain);
3444 if (base == error_mark_node)
3445 return error_mark_node;
3446 base = cp_convert (ptype, base, complain);
3448 else
3449 ptype = atype;
3451 /* The code we are generating looks like:
3453 T* t1 = (T*) base;
3454 T* rval = t1;
3455 ptrdiff_t iterator = maxindex;
3456 try {
3457 for (; iterator != -1; --iterator) {
3458 ... initialize *t1 ...
3459 ++t1;
3461 } catch (...) {
3462 ... destroy elements that were constructed ...
3464 rval;
3467 We can omit the try and catch blocks if we know that the
3468 initialization will never throw an exception, or if the array
3469 elements do not have destructors. We can omit the loop completely if
3470 the elements of the array do not have constructors.
3472 We actually wrap the entire body of the above in a STMT_EXPR, for
3473 tidiness.
3475 When copying from array to another, when the array elements have
3476 only trivial copy constructors, we should use __builtin_memcpy
3477 rather than generating a loop. That way, we could take advantage
3478 of whatever cleverness the back end has for dealing with copies
3479 of blocks of memory. */
3481 is_global = begin_init_stmts (&stmt_expr, &compound_stmt);
3482 destroy_temps = stmts_are_full_exprs_p ();
3483 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
3484 rval = get_temp_regvar (ptype, base);
3485 base = get_temp_regvar (ptype, rval);
3486 iterator = get_temp_regvar (ptrdiff_type_node, maxindex);
3488 /* If initializing one array from another, initialize element by
3489 element. We rely upon the below calls to do the argument
3490 checking. Evaluate the initializer before entering the try block. */
3491 if (from_array && init && TREE_CODE (init) != CONSTRUCTOR)
3493 if (lvalue_kind (init) & clk_rvalueref)
3494 xvalue = true;
3495 base2 = decay_conversion (init, complain);
3496 if (base2 == error_mark_node)
3497 return error_mark_node;
3498 itype = TREE_TYPE (base2);
3499 base2 = get_temp_regvar (itype, base2);
3500 itype = TREE_TYPE (itype);
3503 /* Protect the entire array initialization so that we can destroy
3504 the partially constructed array if an exception is thrown.
3505 But don't do this if we're assigning. */
3506 if (flag_exceptions && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
3507 && from_array != 2)
3509 try_block = begin_try_block ();
3512 /* If the initializer is {}, then all elements are initialized from {}.
3513 But for non-classes, that's the same as value-initialization. */
3514 if (init && BRACE_ENCLOSED_INITIALIZER_P (init)
3515 && CONSTRUCTOR_NELTS (init) == 0)
3517 if (CLASS_TYPE_P (type))
3518 /* Leave init alone. */;
3519 else
3521 init = NULL_TREE;
3522 explicit_value_init_p = true;
3526 /* Maybe pull out constant value when from_array? */
3528 else if (init != NULL_TREE && TREE_CODE (init) == CONSTRUCTOR)
3530 /* Do non-default initialization of non-trivial arrays resulting from
3531 brace-enclosed initializers. */
3532 unsigned HOST_WIDE_INT idx;
3533 tree field, elt;
3534 /* Should we try to create a constant initializer? */
3535 bool try_const = (TREE_CODE (atype) == ARRAY_TYPE
3536 && TREE_CONSTANT (maxindex)
3537 && (literal_type_p (inner_elt_type)
3538 || TYPE_HAS_CONSTEXPR_CTOR (inner_elt_type)));
3539 /* If the constructor already has the array type, it's been through
3540 digest_init, so we shouldn't try to do anything more. */
3541 bool digested = same_type_p (atype, TREE_TYPE (init));
3542 bool saw_non_const = false;
3543 bool saw_const = false;
3544 /* If we're initializing a static array, we want to do static
3545 initialization of any elements with constant initializers even if
3546 some are non-constant. */
3547 bool do_static_init = (DECL_P (obase) && TREE_STATIC (obase));
3548 vec<constructor_elt, va_gc> *new_vec;
3549 from_array = 0;
3551 if (length_check)
3553 tree throw_call;
3554 if (array_of_runtime_bound_p (atype))
3555 throw_call = throw_bad_array_length ();
3556 else
3557 throw_call = throw_bad_array_new_length ();
3558 length_check = build3 (COND_EXPR, void_type_node, length_check,
3559 throw_call, void_zero_node);
3560 finish_expr_stmt (length_check);
3563 if (try_const)
3564 vec_alloc (new_vec, CONSTRUCTOR_NELTS (init));
3565 else
3566 new_vec = NULL;
3568 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (init), idx, field, elt)
3570 tree baseref = build1 (INDIRECT_REF, type, base);
3571 tree one_init;
3573 num_initialized_elts++;
3575 current_stmt_tree ()->stmts_are_full_exprs_p = 1;
3576 if (digested)
3577 one_init = build2 (INIT_EXPR, type, baseref, elt);
3578 else if (MAYBE_CLASS_TYPE_P (type) || TREE_CODE (type) == ARRAY_TYPE)
3579 one_init = build_aggr_init (baseref, elt, 0, complain);
3580 else
3581 one_init = cp_build_modify_expr (baseref, NOP_EXPR,
3582 elt, complain);
3583 if (one_init == error_mark_node)
3584 errors = true;
3585 if (try_const)
3587 tree e = one_init;
3588 if (TREE_CODE (e) == EXPR_STMT)
3589 e = TREE_OPERAND (e, 0);
3590 if (TREE_CODE (e) == CONVERT_EXPR
3591 && VOID_TYPE_P (TREE_TYPE (e)))
3592 e = TREE_OPERAND (e, 0);
3593 e = maybe_constant_init (e);
3594 if (reduced_constant_expression_p (e))
3596 CONSTRUCTOR_APPEND_ELT (new_vec, field, e);
3597 if (do_static_init)
3598 one_init = NULL_TREE;
3599 else
3600 one_init = build2 (INIT_EXPR, type, baseref, e);
3601 saw_const = true;
3603 else
3605 if (do_static_init)
3607 tree value = build_zero_init (TREE_TYPE (e), NULL_TREE,
3608 true);
3609 if (value)
3610 CONSTRUCTOR_APPEND_ELT (new_vec, field, value);
3612 saw_non_const = true;
3616 if (one_init)
3617 finish_expr_stmt (one_init);
3618 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
3620 one_init = cp_build_unary_op (PREINCREMENT_EXPR, base, 0, complain);
3621 if (one_init == error_mark_node)
3622 errors = true;
3623 else
3624 finish_expr_stmt (one_init);
3626 one_init = cp_build_unary_op (PREDECREMENT_EXPR, iterator, 0,
3627 complain);
3628 if (one_init == error_mark_node)
3629 errors = true;
3630 else
3631 finish_expr_stmt (one_init);
3634 if (try_const)
3636 if (!saw_non_const)
3637 const_init = build_constructor (atype, new_vec);
3638 else if (do_static_init && saw_const)
3639 DECL_INITIAL (obase) = build_constructor (atype, new_vec);
3640 else
3641 vec_free (new_vec);
3644 /* Any elements without explicit initializers get {}. */
3645 if (cxx_dialect >= cxx11 && AGGREGATE_TYPE_P (type))
3646 init = build_constructor (init_list_type_node, NULL);
3647 else
3649 init = NULL_TREE;
3650 explicit_value_init_p = true;
3653 else if (from_array)
3655 if (init)
3656 /* OK, we set base2 above. */;
3657 else if (CLASS_TYPE_P (type)
3658 && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
3660 if (complain & tf_error)
3661 error ("initializer ends prematurely");
3662 errors = true;
3666 /* Now, default-initialize any remaining elements. We don't need to
3667 do that if a) the type does not need constructing, or b) we've
3668 already initialized all the elements.
3670 We do need to keep going if we're copying an array. */
3672 if (from_array
3673 || ((type_build_ctor_call (type) || init || explicit_value_init_p)
3674 && ! (tree_fits_shwi_p (maxindex)
3675 && (num_initialized_elts
3676 == tree_to_shwi (maxindex) + 1))))
3678 /* If the ITERATOR is equal to -1, then we don't have to loop;
3679 we've already initialized all the elements. */
3680 tree for_stmt;
3681 tree elt_init;
3682 tree to;
3684 for_stmt = begin_for_stmt (NULL_TREE, NULL_TREE);
3685 finish_for_init_stmt (for_stmt);
3686 finish_for_cond (build2 (NE_EXPR, boolean_type_node, iterator,
3687 build_int_cst (TREE_TYPE (iterator), -1)),
3688 for_stmt, false);
3689 elt_init = cp_build_unary_op (PREDECREMENT_EXPR, iterator, 0,
3690 complain);
3691 if (elt_init == error_mark_node)
3692 errors = true;
3693 finish_for_expr (elt_init, for_stmt);
3695 to = build1 (INDIRECT_REF, type, base);
3697 if (from_array)
3699 tree from;
3701 if (base2)
3703 from = build1 (INDIRECT_REF, itype, base2);
3704 if (xvalue)
3705 from = move (from);
3707 else
3708 from = NULL_TREE;
3710 if (from_array == 2)
3711 elt_init = cp_build_modify_expr (to, NOP_EXPR, from,
3712 complain);
3713 else if (type_build_ctor_call (type))
3714 elt_init = build_aggr_init (to, from, 0, complain);
3715 else if (from)
3716 elt_init = cp_build_modify_expr (to, NOP_EXPR, from,
3717 complain);
3718 else
3719 gcc_unreachable ();
3721 else if (TREE_CODE (type) == ARRAY_TYPE)
3723 if (init && !BRACE_ENCLOSED_INITIALIZER_P (init))
3724 sorry
3725 ("cannot initialize multi-dimensional array with initializer");
3726 elt_init = build_vec_init (build1 (INDIRECT_REF, type, base),
3727 0, init,
3728 explicit_value_init_p,
3729 0, complain);
3731 else if (explicit_value_init_p)
3733 elt_init = build_value_init (type, complain);
3734 if (elt_init != error_mark_node)
3735 elt_init = build2 (INIT_EXPR, type, to, elt_init);
3737 else
3739 gcc_assert (type_build_ctor_call (type) || init);
3740 if (CLASS_TYPE_P (type))
3741 elt_init = build_aggr_init (to, init, 0, complain);
3742 else
3744 if (TREE_CODE (init) == TREE_LIST)
3745 init = build_x_compound_expr_from_list (init, ELK_INIT,
3746 complain);
3747 elt_init = build2 (INIT_EXPR, type, to, init);
3751 if (elt_init == error_mark_node)
3752 errors = true;
3754 current_stmt_tree ()->stmts_are_full_exprs_p = 1;
3755 finish_expr_stmt (elt_init);
3756 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
3758 finish_expr_stmt (cp_build_unary_op (PREINCREMENT_EXPR, base, 0,
3759 complain));
3760 if (base2)
3761 finish_expr_stmt (cp_build_unary_op (PREINCREMENT_EXPR, base2, 0,
3762 complain));
3764 finish_for_stmt (for_stmt);
3767 /* Make sure to cleanup any partially constructed elements. */
3768 if (flag_exceptions && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
3769 && from_array != 2)
3771 tree e;
3772 tree m = cp_build_binary_op (input_location,
3773 MINUS_EXPR, maxindex, iterator,
3774 complain);
3776 /* Flatten multi-dimensional array since build_vec_delete only
3777 expects one-dimensional array. */
3778 if (TREE_CODE (type) == ARRAY_TYPE)
3779 m = cp_build_binary_op (input_location,
3780 MULT_EXPR, m,
3781 /* Avoid mixing signed and unsigned. */
3782 convert (TREE_TYPE (m),
3783 array_type_nelts_total (type)),
3784 complain);
3786 finish_cleanup_try_block (try_block);
3787 e = build_vec_delete_1 (rval, m,
3788 inner_elt_type, sfk_complete_destructor,
3789 /*use_global_delete=*/0, complain);
3790 if (e == error_mark_node)
3791 errors = true;
3792 finish_cleanup (e, try_block);
3795 /* The value of the array initialization is the array itself, RVAL
3796 is a pointer to the first element. */
3797 finish_stmt_expr_expr (rval, stmt_expr);
3799 stmt_expr = finish_init_stmts (is_global, stmt_expr, compound_stmt);
3801 /* Now make the result have the correct type. */
3802 if (TREE_CODE (atype) == ARRAY_TYPE)
3804 atype = build_pointer_type (atype);
3805 stmt_expr = build1 (NOP_EXPR, atype, stmt_expr);
3806 stmt_expr = cp_build_indirect_ref (stmt_expr, RO_NULL, complain);
3807 TREE_NO_WARNING (stmt_expr) = 1;
3810 current_stmt_tree ()->stmts_are_full_exprs_p = destroy_temps;
3812 if (const_init)
3813 return build2 (INIT_EXPR, atype, obase, const_init);
3814 if (errors)
3815 return error_mark_node;
3816 return stmt_expr;
3819 /* Call the DTOR_KIND destructor for EXP. FLAGS are as for
3820 build_delete. */
3822 static tree
3823 build_dtor_call (tree exp, special_function_kind dtor_kind, int flags,
3824 tsubst_flags_t complain)
3826 tree name;
3827 tree fn;
3828 switch (dtor_kind)
3830 case sfk_complete_destructor:
3831 name = complete_dtor_identifier;
3832 break;
3834 case sfk_base_destructor:
3835 name = base_dtor_identifier;
3836 break;
3838 case sfk_deleting_destructor:
3839 name = deleting_dtor_identifier;
3840 break;
3842 default:
3843 gcc_unreachable ();
3845 fn = lookup_fnfields (TREE_TYPE (exp), name, /*protect=*/2);
3846 return build_new_method_call (exp, fn,
3847 /*args=*/NULL,
3848 /*conversion_path=*/NULL_TREE,
3849 flags,
3850 /*fn_p=*/NULL,
3851 complain);
3854 /* Generate a call to a destructor. TYPE is the type to cast ADDR to.
3855 ADDR is an expression which yields the store to be destroyed.
3856 AUTO_DELETE is the name of the destructor to call, i.e., either
3857 sfk_complete_destructor, sfk_base_destructor, or
3858 sfk_deleting_destructor.
3860 FLAGS is the logical disjunction of zero or more LOOKUP_
3861 flags. See cp-tree.h for more info. */
3863 tree
3864 build_delete (tree otype, tree addr, special_function_kind auto_delete,
3865 int flags, int use_global_delete, tsubst_flags_t complain)
3867 tree expr;
3869 if (addr == error_mark_node)
3870 return error_mark_node;
3872 tree type = TYPE_MAIN_VARIANT (otype);
3874 /* Can happen when CURRENT_EXCEPTION_OBJECT gets its type
3875 set to `error_mark_node' before it gets properly cleaned up. */
3876 if (type == error_mark_node)
3877 return error_mark_node;
3879 if (TREE_CODE (type) == POINTER_TYPE)
3880 type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
3882 if (TREE_CODE (type) == ARRAY_TYPE)
3884 if (TYPE_DOMAIN (type) == NULL_TREE)
3886 if (complain & tf_error)
3887 error ("unknown array size in delete");
3888 return error_mark_node;
3890 return build_vec_delete (addr, array_type_nelts (type),
3891 auto_delete, use_global_delete, complain);
3894 if (TYPE_PTR_P (otype))
3896 bool complete_p = true;
3898 addr = mark_rvalue_use (addr);
3900 /* We don't want to warn about delete of void*, only other
3901 incomplete types. Deleting other incomplete types
3902 invokes undefined behavior, but it is not ill-formed, so
3903 compile to something that would even do The Right Thing
3904 (TM) should the type have a trivial dtor and no delete
3905 operator. */
3906 if (!VOID_TYPE_P (type))
3908 complete_type (type);
3909 if (!COMPLETE_TYPE_P (type))
3911 if ((complain & tf_warning)
3912 && warning (OPT_Wdelete_incomplete,
3913 "possible problem detected in invocation of "
3914 "delete operator:"))
3916 cxx_incomplete_type_diagnostic (addr, type, DK_WARNING);
3917 inform (input_location,
3918 "neither the destructor nor the class-specific "
3919 "operator delete will be called, even if they are "
3920 "declared when the class is defined");
3922 complete_p = false;
3924 else if (auto_delete == sfk_deleting_destructor && warn_delnonvdtor
3925 && MAYBE_CLASS_TYPE_P (type) && !CLASSTYPE_FINAL (type)
3926 && TYPE_POLYMORPHIC_P (type))
3928 tree dtor;
3929 dtor = CLASSTYPE_DESTRUCTORS (type);
3930 if (!dtor || !DECL_VINDEX (dtor))
3932 if (CLASSTYPE_PURE_VIRTUALS (type))
3933 warning (OPT_Wdelete_non_virtual_dtor,
3934 "deleting object of abstract class type %qT"
3935 " which has non-virtual destructor"
3936 " will cause undefined behaviour", type);
3937 else
3938 warning (OPT_Wdelete_non_virtual_dtor,
3939 "deleting object of polymorphic class type %qT"
3940 " which has non-virtual destructor"
3941 " might cause undefined behaviour", type);
3945 if (VOID_TYPE_P (type) || !complete_p || !MAYBE_CLASS_TYPE_P (type))
3946 /* Call the builtin operator delete. */
3947 return build_builtin_delete_call (addr);
3948 if (TREE_SIDE_EFFECTS (addr))
3949 addr = save_expr (addr);
3951 /* Throw away const and volatile on target type of addr. */
3952 addr = convert_force (build_pointer_type (type), addr, 0, complain);
3954 else
3956 /* Don't check PROTECT here; leave that decision to the
3957 destructor. If the destructor is accessible, call it,
3958 else report error. */
3959 addr = cp_build_addr_expr (addr, complain);
3960 if (addr == error_mark_node)
3961 return error_mark_node;
3962 if (TREE_SIDE_EFFECTS (addr))
3963 addr = save_expr (addr);
3965 addr = convert_force (build_pointer_type (type), addr, 0, complain);
3968 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
3970 /* Make sure the destructor is callable. */
3971 if (type_build_dtor_call (type))
3973 expr = build_dtor_call (cp_build_indirect_ref (addr, RO_NULL,
3974 complain),
3975 sfk_complete_destructor, flags, complain);
3976 if (expr == error_mark_node)
3977 return error_mark_node;
3980 if (auto_delete != sfk_deleting_destructor)
3981 return void_zero_node;
3983 return build_op_delete_call (DELETE_EXPR, addr,
3984 cxx_sizeof_nowarn (type),
3985 use_global_delete,
3986 /*placement=*/NULL_TREE,
3987 /*alloc_fn=*/NULL_TREE,
3988 complain);
3990 else
3992 tree head = NULL_TREE;
3993 tree do_delete = NULL_TREE;
3994 tree ifexp;
3996 if (CLASSTYPE_LAZY_DESTRUCTOR (type))
3997 lazily_declare_fn (sfk_destructor, type);
3999 /* For `::delete x', we must not use the deleting destructor
4000 since then we would not be sure to get the global `operator
4001 delete'. */
4002 if (use_global_delete && auto_delete == sfk_deleting_destructor)
4004 /* We will use ADDR multiple times so we must save it. */
4005 addr = save_expr (addr);
4006 head = get_target_expr (build_headof (addr));
4007 /* Delete the object. */
4008 do_delete = build_builtin_delete_call (head);
4009 /* Otherwise, treat this like a complete object destructor
4010 call. */
4011 auto_delete = sfk_complete_destructor;
4013 /* If the destructor is non-virtual, there is no deleting
4014 variant. Instead, we must explicitly call the appropriate
4015 `operator delete' here. */
4016 else if (!DECL_VIRTUAL_P (CLASSTYPE_DESTRUCTORS (type))
4017 && auto_delete == sfk_deleting_destructor)
4019 /* We will use ADDR multiple times so we must save it. */
4020 addr = save_expr (addr);
4021 /* Build the call. */
4022 do_delete = build_op_delete_call (DELETE_EXPR,
4023 addr,
4024 cxx_sizeof_nowarn (type),
4025 /*global_p=*/false,
4026 /*placement=*/NULL_TREE,
4027 /*alloc_fn=*/NULL_TREE,
4028 complain);
4029 /* Call the complete object destructor. */
4030 auto_delete = sfk_complete_destructor;
4032 else if (auto_delete == sfk_deleting_destructor
4033 && TYPE_GETS_REG_DELETE (type))
4035 /* Make sure we have access to the member op delete, even though
4036 we'll actually be calling it from the destructor. */
4037 build_op_delete_call (DELETE_EXPR, addr, cxx_sizeof_nowarn (type),
4038 /*global_p=*/false,
4039 /*placement=*/NULL_TREE,
4040 /*alloc_fn=*/NULL_TREE,
4041 complain);
4044 expr = build_dtor_call (cp_build_indirect_ref (addr, RO_NULL, complain),
4045 auto_delete, flags, complain);
4046 if (expr == error_mark_node)
4047 return error_mark_node;
4048 if (do_delete)
4049 expr = build2 (COMPOUND_EXPR, void_type_node, expr, do_delete);
4051 /* We need to calculate this before the dtor changes the vptr. */
4052 if (head)
4053 expr = build2 (COMPOUND_EXPR, void_type_node, head, expr);
4055 if (flags & LOOKUP_DESTRUCTOR)
4056 /* Explicit destructor call; don't check for null pointer. */
4057 ifexp = integer_one_node;
4058 else
4060 /* Handle deleting a null pointer. */
4061 ifexp = fold (cp_build_binary_op (input_location,
4062 NE_EXPR, addr, nullptr_node,
4063 complain));
4064 if (ifexp == error_mark_node)
4065 return error_mark_node;
4068 if (ifexp != integer_one_node)
4069 expr = build3 (COND_EXPR, void_type_node,
4070 ifexp, expr, void_zero_node);
4072 return expr;
4076 /* At the beginning of a destructor, push cleanups that will call the
4077 destructors for our base classes and members.
4079 Called from begin_destructor_body. */
4081 void
4082 push_base_cleanups (void)
4084 tree binfo, base_binfo;
4085 int i;
4086 tree member;
4087 tree expr;
4088 vec<tree, va_gc> *vbases;
4090 /* Run destructors for all virtual baseclasses. */
4091 if (CLASSTYPE_VBASECLASSES (current_class_type))
4093 tree cond = (condition_conversion
4094 (build2 (BIT_AND_EXPR, integer_type_node,
4095 current_in_charge_parm,
4096 integer_two_node)));
4098 /* The CLASSTYPE_VBASECLASSES vector is in initialization
4099 order, which is also the right order for pushing cleanups. */
4100 for (vbases = CLASSTYPE_VBASECLASSES (current_class_type), i = 0;
4101 vec_safe_iterate (vbases, i, &base_binfo); i++)
4103 if (type_build_dtor_call (BINFO_TYPE (base_binfo)))
4105 expr = build_special_member_call (current_class_ref,
4106 base_dtor_identifier,
4107 NULL,
4108 base_binfo,
4109 (LOOKUP_NORMAL
4110 | LOOKUP_NONVIRTUAL),
4111 tf_warning_or_error);
4112 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo)))
4114 expr = build3 (COND_EXPR, void_type_node, cond,
4115 expr, void_zero_node);
4116 finish_decl_cleanup (NULL_TREE, expr);
4122 /* Take care of the remaining baseclasses. */
4123 for (binfo = TYPE_BINFO (current_class_type), i = 0;
4124 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
4126 if (BINFO_VIRTUAL_P (base_binfo)
4127 || !type_build_dtor_call (BINFO_TYPE (base_binfo)))
4128 continue;
4130 expr = build_special_member_call (current_class_ref,
4131 base_dtor_identifier,
4132 NULL, base_binfo,
4133 LOOKUP_NORMAL | LOOKUP_NONVIRTUAL,
4134 tf_warning_or_error);
4135 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo)))
4136 finish_decl_cleanup (NULL_TREE, expr);
4139 /* Don't automatically destroy union members. */
4140 if (TREE_CODE (current_class_type) == UNION_TYPE)
4141 return;
4143 for (member = TYPE_FIELDS (current_class_type); member;
4144 member = DECL_CHAIN (member))
4146 tree this_type = TREE_TYPE (member);
4147 if (this_type == error_mark_node
4148 || TREE_CODE (member) != FIELD_DECL
4149 || DECL_ARTIFICIAL (member))
4150 continue;
4151 if (ANON_AGGR_TYPE_P (this_type))
4152 continue;
4153 if (type_build_dtor_call (this_type))
4155 tree this_member = (build_class_member_access_expr
4156 (current_class_ref, member,
4157 /*access_path=*/NULL_TREE,
4158 /*preserve_reference=*/false,
4159 tf_warning_or_error));
4160 expr = build_delete (this_type, this_member,
4161 sfk_complete_destructor,
4162 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_NORMAL,
4163 0, tf_warning_or_error);
4164 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (this_type))
4165 finish_decl_cleanup (NULL_TREE, expr);
4170 /* Build a C++ vector delete expression.
4171 MAXINDEX is the number of elements to be deleted.
4172 ELT_SIZE is the nominal size of each element in the vector.
4173 BASE is the expression that should yield the store to be deleted.
4174 This function expands (or synthesizes) these calls itself.
4175 AUTO_DELETE_VEC says whether the container (vector) should be deallocated.
4177 This also calls delete for virtual baseclasses of elements of the vector.
4179 Update: MAXINDEX is no longer needed. The size can be extracted from the
4180 start of the vector for pointers, and from the type for arrays. We still
4181 use MAXINDEX for arrays because it happens to already have one of the
4182 values we'd have to extract. (We could use MAXINDEX with pointers to
4183 confirm the size, and trap if the numbers differ; not clear that it'd
4184 be worth bothering.) */
4186 tree
4187 build_vec_delete (tree base, tree maxindex,
4188 special_function_kind auto_delete_vec,
4189 int use_global_delete, tsubst_flags_t complain)
4191 tree type;
4192 tree rval;
4193 tree base_init = NULL_TREE;
4195 type = TREE_TYPE (base);
4197 if (TYPE_PTR_P (type))
4199 /* Step back one from start of vector, and read dimension. */
4200 tree cookie_addr;
4201 tree size_ptr_type = build_pointer_type (sizetype);
4203 base = mark_rvalue_use (base);
4204 if (TREE_SIDE_EFFECTS (base))
4206 base_init = get_target_expr (base);
4207 base = TARGET_EXPR_SLOT (base_init);
4209 type = strip_array_types (TREE_TYPE (type));
4210 cookie_addr = fold_build1_loc (input_location, NEGATE_EXPR,
4211 sizetype, TYPE_SIZE_UNIT (sizetype));
4212 cookie_addr = fold_build_pointer_plus (fold_convert (size_ptr_type, base),
4213 cookie_addr);
4214 maxindex = cp_build_indirect_ref (cookie_addr, RO_NULL, complain);
4216 else if (TREE_CODE (type) == ARRAY_TYPE)
4218 /* Get the total number of things in the array, maxindex is a
4219 bad name. */
4220 maxindex = array_type_nelts_total (type);
4221 type = strip_array_types (type);
4222 base = decay_conversion (base, complain);
4223 if (base == error_mark_node)
4224 return error_mark_node;
4225 if (TREE_SIDE_EFFECTS (base))
4227 base_init = get_target_expr (base);
4228 base = TARGET_EXPR_SLOT (base_init);
4231 else
4233 if (base != error_mark_node && !(complain & tf_error))
4234 error ("type to vector delete is neither pointer or array type");
4235 return error_mark_node;
4238 rval = build_vec_delete_1 (base, maxindex, type, auto_delete_vec,
4239 use_global_delete, complain);
4240 if (base_init && rval != error_mark_node)
4241 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), base_init, rval);
4243 return rval;