* tree-loop-distribution.c (bb_top_order_index): New.
[official-gcc.git] / gcc / cp / init.c
blob14335388a50d78b70cb78ab2c30d2945043d0b9d
1 /* Handle initialization things in C++.
2 Copyright (C) 1987-2017 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 "target.h"
27 #include "cp-tree.h"
28 #include "stringpool.h"
29 #include "varasm.h"
30 #include "gimplify.h"
31 #include "c-family/c-ubsan.h"
32 #include "intl.h"
33 #include "asan.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 int member_init_ok_or_else (tree, tree, tree);
42 static void expand_virtual_init (tree, tree);
43 static tree sort_mem_initializers (tree, tree);
44 static tree initializing_context (tree);
45 static void expand_cleanup_for_base (tree, tree);
46 static tree dfs_initialize_vtbl_ptrs (tree, void *);
47 static tree build_field_list (tree, tree, int *);
48 static int diagnose_uninitialized_cst_or_ref_member_1 (tree, tree, bool, bool);
50 static GTY(()) tree fn;
52 /* We are about to generate some complex initialization code.
53 Conceptually, it is all a single expression. However, we may want
54 to include conditionals, loops, and other such statement-level
55 constructs. Therefore, we build the initialization code inside a
56 statement-expression. This function starts such an expression.
57 STMT_EXPR_P and COMPOUND_STMT_P are filled in by this function;
58 pass them back to finish_init_stmts when the expression is
59 complete. */
61 static bool
62 begin_init_stmts (tree *stmt_expr_p, tree *compound_stmt_p)
64 bool is_global = !building_stmt_list_p ();
66 *stmt_expr_p = begin_stmt_expr ();
67 *compound_stmt_p = begin_compound_stmt (BCS_NO_SCOPE);
69 return is_global;
72 /* Finish out the statement-expression begun by the previous call to
73 begin_init_stmts. Returns the statement-expression itself. */
75 static tree
76 finish_init_stmts (bool is_global, tree stmt_expr, tree compound_stmt)
78 finish_compound_stmt (compound_stmt);
80 stmt_expr = finish_stmt_expr (stmt_expr, true);
82 gcc_assert (!building_stmt_list_p () == is_global);
84 return stmt_expr;
87 /* Constructors */
89 /* Called from initialize_vtbl_ptrs via dfs_walk. BINFO is the base
90 which we want to initialize the vtable pointer for, DATA is
91 TREE_LIST whose TREE_VALUE is the this ptr expression. */
93 static tree
94 dfs_initialize_vtbl_ptrs (tree binfo, void *data)
96 if (!TYPE_CONTAINS_VPTR_P (BINFO_TYPE (binfo)))
97 return dfs_skip_bases;
99 if (!BINFO_PRIMARY_P (binfo) || BINFO_VIRTUAL_P (binfo))
101 tree base_ptr = TREE_VALUE ((tree) data);
103 base_ptr = build_base_path (PLUS_EXPR, base_ptr, binfo, /*nonnull=*/1,
104 tf_warning_or_error);
106 expand_virtual_init (binfo, base_ptr);
109 return NULL_TREE;
112 /* Initialize all the vtable pointers in the object pointed to by
113 ADDR. */
115 void
116 initialize_vtbl_ptrs (tree addr)
118 tree list;
119 tree type;
121 type = TREE_TYPE (TREE_TYPE (addr));
122 list = build_tree_list (type, addr);
124 /* Walk through the hierarchy, initializing the vptr in each base
125 class. We do these in pre-order because we can't find the virtual
126 bases for a class until we've initialized the vtbl for that
127 class. */
128 dfs_walk_once (TYPE_BINFO (type), dfs_initialize_vtbl_ptrs, NULL, list);
131 /* Return an expression for the zero-initialization of an object with
132 type T. This expression will either be a constant (in the case
133 that T is a scalar), or a CONSTRUCTOR (in the case that T is an
134 aggregate), or NULL (in the case that T does not require
135 initialization). In either case, the value can be used as
136 DECL_INITIAL for a decl of the indicated TYPE; it is a valid static
137 initializer. If NELTS is non-NULL, and TYPE is an ARRAY_TYPE, NELTS
138 is the number of elements in the array. If STATIC_STORAGE_P is
139 TRUE, initializers are only generated for entities for which
140 zero-initialization does not simply mean filling the storage with
141 zero bytes. FIELD_SIZE, if non-NULL, is the bit size of the field,
142 subfields with bit positions at or above that bit size shouldn't
143 be added. Note that this only works when the result is assigned
144 to a base COMPONENT_REF; if we only have a pointer to the base subobject,
145 expand_assignment will end up clearing the full size of TYPE. */
147 static tree
148 build_zero_init_1 (tree type, tree nelts, bool static_storage_p,
149 tree field_size)
151 tree init = NULL_TREE;
153 /* [dcl.init]
155 To zero-initialize an object of type T means:
157 -- if T is a scalar type, the storage is set to the value of zero
158 converted to T.
160 -- if T is a non-union class type, the storage for each nonstatic
161 data member and each base-class subobject is zero-initialized.
163 -- if T is a union type, the storage for its first data member is
164 zero-initialized.
166 -- if T is an array type, the storage for each element is
167 zero-initialized.
169 -- if T is a reference type, no initialization is performed. */
171 gcc_assert (nelts == NULL_TREE || TREE_CODE (nelts) == INTEGER_CST);
173 if (type == error_mark_node)
175 else if (static_storage_p && zero_init_p (type))
176 /* In order to save space, we do not explicitly build initializers
177 for items that do not need them. GCC's semantics are that
178 items with static storage duration that are not otherwise
179 initialized are initialized to zero. */
181 else if (TYPE_PTR_OR_PTRMEM_P (type))
182 init = fold (convert (type, nullptr_node));
183 else if (SCALAR_TYPE_P (type))
184 init = fold (convert (type, integer_zero_node));
185 else if (RECORD_OR_UNION_CODE_P (TREE_CODE (type)))
187 tree field;
188 vec<constructor_elt, va_gc> *v = NULL;
190 /* Iterate over the fields, building initializations. */
191 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
193 if (TREE_CODE (field) != FIELD_DECL)
194 continue;
196 if (TREE_TYPE (field) == error_mark_node)
197 continue;
199 /* Don't add virtual bases for base classes if they are beyond
200 the size of the current field, that means it is present
201 somewhere else in the object. */
202 if (field_size)
204 tree bitpos = bit_position (field);
205 if (TREE_CODE (bitpos) == INTEGER_CST
206 && !tree_int_cst_lt (bitpos, field_size))
207 continue;
210 /* Note that for class types there will be FIELD_DECLs
211 corresponding to base classes as well. Thus, iterating
212 over TYPE_FIELDs will result in correct initialization of
213 all of the subobjects. */
214 if (!static_storage_p || !zero_init_p (TREE_TYPE (field)))
216 tree new_field_size
217 = (DECL_FIELD_IS_BASE (field)
218 && DECL_SIZE (field)
219 && TREE_CODE (DECL_SIZE (field)) == INTEGER_CST)
220 ? DECL_SIZE (field) : NULL_TREE;
221 tree value = build_zero_init_1 (TREE_TYPE (field),
222 /*nelts=*/NULL_TREE,
223 static_storage_p,
224 new_field_size);
225 if (value)
226 CONSTRUCTOR_APPEND_ELT(v, field, value);
229 /* For unions, only the first field is initialized. */
230 if (TREE_CODE (type) == UNION_TYPE)
231 break;
234 /* Build a constructor to contain the initializations. */
235 init = build_constructor (type, v);
237 else if (TREE_CODE (type) == ARRAY_TYPE)
239 tree max_index;
240 vec<constructor_elt, va_gc> *v = NULL;
242 /* Iterate over the array elements, building initializations. */
243 if (nelts)
244 max_index = fold_build2_loc (input_location,
245 MINUS_EXPR, TREE_TYPE (nelts),
246 nelts, integer_one_node);
247 else
248 max_index = array_type_nelts (type);
250 /* If we have an error_mark here, we should just return error mark
251 as we don't know the size of the array yet. */
252 if (max_index == error_mark_node)
253 return error_mark_node;
254 gcc_assert (TREE_CODE (max_index) == INTEGER_CST);
256 /* A zero-sized array, which is accepted as an extension, will
257 have an upper bound of -1. */
258 if (!tree_int_cst_equal (max_index, integer_minus_one_node))
260 constructor_elt ce;
262 /* If this is a one element array, we just use a regular init. */
263 if (tree_int_cst_equal (size_zero_node, max_index))
264 ce.index = size_zero_node;
265 else
266 ce.index = build2 (RANGE_EXPR, sizetype, size_zero_node,
267 max_index);
269 ce.value = build_zero_init_1 (TREE_TYPE (type),
270 /*nelts=*/NULL_TREE,
271 static_storage_p, NULL_TREE);
272 if (ce.value)
274 vec_alloc (v, 1);
275 v->quick_push (ce);
279 /* Build a constructor to contain the initializations. */
280 init = build_constructor (type, v);
282 else if (VECTOR_TYPE_P (type))
283 init = build_zero_cst (type);
284 else
285 gcc_assert (TREE_CODE (type) == REFERENCE_TYPE);
287 /* In all cases, the initializer is a constant. */
288 if (init)
289 TREE_CONSTANT (init) = 1;
291 return init;
294 /* Return an expression for the zero-initialization of an object with
295 type T. This expression will either be a constant (in the case
296 that T is a scalar), or a CONSTRUCTOR (in the case that T is an
297 aggregate), or NULL (in the case that T does not require
298 initialization). In either case, the value can be used as
299 DECL_INITIAL for a decl of the indicated TYPE; it is a valid static
300 initializer. If NELTS is non-NULL, and TYPE is an ARRAY_TYPE, NELTS
301 is the number of elements in the array. If STATIC_STORAGE_P is
302 TRUE, initializers are only generated for entities for which
303 zero-initialization does not simply mean filling the storage with
304 zero bytes. */
306 tree
307 build_zero_init (tree type, tree nelts, bool static_storage_p)
309 return build_zero_init_1 (type, nelts, static_storage_p, NULL_TREE);
312 /* Return a suitable initializer for value-initializing an object of type
313 TYPE, as described in [dcl.init]. */
315 tree
316 build_value_init (tree type, tsubst_flags_t complain)
318 /* [dcl.init]
320 To value-initialize an object of type T means:
322 - if T is a class type (clause 9) with either no default constructor
323 (12.1) or a default constructor that is user-provided or deleted,
324 then the object is default-initialized;
326 - if T is a (possibly cv-qualified) class type without a user-provided
327 or deleted default constructor, then the object is zero-initialized
328 and the semantic constraints for default-initialization are checked,
329 and if T has a non-trivial default constructor, the object is
330 default-initialized;
332 - if T is an array type, then each element is value-initialized;
334 - otherwise, the object is zero-initialized.
336 A program that calls for default-initialization or
337 value-initialization of an entity of reference type is ill-formed. */
339 /* The AGGR_INIT_EXPR tweaking below breaks in templates. */
340 gcc_assert (!processing_template_decl
341 || (SCALAR_TYPE_P (type) || TREE_CODE (type) == ARRAY_TYPE));
343 if (CLASS_TYPE_P (type)
344 && type_build_ctor_call (type))
346 tree ctor =
347 build_special_member_call (NULL_TREE, complete_ctor_identifier,
348 NULL, type, LOOKUP_NORMAL,
349 complain);
350 if (ctor == error_mark_node)
351 return ctor;
352 tree fn = NULL_TREE;
353 if (TREE_CODE (ctor) == CALL_EXPR)
354 fn = get_callee_fndecl (ctor);
355 ctor = build_aggr_init_expr (type, ctor);
356 if (fn && user_provided_p (fn))
357 return ctor;
358 else if (TYPE_HAS_COMPLEX_DFLT (type))
360 /* This is a class that needs constructing, but doesn't have
361 a user-provided constructor. So we need to zero-initialize
362 the object and then call the implicitly defined ctor.
363 This will be handled in simplify_aggr_init_expr. */
364 AGGR_INIT_ZERO_FIRST (ctor) = 1;
365 return ctor;
369 /* Discard any access checking during subobject initialization;
370 the checks are implied by the call to the ctor which we have
371 verified is OK (cpp0x/defaulted46.C). */
372 push_deferring_access_checks (dk_deferred);
373 tree r = build_value_init_noctor (type, complain);
374 pop_deferring_access_checks ();
375 return r;
378 /* Like build_value_init, but don't call the constructor for TYPE. Used
379 for base initializers. */
381 tree
382 build_value_init_noctor (tree type, tsubst_flags_t complain)
384 if (!COMPLETE_TYPE_P (type))
386 if (complain & tf_error)
387 error ("value-initialization of incomplete type %qT", type);
388 return error_mark_node;
390 /* FIXME the class and array cases should just use digest_init once it is
391 SFINAE-enabled. */
392 if (CLASS_TYPE_P (type))
394 gcc_assert (!TYPE_HAS_COMPLEX_DFLT (type)
395 || errorcount != 0);
397 if (TREE_CODE (type) != UNION_TYPE)
399 tree field;
400 vec<constructor_elt, va_gc> *v = NULL;
402 /* Iterate over the fields, building initializations. */
403 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
405 tree ftype, value;
407 if (TREE_CODE (field) != FIELD_DECL)
408 continue;
410 ftype = TREE_TYPE (field);
412 if (ftype == error_mark_node)
413 continue;
415 /* We could skip vfields and fields of types with
416 user-defined constructors, but I think that won't improve
417 performance at all; it should be simpler in general just
418 to zero out the entire object than try to only zero the
419 bits that actually need it. */
421 /* Note that for class types there will be FIELD_DECLs
422 corresponding to base classes as well. Thus, iterating
423 over TYPE_FIELDs will result in correct initialization of
424 all of the subobjects. */
425 value = build_value_init (ftype, complain);
426 value = maybe_constant_init (value);
428 if (value == error_mark_node)
429 return error_mark_node;
431 CONSTRUCTOR_APPEND_ELT(v, field, value);
433 /* We shouldn't have gotten here for anything that would need
434 non-trivial initialization, and gimplify_init_ctor_preeval
435 would need to be fixed to allow it. */
436 gcc_assert (TREE_CODE (value) != TARGET_EXPR
437 && TREE_CODE (value) != AGGR_INIT_EXPR);
440 /* Build a constructor to contain the zero- initializations. */
441 return build_constructor (type, v);
444 else if (TREE_CODE (type) == ARRAY_TYPE)
446 vec<constructor_elt, va_gc> *v = NULL;
448 /* Iterate over the array elements, building initializations. */
449 tree max_index = array_type_nelts (type);
451 /* If we have an error_mark here, we should just return error mark
452 as we don't know the size of the array yet. */
453 if (max_index == error_mark_node)
455 if (complain & tf_error)
456 error ("cannot value-initialize array of unknown bound %qT",
457 type);
458 return error_mark_node;
460 gcc_assert (TREE_CODE (max_index) == INTEGER_CST);
462 /* A zero-sized array, which is accepted as an extension, will
463 have an upper bound of -1. */
464 if (!tree_int_cst_equal (max_index, integer_minus_one_node))
466 constructor_elt ce;
468 /* If this is a one element array, we just use a regular init. */
469 if (tree_int_cst_equal (size_zero_node, max_index))
470 ce.index = size_zero_node;
471 else
472 ce.index = build2 (RANGE_EXPR, sizetype, size_zero_node, max_index);
474 ce.value = build_value_init (TREE_TYPE (type), complain);
475 ce.value = maybe_constant_init (ce.value);
476 if (ce.value == error_mark_node)
477 return error_mark_node;
479 vec_alloc (v, 1);
480 v->quick_push (ce);
482 /* We shouldn't have gotten here for anything that would need
483 non-trivial initialization, and gimplify_init_ctor_preeval
484 would need to be fixed to allow it. */
485 gcc_assert (TREE_CODE (ce.value) != TARGET_EXPR
486 && TREE_CODE (ce.value) != AGGR_INIT_EXPR);
489 /* Build a constructor to contain the initializations. */
490 return build_constructor (type, v);
492 else if (TREE_CODE (type) == FUNCTION_TYPE)
494 if (complain & tf_error)
495 error ("value-initialization of function type %qT", type);
496 return error_mark_node;
498 else if (TREE_CODE (type) == REFERENCE_TYPE)
500 if (complain & tf_error)
501 error ("value-initialization of reference type %qT", type);
502 return error_mark_node;
505 return build_zero_init (type, NULL_TREE, /*static_storage_p=*/false);
508 /* Initialize current class with INIT, a TREE_LIST of
509 arguments for a target constructor. If TREE_LIST is void_type_node,
510 an empty initializer list was given. */
512 static void
513 perform_target_ctor (tree init)
515 tree decl = current_class_ref;
516 tree type = current_class_type;
518 finish_expr_stmt (build_aggr_init (decl, init,
519 LOOKUP_NORMAL|LOOKUP_DELEGATING_CONS,
520 tf_warning_or_error));
521 if (type_build_dtor_call (type))
523 tree expr = build_delete (type, decl, sfk_complete_destructor,
524 LOOKUP_NORMAL
525 |LOOKUP_NONVIRTUAL
526 |LOOKUP_DESTRUCTOR,
527 0, tf_warning_or_error);
528 if (expr != error_mark_node
529 && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type))
530 finish_eh_cleanup (expr);
534 /* Return the non-static data initializer for FIELD_DECL MEMBER. */
536 tree
537 get_nsdmi (tree member, bool in_ctor)
539 tree init;
540 tree save_ccp = current_class_ptr;
541 tree save_ccr = current_class_ref;
543 if (!in_ctor)
545 /* Use a PLACEHOLDER_EXPR when we don't have a 'this' parameter to
546 refer to; constexpr evaluation knows what to do with it. */
547 current_class_ref = build0 (PLACEHOLDER_EXPR, DECL_CONTEXT (member));
548 current_class_ptr = build_address (current_class_ref);
551 if (DECL_LANG_SPECIFIC (member) && DECL_TEMPLATE_INFO (member))
553 init = DECL_INITIAL (DECL_TI_TEMPLATE (member));
554 if (TREE_CODE (init) == DEFAULT_ARG)
555 goto unparsed;
557 /* Check recursive instantiation. */
558 if (DECL_INSTANTIATING_NSDMI_P (member))
560 error ("recursive instantiation of non-static data member "
561 "initializer for %qD", member);
562 init = error_mark_node;
564 else
566 DECL_INSTANTIATING_NSDMI_P (member) = 1;
568 /* Do deferred instantiation of the NSDMI. */
569 init = (tsubst_copy_and_build
570 (init, DECL_TI_ARGS (member),
571 tf_warning_or_error, member, /*function_p=*/false,
572 /*integral_constant_expression_p=*/false));
573 init = digest_nsdmi_init (member, init);
575 DECL_INSTANTIATING_NSDMI_P (member) = 0;
578 else
580 init = DECL_INITIAL (member);
581 if (init && TREE_CODE (init) == DEFAULT_ARG)
583 unparsed:
584 error ("constructor required before non-static data member "
585 "for %qD has been parsed", member);
586 DECL_INITIAL (member) = error_mark_node;
587 init = error_mark_node;
589 /* Strip redundant TARGET_EXPR so we don't need to remap it, and
590 so the aggregate init code below will see a CONSTRUCTOR. */
591 bool simple_target = (init && SIMPLE_TARGET_EXPR_P (init));
592 if (simple_target)
593 init = TARGET_EXPR_INITIAL (init);
594 init = break_out_target_exprs (init);
595 if (simple_target && TREE_CODE (init) != CONSTRUCTOR)
596 /* Now put it back so C++17 copy elision works. */
597 init = get_target_expr (init);
599 current_class_ptr = save_ccp;
600 current_class_ref = save_ccr;
601 return init;
604 /* Diagnose the flexible array MEMBER if its INITializer is non-null
605 and return true if so. Otherwise return false. */
607 bool
608 maybe_reject_flexarray_init (tree member, tree init)
610 tree type = TREE_TYPE (member);
612 if (!init
613 || TREE_CODE (type) != ARRAY_TYPE
614 || TYPE_DOMAIN (type))
615 return false;
617 /* Point at the flexible array member declaration if it's initialized
618 in-class, and at the ctor if it's initialized in a ctor member
619 initializer list. */
620 location_t loc;
621 if (DECL_INITIAL (member) == init
622 || !current_function_decl
623 || DECL_DEFAULTED_FN (current_function_decl))
624 loc = DECL_SOURCE_LOCATION (member);
625 else
626 loc = DECL_SOURCE_LOCATION (current_function_decl);
628 error_at (loc, "initializer for flexible array member %q#D", member);
629 return true;
632 /* Initialize MEMBER, a FIELD_DECL, with INIT, a TREE_LIST of
633 arguments. If TREE_LIST is void_type_node, an empty initializer
634 list was given; if NULL_TREE no initializer was given. */
636 static void
637 perform_member_init (tree member, tree init)
639 tree decl;
640 tree type = TREE_TYPE (member);
642 /* Use the non-static data member initializer if there was no
643 mem-initializer for this field. */
644 if (init == NULL_TREE)
645 init = get_nsdmi (member, /*ctor*/true);
647 if (init == error_mark_node)
648 return;
650 /* Effective C++ rule 12 requires that all data members be
651 initialized. */
652 if (warn_ecpp && init == NULL_TREE && TREE_CODE (type) != ARRAY_TYPE)
653 warning_at (DECL_SOURCE_LOCATION (current_function_decl), OPT_Weffc__,
654 "%qD should be initialized in the member initialization list",
655 member);
657 /* Get an lvalue for the data member. */
658 decl = build_class_member_access_expr (current_class_ref, member,
659 /*access_path=*/NULL_TREE,
660 /*preserve_reference=*/true,
661 tf_warning_or_error);
662 if (decl == error_mark_node)
663 return;
665 if (warn_init_self && init && TREE_CODE (init) == TREE_LIST
666 && TREE_CHAIN (init) == NULL_TREE)
668 tree val = TREE_VALUE (init);
669 /* Handle references. */
670 if (REFERENCE_REF_P (val))
671 val = TREE_OPERAND (val, 0);
672 if (TREE_CODE (val) == COMPONENT_REF && TREE_OPERAND (val, 1) == member
673 && TREE_OPERAND (val, 0) == current_class_ref)
674 warning_at (DECL_SOURCE_LOCATION (current_function_decl),
675 OPT_Winit_self, "%qD is initialized with itself",
676 member);
679 if (init == void_type_node)
681 /* mem() means value-initialization. */
682 if (TREE_CODE (type) == ARRAY_TYPE)
684 init = build_vec_init_expr (type, init, tf_warning_or_error);
685 init = build2 (INIT_EXPR, type, decl, init);
686 finish_expr_stmt (init);
688 else
690 tree value = build_value_init (type, tf_warning_or_error);
691 if (value == error_mark_node)
692 return;
693 init = build2 (INIT_EXPR, type, decl, value);
694 finish_expr_stmt (init);
697 /* Deal with this here, as we will get confused if we try to call the
698 assignment op for an anonymous union. This can happen in a
699 synthesized copy constructor. */
700 else if (ANON_AGGR_TYPE_P (type))
702 if (init)
704 init = build2 (INIT_EXPR, type, decl, TREE_VALUE (init));
705 finish_expr_stmt (init);
708 else if (init
709 && (TREE_CODE (type) == REFERENCE_TYPE
710 /* Pre-digested NSDMI. */
711 || (((TREE_CODE (init) == CONSTRUCTOR
712 && TREE_TYPE (init) == type)
713 /* { } mem-initializer. */
714 || (TREE_CODE (init) == TREE_LIST
715 && DIRECT_LIST_INIT_P (TREE_VALUE (init))))
716 && (CP_AGGREGATE_TYPE_P (type)
717 || is_std_init_list (type)))))
719 /* With references and list-initialization, we need to deal with
720 extending temporary lifetimes. 12.2p5: "A temporary bound to a
721 reference member in a constructor’s ctor-initializer (12.6.2)
722 persists until the constructor exits." */
723 unsigned i; tree t;
724 vec<tree, va_gc> *cleanups = make_tree_vector ();
725 if (TREE_CODE (init) == TREE_LIST)
726 init = build_x_compound_expr_from_list (init, ELK_MEM_INIT,
727 tf_warning_or_error);
728 if (TREE_TYPE (init) != type)
730 if (BRACE_ENCLOSED_INITIALIZER_P (init)
731 && CP_AGGREGATE_TYPE_P (type))
732 init = reshape_init (type, init, tf_warning_or_error);
733 init = digest_init (type, init, tf_warning_or_error);
735 if (init == error_mark_node)
736 return;
737 /* A FIELD_DECL doesn't really have a suitable lifetime, but
738 make_temporary_var_for_ref_to_temp will treat it as automatic and
739 set_up_extended_ref_temp wants to use the decl in a warning. */
740 init = extend_ref_init_temps (member, init, &cleanups);
741 if (TREE_CODE (type) == ARRAY_TYPE
742 && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (type)))
743 init = build_vec_init_expr (type, init, tf_warning_or_error);
744 init = build2 (INIT_EXPR, type, decl, init);
745 finish_expr_stmt (init);
746 FOR_EACH_VEC_ELT (*cleanups, i, t)
747 push_cleanup (decl, t, false);
748 release_tree_vector (cleanups);
750 else if (type_build_ctor_call (type)
751 || (init && CLASS_TYPE_P (strip_array_types (type))))
753 if (TREE_CODE (type) == ARRAY_TYPE)
755 if (init)
757 /* Check to make sure the member initializer is valid and
758 something like a CONSTRUCTOR in: T a[] = { 1, 2 } and
759 if it isn't, return early to avoid triggering another
760 error below. */
761 if (maybe_reject_flexarray_init (member, init))
762 return;
764 if (TREE_CODE (init) != TREE_LIST || TREE_CHAIN (init))
765 init = error_mark_node;
766 else
767 init = TREE_VALUE (init);
769 if (BRACE_ENCLOSED_INITIALIZER_P (init))
770 init = digest_init (type, init, tf_warning_or_error);
772 if (init == NULL_TREE
773 || same_type_ignoring_top_level_qualifiers_p (type,
774 TREE_TYPE (init)))
776 if (TYPE_DOMAIN (type) && TYPE_MAX_VALUE (TYPE_DOMAIN (type)))
778 /* Initialize the array only if it's not a flexible
779 array member (i.e., if it has an upper bound). */
780 init = build_vec_init_expr (type, init, tf_warning_or_error);
781 init = build2 (INIT_EXPR, type, decl, init);
782 finish_expr_stmt (init);
785 else
786 error ("invalid initializer for array member %q#D", member);
788 else
790 int flags = LOOKUP_NORMAL;
791 if (DECL_DEFAULTED_FN (current_function_decl))
792 flags |= LOOKUP_DEFAULTED;
793 if (CP_TYPE_CONST_P (type)
794 && init == NULL_TREE
795 && default_init_uninitialized_part (type))
797 /* TYPE_NEEDS_CONSTRUCTING can be set just because we have a
798 vtable; still give this diagnostic. */
799 if (permerror (DECL_SOURCE_LOCATION (current_function_decl),
800 "uninitialized const member in %q#T", type))
801 inform (DECL_SOURCE_LOCATION (member),
802 "%q#D should be initialized", member );
804 finish_expr_stmt (build_aggr_init (decl, init, flags,
805 tf_warning_or_error));
808 else
810 if (init == NULL_TREE)
812 tree core_type;
813 /* member traversal: note it leaves init NULL */
814 if (TREE_CODE (type) == REFERENCE_TYPE)
816 if (permerror (DECL_SOURCE_LOCATION (current_function_decl),
817 "uninitialized reference member in %q#T", type))
818 inform (DECL_SOURCE_LOCATION (member),
819 "%q#D should be initialized", member);
821 else if (CP_TYPE_CONST_P (type))
823 if (permerror (DECL_SOURCE_LOCATION (current_function_decl),
824 "uninitialized const member in %q#T", type))
825 inform (DECL_SOURCE_LOCATION (member),
826 "%q#D should be initialized", member );
829 core_type = strip_array_types (type);
831 if (CLASS_TYPE_P (core_type)
832 && (CLASSTYPE_READONLY_FIELDS_NEED_INIT (core_type)
833 || CLASSTYPE_REF_FIELDS_NEED_INIT (core_type)))
834 diagnose_uninitialized_cst_or_ref_member (core_type,
835 /*using_new=*/false,
836 /*complain=*/true);
838 else if (TREE_CODE (init) == TREE_LIST)
839 /* There was an explicit member initialization. Do some work
840 in that case. */
841 init = build_x_compound_expr_from_list (init, ELK_MEM_INIT,
842 tf_warning_or_error);
844 /* Reject a member initializer for a flexible array member. */
845 if (init && !maybe_reject_flexarray_init (member, init))
846 finish_expr_stmt (cp_build_modify_expr (input_location, decl,
847 INIT_EXPR, init,
848 tf_warning_or_error));
851 if (type_build_dtor_call (type))
853 tree expr;
855 expr = build_class_member_access_expr (current_class_ref, member,
856 /*access_path=*/NULL_TREE,
857 /*preserve_reference=*/false,
858 tf_warning_or_error);
859 expr = build_delete (type, expr, sfk_complete_destructor,
860 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0,
861 tf_warning_or_error);
863 if (expr != error_mark_node
864 && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type))
865 finish_eh_cleanup (expr);
869 /* Returns a TREE_LIST containing (as the TREE_PURPOSE of each node) all
870 the FIELD_DECLs on the TYPE_FIELDS list for T, in reverse order. */
872 static tree
873 build_field_list (tree t, tree list, int *uses_unions_or_anon_p)
875 tree fields;
877 /* Note whether or not T is a union. */
878 if (TREE_CODE (t) == UNION_TYPE)
879 *uses_unions_or_anon_p = 1;
881 for (fields = TYPE_FIELDS (t); fields; fields = DECL_CHAIN (fields))
883 tree fieldtype;
885 /* Skip CONST_DECLs for enumeration constants and so forth. */
886 if (TREE_CODE (fields) != FIELD_DECL || DECL_ARTIFICIAL (fields))
887 continue;
889 fieldtype = TREE_TYPE (fields);
891 /* For an anonymous struct or union, we must recursively
892 consider the fields of the anonymous type. They can be
893 directly initialized from the constructor. */
894 if (ANON_AGGR_TYPE_P (fieldtype))
896 /* Add this field itself. Synthesized copy constructors
897 initialize the entire aggregate. */
898 list = tree_cons (fields, NULL_TREE, list);
899 /* And now add the fields in the anonymous aggregate. */
900 list = build_field_list (fieldtype, list, uses_unions_or_anon_p);
901 *uses_unions_or_anon_p = 1;
903 /* Add this field. */
904 else if (DECL_NAME (fields))
905 list = tree_cons (fields, NULL_TREE, list);
908 return list;
911 /* Return the innermost aggregate scope for FIELD, whether that is
912 the enclosing class or an anonymous aggregate within it. */
914 static tree
915 innermost_aggr_scope (tree field)
917 if (ANON_AGGR_TYPE_P (TREE_TYPE (field)))
918 return TREE_TYPE (field);
919 else
920 return DECL_CONTEXT (field);
923 /* The MEM_INITS are a TREE_LIST. The TREE_PURPOSE of each list gives
924 a FIELD_DECL or BINFO in T that needs initialization. The
925 TREE_VALUE gives the initializer, or list of initializer arguments.
927 Return a TREE_LIST containing all of the initializations required
928 for T, in the order in which they should be performed. The output
929 list has the same format as the input. */
931 static tree
932 sort_mem_initializers (tree t, tree mem_inits)
934 tree init;
935 tree base, binfo, base_binfo;
936 tree sorted_inits;
937 tree next_subobject;
938 vec<tree, va_gc> *vbases;
939 int i;
940 int uses_unions_or_anon_p = 0;
942 /* Build up a list of initializations. The TREE_PURPOSE of entry
943 will be the subobject (a FIELD_DECL or BINFO) to initialize. The
944 TREE_VALUE will be the constructor arguments, or NULL if no
945 explicit initialization was provided. */
946 sorted_inits = NULL_TREE;
948 /* Process the virtual bases. */
949 for (vbases = CLASSTYPE_VBASECLASSES (t), i = 0;
950 vec_safe_iterate (vbases, i, &base); i++)
951 sorted_inits = tree_cons (base, NULL_TREE, sorted_inits);
953 /* Process the direct bases. */
954 for (binfo = TYPE_BINFO (t), i = 0;
955 BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i)
956 if (!BINFO_VIRTUAL_P (base_binfo))
957 sorted_inits = tree_cons (base_binfo, NULL_TREE, sorted_inits);
959 /* Process the non-static data members. */
960 sorted_inits = build_field_list (t, sorted_inits, &uses_unions_or_anon_p);
961 /* Reverse the entire list of initializations, so that they are in
962 the order that they will actually be performed. */
963 sorted_inits = nreverse (sorted_inits);
965 /* If the user presented the initializers in an order different from
966 that in which they will actually occur, we issue a warning. Keep
967 track of the next subobject which can be explicitly initialized
968 without issuing a warning. */
969 next_subobject = sorted_inits;
971 /* Go through the explicit initializers, filling in TREE_PURPOSE in
972 the SORTED_INITS. */
973 for (init = mem_inits; init; init = TREE_CHAIN (init))
975 tree subobject;
976 tree subobject_init;
978 subobject = TREE_PURPOSE (init);
980 /* If the explicit initializers are in sorted order, then
981 SUBOBJECT will be NEXT_SUBOBJECT, or something following
982 it. */
983 for (subobject_init = next_subobject;
984 subobject_init;
985 subobject_init = TREE_CHAIN (subobject_init))
986 if (TREE_PURPOSE (subobject_init) == subobject)
987 break;
989 /* Issue a warning if the explicit initializer order does not
990 match that which will actually occur.
991 ??? Are all these on the correct lines? */
992 if (warn_reorder && !subobject_init)
994 if (TREE_CODE (TREE_PURPOSE (next_subobject)) == FIELD_DECL)
995 warning_at (DECL_SOURCE_LOCATION (TREE_PURPOSE (next_subobject)),
996 OPT_Wreorder, "%qD will be initialized after",
997 TREE_PURPOSE (next_subobject));
998 else
999 warning (OPT_Wreorder, "base %qT will be initialized after",
1000 TREE_PURPOSE (next_subobject));
1001 if (TREE_CODE (subobject) == FIELD_DECL)
1002 warning_at (DECL_SOURCE_LOCATION (subobject),
1003 OPT_Wreorder, " %q#D", subobject);
1004 else
1005 warning (OPT_Wreorder, " base %qT", subobject);
1006 warning_at (DECL_SOURCE_LOCATION (current_function_decl),
1007 OPT_Wreorder, " when initialized here");
1010 /* Look again, from the beginning of the list. */
1011 if (!subobject_init)
1013 subobject_init = sorted_inits;
1014 while (TREE_PURPOSE (subobject_init) != subobject)
1015 subobject_init = TREE_CHAIN (subobject_init);
1018 /* It is invalid to initialize the same subobject more than
1019 once. */
1020 if (TREE_VALUE (subobject_init))
1022 if (TREE_CODE (subobject) == FIELD_DECL)
1023 error_at (DECL_SOURCE_LOCATION (current_function_decl),
1024 "multiple initializations given for %qD",
1025 subobject);
1026 else
1027 error_at (DECL_SOURCE_LOCATION (current_function_decl),
1028 "multiple initializations given for base %qT",
1029 subobject);
1032 /* Record the initialization. */
1033 TREE_VALUE (subobject_init) = TREE_VALUE (init);
1034 next_subobject = subobject_init;
1037 /* [class.base.init]
1039 If a ctor-initializer specifies more than one mem-initializer for
1040 multiple members of the same union (including members of
1041 anonymous unions), the ctor-initializer is ill-formed.
1043 Here we also splice out uninitialized union members. */
1044 if (uses_unions_or_anon_p)
1046 tree *last_p = NULL;
1047 tree *p;
1048 for (p = &sorted_inits; *p; )
1050 tree field;
1051 tree ctx;
1053 init = *p;
1055 field = TREE_PURPOSE (init);
1057 /* Skip base classes. */
1058 if (TREE_CODE (field) != FIELD_DECL)
1059 goto next;
1061 /* If this is an anonymous aggregate with no explicit initializer,
1062 splice it out. */
1063 if (!TREE_VALUE (init) && ANON_AGGR_TYPE_P (TREE_TYPE (field)))
1064 goto splice;
1066 /* See if this field is a member of a union, or a member of a
1067 structure contained in a union, etc. */
1068 ctx = innermost_aggr_scope (field);
1070 /* If this field is not a member of a union, skip it. */
1071 if (TREE_CODE (ctx) != UNION_TYPE
1072 && !ANON_AGGR_TYPE_P (ctx))
1073 goto next;
1075 /* If this union member has no explicit initializer and no NSDMI,
1076 splice it out. */
1077 if (TREE_VALUE (init) || DECL_INITIAL (field))
1078 /* OK. */;
1079 else
1080 goto splice;
1082 /* It's only an error if we have two initializers for the same
1083 union type. */
1084 if (!last_p)
1086 last_p = p;
1087 goto next;
1090 /* See if LAST_FIELD and the field initialized by INIT are
1091 members of the same union (or the union itself). If so, there's
1092 a problem, unless they're actually members of the same structure
1093 which is itself a member of a union. For example, given:
1095 union { struct { int i; int j; }; };
1097 initializing both `i' and `j' makes sense. */
1098 ctx = common_enclosing_class
1099 (innermost_aggr_scope (field),
1100 innermost_aggr_scope (TREE_PURPOSE (*last_p)));
1102 if (ctx && (TREE_CODE (ctx) == UNION_TYPE
1103 || ctx == TREE_TYPE (TREE_PURPOSE (*last_p))))
1105 /* A mem-initializer hides an NSDMI. */
1106 if (TREE_VALUE (init) && !TREE_VALUE (*last_p))
1107 *last_p = TREE_CHAIN (*last_p);
1108 else if (TREE_VALUE (*last_p) && !TREE_VALUE (init))
1109 goto splice;
1110 else
1112 error_at (DECL_SOURCE_LOCATION (current_function_decl),
1113 "initializations for multiple members of %qT",
1114 ctx);
1115 goto splice;
1119 last_p = p;
1121 next:
1122 p = &TREE_CHAIN (*p);
1123 continue;
1124 splice:
1125 *p = TREE_CHAIN (*p);
1126 continue;
1130 return sorted_inits;
1133 /* Callback for cp_walk_tree to mark all PARM_DECLs in a tree as read. */
1135 static tree
1136 mark_exp_read_r (tree *tp, int *, void *)
1138 tree t = *tp;
1139 if (TREE_CODE (t) == PARM_DECL)
1140 mark_exp_read (t);
1141 return NULL_TREE;
1144 /* Initialize all bases and members of CURRENT_CLASS_TYPE. MEM_INITS
1145 is a TREE_LIST giving the explicit mem-initializer-list for the
1146 constructor. The TREE_PURPOSE of each entry is a subobject (a
1147 FIELD_DECL or a BINFO) of the CURRENT_CLASS_TYPE. The TREE_VALUE
1148 is a TREE_LIST giving the arguments to the constructor or
1149 void_type_node for an empty list of arguments. */
1151 void
1152 emit_mem_initializers (tree mem_inits)
1154 int flags = LOOKUP_NORMAL;
1156 /* We will already have issued an error message about the fact that
1157 the type is incomplete. */
1158 if (!COMPLETE_TYPE_P (current_class_type))
1159 return;
1161 if (mem_inits
1162 && TYPE_P (TREE_PURPOSE (mem_inits))
1163 && same_type_p (TREE_PURPOSE (mem_inits), current_class_type))
1165 /* Delegating constructor. */
1166 gcc_assert (TREE_CHAIN (mem_inits) == NULL_TREE);
1167 perform_target_ctor (TREE_VALUE (mem_inits));
1168 return;
1171 if (DECL_DEFAULTED_FN (current_function_decl)
1172 && ! DECL_INHERITED_CTOR (current_function_decl))
1173 flags |= LOOKUP_DEFAULTED;
1175 /* Sort the mem-initializers into the order in which the
1176 initializations should be performed. */
1177 mem_inits = sort_mem_initializers (current_class_type, mem_inits);
1179 in_base_initializer = 1;
1181 /* Initialize base classes. */
1182 for (; (mem_inits
1183 && TREE_CODE (TREE_PURPOSE (mem_inits)) != FIELD_DECL);
1184 mem_inits = TREE_CHAIN (mem_inits))
1186 tree subobject = TREE_PURPOSE (mem_inits);
1187 tree arguments = TREE_VALUE (mem_inits);
1189 /* We already have issued an error message. */
1190 if (arguments == error_mark_node)
1191 continue;
1193 /* Suppress access control when calling the inherited ctor. */
1194 bool inherited_base = (DECL_INHERITED_CTOR (current_function_decl)
1195 && flag_new_inheriting_ctors
1196 && arguments);
1197 if (inherited_base)
1198 push_deferring_access_checks (dk_deferred);
1200 if (arguments == NULL_TREE)
1202 /* If these initializations are taking place in a copy constructor,
1203 the base class should probably be explicitly initialized if there
1204 is a user-defined constructor in the base class (other than the
1205 default constructor, which will be called anyway). */
1206 if (extra_warnings
1207 && DECL_COPY_CONSTRUCTOR_P (current_function_decl)
1208 && type_has_user_nondefault_constructor (BINFO_TYPE (subobject)))
1209 warning_at (DECL_SOURCE_LOCATION (current_function_decl),
1210 OPT_Wextra, "base class %q#T should be explicitly "
1211 "initialized in the copy constructor",
1212 BINFO_TYPE (subobject));
1215 /* Initialize the base. */
1216 if (!BINFO_VIRTUAL_P (subobject))
1218 tree base_addr;
1220 base_addr = build_base_path (PLUS_EXPR, current_class_ptr,
1221 subobject, 1, tf_warning_or_error);
1222 expand_aggr_init_1 (subobject, NULL_TREE,
1223 cp_build_indirect_ref (base_addr, RO_NULL,
1224 tf_warning_or_error),
1225 arguments,
1226 flags,
1227 tf_warning_or_error);
1228 expand_cleanup_for_base (subobject, NULL_TREE);
1230 else if (!ABSTRACT_CLASS_TYPE_P (current_class_type))
1231 /* C++14 DR1658 Means we do not have to construct vbases of
1232 abstract classes. */
1233 construct_virtual_base (subobject, arguments);
1234 else
1235 /* When not constructing vbases of abstract classes, at least mark
1236 the arguments expressions as read to avoid
1237 -Wunused-but-set-parameter false positives. */
1238 cp_walk_tree (&arguments, mark_exp_read_r, NULL, NULL);
1240 if (inherited_base)
1241 pop_deferring_access_checks ();
1243 in_base_initializer = 0;
1245 /* Initialize the vptrs. */
1246 initialize_vtbl_ptrs (current_class_ptr);
1248 /* Initialize the data members. */
1249 while (mem_inits)
1251 perform_member_init (TREE_PURPOSE (mem_inits),
1252 TREE_VALUE (mem_inits));
1253 mem_inits = TREE_CHAIN (mem_inits);
1257 /* Returns the address of the vtable (i.e., the value that should be
1258 assigned to the vptr) for BINFO. */
1260 tree
1261 build_vtbl_address (tree binfo)
1263 tree binfo_for = binfo;
1264 tree vtbl;
1266 if (BINFO_VPTR_INDEX (binfo) && BINFO_VIRTUAL_P (binfo))
1267 /* If this is a virtual primary base, then the vtable we want to store
1268 is that for the base this is being used as the primary base of. We
1269 can't simply skip the initialization, because we may be expanding the
1270 inits of a subobject constructor where the virtual base layout
1271 can be different. */
1272 while (BINFO_PRIMARY_P (binfo_for))
1273 binfo_for = BINFO_INHERITANCE_CHAIN (binfo_for);
1275 /* Figure out what vtable BINFO's vtable is based on, and mark it as
1276 used. */
1277 vtbl = get_vtbl_decl_for_binfo (binfo_for);
1278 TREE_USED (vtbl) = true;
1280 /* Now compute the address to use when initializing the vptr. */
1281 vtbl = unshare_expr (BINFO_VTABLE (binfo_for));
1282 if (VAR_P (vtbl))
1283 vtbl = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (vtbl)), vtbl);
1285 return vtbl;
1288 /* This code sets up the virtual function tables appropriate for
1289 the pointer DECL. It is a one-ply initialization.
1291 BINFO is the exact type that DECL is supposed to be. In
1292 multiple inheritance, this might mean "C's A" if C : A, B. */
1294 static void
1295 expand_virtual_init (tree binfo, tree decl)
1297 tree vtbl, vtbl_ptr;
1298 tree vtt_index;
1300 /* Compute the initializer for vptr. */
1301 vtbl = build_vtbl_address (binfo);
1303 /* We may get this vptr from a VTT, if this is a subobject
1304 constructor or subobject destructor. */
1305 vtt_index = BINFO_VPTR_INDEX (binfo);
1306 if (vtt_index)
1308 tree vtbl2;
1309 tree vtt_parm;
1311 /* Compute the value to use, when there's a VTT. */
1312 vtt_parm = current_vtt_parm;
1313 vtbl2 = fold_build_pointer_plus (vtt_parm, vtt_index);
1314 vtbl2 = cp_build_indirect_ref (vtbl2, RO_NULL, tf_warning_or_error);
1315 vtbl2 = convert (TREE_TYPE (vtbl), vtbl2);
1317 /* The actual initializer is the VTT value only in the subobject
1318 constructor. In maybe_clone_body we'll substitute NULL for
1319 the vtt_parm in the case of the non-subobject constructor. */
1320 vtbl = build_if_in_charge (vtbl, vtbl2);
1323 /* Compute the location of the vtpr. */
1324 vtbl_ptr = build_vfield_ref (cp_build_indirect_ref (decl, RO_NULL,
1325 tf_warning_or_error),
1326 TREE_TYPE (binfo));
1327 gcc_assert (vtbl_ptr != error_mark_node);
1329 /* Assign the vtable to the vptr. */
1330 vtbl = convert_force (TREE_TYPE (vtbl_ptr), vtbl, 0, tf_warning_or_error);
1331 finish_expr_stmt (cp_build_modify_expr (input_location, vtbl_ptr, NOP_EXPR,
1332 vtbl, tf_warning_or_error));
1335 /* If an exception is thrown in a constructor, those base classes already
1336 constructed must be destroyed. This function creates the cleanup
1337 for BINFO, which has just been constructed. If FLAG is non-NULL,
1338 it is a DECL which is nonzero when this base needs to be
1339 destroyed. */
1341 static void
1342 expand_cleanup_for_base (tree binfo, tree flag)
1344 tree expr;
1346 if (!type_build_dtor_call (BINFO_TYPE (binfo)))
1347 return;
1349 /* Call the destructor. */
1350 expr = build_special_member_call (current_class_ref,
1351 base_dtor_identifier,
1352 NULL,
1353 binfo,
1354 LOOKUP_NORMAL | LOOKUP_NONVIRTUAL,
1355 tf_warning_or_error);
1357 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (BINFO_TYPE (binfo)))
1358 return;
1360 if (flag)
1361 expr = fold_build3_loc (input_location,
1362 COND_EXPR, void_type_node,
1363 c_common_truthvalue_conversion (input_location, flag),
1364 expr, integer_zero_node);
1366 finish_eh_cleanup (expr);
1369 /* Construct the virtual base-class VBASE passing the ARGUMENTS to its
1370 constructor. */
1372 static void
1373 construct_virtual_base (tree vbase, tree arguments)
1375 tree inner_if_stmt;
1376 tree exp;
1377 tree flag;
1379 /* If there are virtual base classes with destructors, we need to
1380 emit cleanups to destroy them if an exception is thrown during
1381 the construction process. These exception regions (i.e., the
1382 period during which the cleanups must occur) begin from the time
1383 the construction is complete to the end of the function. If we
1384 create a conditional block in which to initialize the
1385 base-classes, then the cleanup region for the virtual base begins
1386 inside a block, and ends outside of that block. This situation
1387 confuses the sjlj exception-handling code. Therefore, we do not
1388 create a single conditional block, but one for each
1389 initialization. (That way the cleanup regions always begin
1390 in the outer block.) We trust the back end to figure out
1391 that the FLAG will not change across initializations, and
1392 avoid doing multiple tests. */
1393 flag = DECL_CHAIN (DECL_ARGUMENTS (current_function_decl));
1394 inner_if_stmt = begin_if_stmt ();
1395 finish_if_stmt_cond (flag, inner_if_stmt);
1397 /* Compute the location of the virtual base. If we're
1398 constructing virtual bases, then we must be the most derived
1399 class. Therefore, we don't have to look up the virtual base;
1400 we already know where it is. */
1401 exp = convert_to_base_statically (current_class_ref, vbase);
1403 expand_aggr_init_1 (vbase, current_class_ref, exp, arguments,
1404 0, tf_warning_or_error);
1405 finish_then_clause (inner_if_stmt);
1406 finish_if_stmt (inner_if_stmt);
1408 expand_cleanup_for_base (vbase, flag);
1411 /* Find the context in which this FIELD can be initialized. */
1413 static tree
1414 initializing_context (tree field)
1416 tree t = DECL_CONTEXT (field);
1418 /* Anonymous union members can be initialized in the first enclosing
1419 non-anonymous union context. */
1420 while (t && ANON_AGGR_TYPE_P (t))
1421 t = TYPE_CONTEXT (t);
1422 return t;
1425 /* Function to give error message if member initialization specification
1426 is erroneous. FIELD is the member we decided to initialize.
1427 TYPE is the type for which the initialization is being performed.
1428 FIELD must be a member of TYPE.
1430 MEMBER_NAME is the name of the member. */
1432 static int
1433 member_init_ok_or_else (tree field, tree type, tree member_name)
1435 if (field == error_mark_node)
1436 return 0;
1437 if (!field)
1439 error ("class %qT does not have any field named %qD", type,
1440 member_name);
1441 return 0;
1443 if (VAR_P (field))
1445 error ("%q#D is a static data member; it can only be "
1446 "initialized at its definition",
1447 field);
1448 return 0;
1450 if (TREE_CODE (field) != FIELD_DECL)
1452 error ("%q#D is not a non-static data member of %qT",
1453 field, type);
1454 return 0;
1456 if (initializing_context (field) != type)
1458 error ("class %qT does not have any field named %qD", type,
1459 member_name);
1460 return 0;
1463 return 1;
1466 /* NAME is a FIELD_DECL, an IDENTIFIER_NODE which names a field, or it
1467 is a _TYPE node or TYPE_DECL which names a base for that type.
1468 Check the validity of NAME, and return either the base _TYPE, base
1469 binfo, or the FIELD_DECL of the member. If NAME is invalid, return
1470 NULL_TREE and issue a diagnostic.
1472 An old style unnamed direct single base construction is permitted,
1473 where NAME is NULL. */
1475 tree
1476 expand_member_init (tree name)
1478 tree basetype;
1479 tree field;
1481 if (!current_class_ref)
1482 return NULL_TREE;
1484 if (!name)
1486 /* This is an obsolete unnamed base class initializer. The
1487 parser will already have warned about its use. */
1488 switch (BINFO_N_BASE_BINFOS (TYPE_BINFO (current_class_type)))
1490 case 0:
1491 error ("unnamed initializer for %qT, which has no base classes",
1492 current_class_type);
1493 return NULL_TREE;
1494 case 1:
1495 basetype = BINFO_TYPE
1496 (BINFO_BASE_BINFO (TYPE_BINFO (current_class_type), 0));
1497 break;
1498 default:
1499 error ("unnamed initializer for %qT, which uses multiple inheritance",
1500 current_class_type);
1501 return NULL_TREE;
1504 else if (TYPE_P (name))
1506 basetype = TYPE_MAIN_VARIANT (name);
1507 name = TYPE_NAME (name);
1509 else if (TREE_CODE (name) == TYPE_DECL)
1510 basetype = TYPE_MAIN_VARIANT (TREE_TYPE (name));
1511 else
1512 basetype = NULL_TREE;
1514 if (basetype)
1516 tree class_binfo;
1517 tree direct_binfo;
1518 tree virtual_binfo;
1519 int i;
1521 if (current_template_parms
1522 || same_type_p (basetype, current_class_type))
1523 return basetype;
1525 class_binfo = TYPE_BINFO (current_class_type);
1526 direct_binfo = NULL_TREE;
1527 virtual_binfo = NULL_TREE;
1529 /* Look for a direct base. */
1530 for (i = 0; BINFO_BASE_ITERATE (class_binfo, i, direct_binfo); ++i)
1531 if (SAME_BINFO_TYPE_P (BINFO_TYPE (direct_binfo), basetype))
1532 break;
1534 /* Look for a virtual base -- unless the direct base is itself
1535 virtual. */
1536 if (!direct_binfo || !BINFO_VIRTUAL_P (direct_binfo))
1537 virtual_binfo = binfo_for_vbase (basetype, current_class_type);
1539 /* [class.base.init]
1541 If a mem-initializer-id is ambiguous because it designates
1542 both a direct non-virtual base class and an inherited virtual
1543 base class, the mem-initializer is ill-formed. */
1544 if (direct_binfo && virtual_binfo)
1546 error ("%qD is both a direct base and an indirect virtual base",
1547 basetype);
1548 return NULL_TREE;
1551 if (!direct_binfo && !virtual_binfo)
1553 if (CLASSTYPE_VBASECLASSES (current_class_type))
1554 error ("type %qT is not a direct or virtual base of %qT",
1555 basetype, current_class_type);
1556 else
1557 error ("type %qT is not a direct base of %qT",
1558 basetype, current_class_type);
1559 return NULL_TREE;
1562 return direct_binfo ? direct_binfo : virtual_binfo;
1564 else
1566 if (identifier_p (name))
1567 field = lookup_field (current_class_type, name, 1, false);
1568 else
1569 field = name;
1571 if (member_init_ok_or_else (field, current_class_type, name))
1572 return field;
1575 return NULL_TREE;
1578 /* This is like `expand_member_init', only it stores one aggregate
1579 value into another.
1581 INIT comes in two flavors: it is either a value which
1582 is to be stored in EXP, or it is a parameter list
1583 to go to a constructor, which will operate on EXP.
1584 If INIT is not a parameter list for a constructor, then set
1585 LOOKUP_ONLYCONVERTING.
1586 If FLAGS is LOOKUP_ONLYCONVERTING then it is the = init form of
1587 the initializer, if FLAGS is 0, then it is the (init) form.
1588 If `init' is a CONSTRUCTOR, then we emit a warning message,
1589 explaining that such initializations are invalid.
1591 If INIT resolves to a CALL_EXPR which happens to return
1592 something of the type we are looking for, then we know
1593 that we can safely use that call to perform the
1594 initialization.
1596 The virtual function table pointer cannot be set up here, because
1597 we do not really know its type.
1599 This never calls operator=().
1601 When initializing, nothing is CONST.
1603 A default copy constructor may have to be used to perform the
1604 initialization.
1606 A constructor or a conversion operator may have to be used to
1607 perform the initialization, but not both, as it would be ambiguous. */
1609 tree
1610 build_aggr_init (tree exp, tree init, int flags, tsubst_flags_t complain)
1612 tree stmt_expr;
1613 tree compound_stmt;
1614 int destroy_temps;
1615 tree type = TREE_TYPE (exp);
1616 int was_const = TREE_READONLY (exp);
1617 int was_volatile = TREE_THIS_VOLATILE (exp);
1618 int is_global;
1620 if (init == error_mark_node)
1621 return error_mark_node;
1623 location_t init_loc = (init
1624 ? EXPR_LOC_OR_LOC (init, input_location)
1625 : location_of (exp));
1627 TREE_READONLY (exp) = 0;
1628 TREE_THIS_VOLATILE (exp) = 0;
1630 if (TREE_CODE (type) == ARRAY_TYPE)
1632 tree itype = init ? TREE_TYPE (init) : NULL_TREE;
1633 int from_array = 0;
1635 if (VAR_P (exp) && DECL_DECOMPOSITION_P (exp))
1637 from_array = 1;
1638 if (init && DECL_P (init)
1639 && !(flags & LOOKUP_ONLYCONVERTING))
1641 /* Wrap the initializer in a CONSTRUCTOR so that build_vec_init
1642 recognizes it as direct-initialization. */
1643 init = build_constructor_single (init_list_type_node,
1644 NULL_TREE, init);
1645 CONSTRUCTOR_IS_DIRECT_INIT (init) = true;
1648 else
1650 /* An array may not be initialized use the parenthesized
1651 initialization form -- unless the initializer is "()". */
1652 if (init && TREE_CODE (init) == TREE_LIST)
1654 if (complain & tf_error)
1655 error ("bad array initializer");
1656 return error_mark_node;
1658 /* Must arrange to initialize each element of EXP
1659 from elements of INIT. */
1660 if (cv_qualified_p (type))
1661 TREE_TYPE (exp) = cv_unqualified (type);
1662 if (itype && cv_qualified_p (itype))
1663 TREE_TYPE (init) = cv_unqualified (itype);
1664 from_array = (itype && same_type_p (TREE_TYPE (init),
1665 TREE_TYPE (exp)));
1667 if (init && !from_array
1668 && !BRACE_ENCLOSED_INITIALIZER_P (init))
1670 if (complain & tf_error)
1671 permerror (init_loc, "array must be initialized "
1672 "with a brace-enclosed initializer");
1673 else
1674 return error_mark_node;
1678 stmt_expr = build_vec_init (exp, NULL_TREE, init,
1679 /*explicit_value_init_p=*/false,
1680 from_array,
1681 complain);
1682 TREE_READONLY (exp) = was_const;
1683 TREE_THIS_VOLATILE (exp) = was_volatile;
1684 TREE_TYPE (exp) = type;
1685 /* Restore the type of init unless it was used directly. */
1686 if (init && TREE_CODE (stmt_expr) != INIT_EXPR)
1687 TREE_TYPE (init) = itype;
1688 return stmt_expr;
1691 if (init && init != void_type_node
1692 && TREE_CODE (init) != TREE_LIST
1693 && !(TREE_CODE (init) == TARGET_EXPR
1694 && TARGET_EXPR_DIRECT_INIT_P (init))
1695 && !DIRECT_LIST_INIT_P (init))
1696 flags |= LOOKUP_ONLYCONVERTING;
1698 if ((VAR_P (exp) || TREE_CODE (exp) == PARM_DECL)
1699 && !lookup_attribute ("warn_unused", TYPE_ATTRIBUTES (type)))
1700 /* Just know that we've seen something for this node. */
1701 TREE_USED (exp) = 1;
1703 is_global = begin_init_stmts (&stmt_expr, &compound_stmt);
1704 destroy_temps = stmts_are_full_exprs_p ();
1705 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
1706 expand_aggr_init_1 (TYPE_BINFO (type), exp, exp,
1707 init, LOOKUP_NORMAL|flags, complain);
1708 stmt_expr = finish_init_stmts (is_global, stmt_expr, compound_stmt);
1709 current_stmt_tree ()->stmts_are_full_exprs_p = destroy_temps;
1710 TREE_READONLY (exp) = was_const;
1711 TREE_THIS_VOLATILE (exp) = was_volatile;
1713 return stmt_expr;
1716 static void
1717 expand_default_init (tree binfo, tree true_exp, tree exp, tree init, int flags,
1718 tsubst_flags_t complain)
1720 tree type = TREE_TYPE (exp);
1722 /* It fails because there may not be a constructor which takes
1723 its own type as the first (or only parameter), but which does
1724 take other types via a conversion. So, if the thing initializing
1725 the expression is a unit element of type X, first try X(X&),
1726 followed by initialization by X. If neither of these work
1727 out, then look hard. */
1728 tree rval;
1729 vec<tree, va_gc> *parms;
1731 /* If we have direct-initialization from an initializer list, pull
1732 it out of the TREE_LIST so the code below can see it. */
1733 if (init && TREE_CODE (init) == TREE_LIST
1734 && DIRECT_LIST_INIT_P (TREE_VALUE (init)))
1736 gcc_checking_assert ((flags & LOOKUP_ONLYCONVERTING) == 0
1737 && TREE_CHAIN (init) == NULL_TREE);
1738 init = TREE_VALUE (init);
1739 /* Only call reshape_init if it has not been called earlier
1740 by the callers. */
1741 if (BRACE_ENCLOSED_INITIALIZER_P (init) && CP_AGGREGATE_TYPE_P (type))
1742 init = reshape_init (type, init, complain);
1745 if (init && BRACE_ENCLOSED_INITIALIZER_P (init)
1746 && CP_AGGREGATE_TYPE_P (type))
1747 /* A brace-enclosed initializer for an aggregate. In C++0x this can
1748 happen for direct-initialization, too. */
1749 init = digest_init (type, init, complain);
1751 /* A CONSTRUCTOR of the target's type is a previously digested
1752 initializer, whether that happened just above or in
1753 cp_parser_late_parsing_nsdmi.
1755 A TARGET_EXPR with TARGET_EXPR_DIRECT_INIT_P or TARGET_EXPR_LIST_INIT_P
1756 set represents the whole initialization, so we shouldn't build up
1757 another ctor call. */
1758 if (init
1759 && (TREE_CODE (init) == CONSTRUCTOR
1760 || (TREE_CODE (init) == TARGET_EXPR
1761 && (TARGET_EXPR_DIRECT_INIT_P (init)
1762 || TARGET_EXPR_LIST_INIT_P (init))))
1763 && same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (init), type))
1765 /* Early initialization via a TARGET_EXPR only works for
1766 complete objects. */
1767 gcc_assert (TREE_CODE (init) == CONSTRUCTOR || true_exp == exp);
1769 init = build2 (INIT_EXPR, TREE_TYPE (exp), exp, init);
1770 TREE_SIDE_EFFECTS (init) = 1;
1771 finish_expr_stmt (init);
1772 return;
1775 if (init && TREE_CODE (init) != TREE_LIST
1776 && (flags & LOOKUP_ONLYCONVERTING))
1778 /* Base subobjects should only get direct-initialization. */
1779 gcc_assert (true_exp == exp);
1781 if (flags & DIRECT_BIND)
1782 /* Do nothing. We hit this in two cases: Reference initialization,
1783 where we aren't initializing a real variable, so we don't want
1784 to run a new constructor; and catching an exception, where we
1785 have already built up the constructor call so we could wrap it
1786 in an exception region. */;
1787 else
1788 init = ocp_convert (type, init, CONV_IMPLICIT|CONV_FORCE_TEMP,
1789 flags, complain);
1791 if (TREE_CODE (init) == MUST_NOT_THROW_EXPR)
1792 /* We need to protect the initialization of a catch parm with a
1793 call to terminate(), which shows up as a MUST_NOT_THROW_EXPR
1794 around the TARGET_EXPR for the copy constructor. See
1795 initialize_handler_parm. */
1797 TREE_OPERAND (init, 0) = build2 (INIT_EXPR, TREE_TYPE (exp), exp,
1798 TREE_OPERAND (init, 0));
1799 TREE_TYPE (init) = void_type_node;
1801 else
1802 init = build2 (INIT_EXPR, TREE_TYPE (exp), exp, init);
1803 TREE_SIDE_EFFECTS (init) = 1;
1804 finish_expr_stmt (init);
1805 return;
1808 if (init == NULL_TREE)
1809 parms = NULL;
1810 else if (TREE_CODE (init) == TREE_LIST && !TREE_TYPE (init))
1812 parms = make_tree_vector ();
1813 for (; init != NULL_TREE; init = TREE_CHAIN (init))
1814 vec_safe_push (parms, TREE_VALUE (init));
1816 else
1817 parms = make_tree_vector_single (init);
1819 if (exp == current_class_ref && current_function_decl
1820 && DECL_HAS_IN_CHARGE_PARM_P (current_function_decl))
1822 /* Delegating constructor. */
1823 tree complete;
1824 tree base;
1825 tree elt; unsigned i;
1827 /* Unshare the arguments for the second call. */
1828 vec<tree, va_gc> *parms2 = make_tree_vector ();
1829 FOR_EACH_VEC_SAFE_ELT (parms, i, elt)
1831 elt = break_out_target_exprs (elt);
1832 vec_safe_push (parms2, elt);
1834 complete = build_special_member_call (exp, complete_ctor_identifier,
1835 &parms2, binfo, flags,
1836 complain);
1837 complete = fold_build_cleanup_point_expr (void_type_node, complete);
1838 release_tree_vector (parms2);
1840 base = build_special_member_call (exp, base_ctor_identifier,
1841 &parms, binfo, flags,
1842 complain);
1843 base = fold_build_cleanup_point_expr (void_type_node, base);
1844 rval = build_if_in_charge (complete, base);
1846 else
1848 tree ctor_name = (true_exp == exp
1849 ? complete_ctor_identifier : base_ctor_identifier);
1851 rval = build_special_member_call (exp, ctor_name, &parms, binfo, flags,
1852 complain);
1855 if (parms != NULL)
1856 release_tree_vector (parms);
1858 if (exp == true_exp && TREE_CODE (rval) == CALL_EXPR)
1860 tree fn = get_callee_fndecl (rval);
1861 if (fn && DECL_DECLARED_CONSTEXPR_P (fn))
1863 tree e = maybe_constant_init (rval, exp);
1864 if (TREE_CONSTANT (e))
1865 rval = build2 (INIT_EXPR, type, exp, e);
1869 /* FIXME put back convert_to_void? */
1870 if (TREE_SIDE_EFFECTS (rval))
1871 finish_expr_stmt (rval);
1874 /* This function is responsible for initializing EXP with INIT
1875 (if any).
1877 BINFO is the binfo of the type for who we are performing the
1878 initialization. For example, if W is a virtual base class of A and B,
1879 and C : A, B.
1880 If we are initializing B, then W must contain B's W vtable, whereas
1881 were we initializing C, W must contain C's W vtable.
1883 TRUE_EXP is nonzero if it is the true expression being initialized.
1884 In this case, it may be EXP, or may just contain EXP. The reason we
1885 need this is because if EXP is a base element of TRUE_EXP, we
1886 don't necessarily know by looking at EXP where its virtual
1887 baseclass fields should really be pointing. But we do know
1888 from TRUE_EXP. In constructors, we don't know anything about
1889 the value being initialized.
1891 FLAGS is just passed to `build_new_method_call'. See that function
1892 for its description. */
1894 static void
1895 expand_aggr_init_1 (tree binfo, tree true_exp, tree exp, tree init, int flags,
1896 tsubst_flags_t complain)
1898 tree type = TREE_TYPE (exp);
1900 gcc_assert (init != error_mark_node && type != error_mark_node);
1901 gcc_assert (building_stmt_list_p ());
1903 /* Use a function returning the desired type to initialize EXP for us.
1904 If the function is a constructor, and its first argument is
1905 NULL_TREE, know that it was meant for us--just slide exp on
1906 in and expand the constructor. Constructors now come
1907 as TARGET_EXPRs. */
1909 if (init && VAR_P (exp)
1910 && COMPOUND_LITERAL_P (init))
1912 vec<tree, va_gc> *cleanups = NULL;
1913 /* If store_init_value returns NULL_TREE, the INIT has been
1914 recorded as the DECL_INITIAL for EXP. That means there's
1915 nothing more we have to do. */
1916 init = store_init_value (exp, init, &cleanups, flags);
1917 if (init)
1918 finish_expr_stmt (init);
1919 gcc_assert (!cleanups);
1920 return;
1923 /* List-initialization from {} becomes value-initialization for non-aggregate
1924 classes with default constructors. Handle this here when we're
1925 initializing a base, so protected access works. */
1926 if (exp != true_exp && init && TREE_CODE (init) == TREE_LIST)
1928 tree elt = TREE_VALUE (init);
1929 if (DIRECT_LIST_INIT_P (elt)
1930 && CONSTRUCTOR_ELTS (elt) == 0
1931 && CLASSTYPE_NON_AGGREGATE (type)
1932 && TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
1933 init = void_type_node;
1936 /* If an explicit -- but empty -- initializer list was present,
1937 that's value-initialization. */
1938 if (init == void_type_node)
1940 /* If the type has data but no user-provided ctor, we need to zero
1941 out the object. */
1942 if (!type_has_user_provided_constructor (type)
1943 && !is_really_empty_class (type))
1945 tree field_size = NULL_TREE;
1946 if (exp != true_exp && CLASSTYPE_AS_BASE (type) != type)
1947 /* Don't clobber already initialized virtual bases. */
1948 field_size = TYPE_SIZE (CLASSTYPE_AS_BASE (type));
1949 init = build_zero_init_1 (type, NULL_TREE, /*static_storage_p=*/false,
1950 field_size);
1951 init = build2 (INIT_EXPR, type, exp, init);
1952 finish_expr_stmt (init);
1955 /* If we don't need to mess with the constructor at all,
1956 then we're done. */
1957 if (! type_build_ctor_call (type))
1958 return;
1960 /* Otherwise fall through and call the constructor. */
1961 init = NULL_TREE;
1964 /* We know that expand_default_init can handle everything we want
1965 at this point. */
1966 expand_default_init (binfo, true_exp, exp, init, flags, complain);
1969 /* Report an error if TYPE is not a user-defined, class type. If
1970 OR_ELSE is nonzero, give an error message. */
1973 is_class_type (tree type, int or_else)
1975 if (type == error_mark_node)
1976 return 0;
1978 if (! CLASS_TYPE_P (type))
1980 if (or_else)
1981 error ("%qT is not a class type", type);
1982 return 0;
1984 return 1;
1987 tree
1988 get_type_value (tree name)
1990 if (name == error_mark_node)
1991 return NULL_TREE;
1993 if (IDENTIFIER_HAS_TYPE_VALUE (name))
1994 return IDENTIFIER_TYPE_VALUE (name);
1995 else
1996 return NULL_TREE;
1999 /* Build a reference to a member of an aggregate. This is not a C++
2000 `&', but really something which can have its address taken, and
2001 then act as a pointer to member, for example TYPE :: FIELD can have
2002 its address taken by saying & TYPE :: FIELD. ADDRESS_P is true if
2003 this expression is the operand of "&".
2005 @@ Prints out lousy diagnostics for operator <typename>
2006 @@ fields.
2008 @@ This function should be rewritten and placed in search.c. */
2010 tree
2011 build_offset_ref (tree type, tree member, bool address_p,
2012 tsubst_flags_t complain)
2014 tree decl;
2015 tree basebinfo = NULL_TREE;
2017 /* class templates can come in as TEMPLATE_DECLs here. */
2018 if (TREE_CODE (member) == TEMPLATE_DECL)
2019 return member;
2021 if (dependent_scope_p (type) || type_dependent_expression_p (member))
2022 return build_qualified_name (NULL_TREE, type, member,
2023 /*template_p=*/false);
2025 gcc_assert (TYPE_P (type));
2026 if (! is_class_type (type, 1))
2027 return error_mark_node;
2029 gcc_assert (DECL_P (member) || BASELINK_P (member));
2030 /* Callers should call mark_used before this point. */
2031 gcc_assert (!DECL_P (member) || TREE_USED (member));
2033 type = TYPE_MAIN_VARIANT (type);
2034 if (!COMPLETE_OR_OPEN_TYPE_P (complete_type (type)))
2036 if (complain & tf_error)
2037 error ("incomplete type %qT does not have member %qD", type, member);
2038 return error_mark_node;
2041 /* Entities other than non-static members need no further
2042 processing. */
2043 if (TREE_CODE (member) == TYPE_DECL)
2044 return member;
2045 if (VAR_P (member) || TREE_CODE (member) == CONST_DECL)
2046 return convert_from_reference (member);
2048 if (TREE_CODE (member) == FIELD_DECL && DECL_C_BIT_FIELD (member))
2050 if (complain & tf_error)
2051 error ("invalid pointer to bit-field %qD", member);
2052 return error_mark_node;
2055 /* Set up BASEBINFO for member lookup. */
2056 decl = maybe_dummy_object (type, &basebinfo);
2058 /* A lot of this logic is now handled in lookup_member. */
2059 if (BASELINK_P (member))
2061 /* Go from the TREE_BASELINK to the member function info. */
2062 tree t = BASELINK_FUNCTIONS (member);
2064 if (TREE_CODE (t) != TEMPLATE_ID_EXPR && !really_overloaded_fn (t))
2066 /* Get rid of a potential OVERLOAD around it. */
2067 t = OVL_FIRST (t);
2069 /* Unique functions are handled easily. */
2071 /* For non-static member of base class, we need a special rule
2072 for access checking [class.protected]:
2074 If the access is to form a pointer to member, the
2075 nested-name-specifier shall name the derived class
2076 (or any class derived from that class). */
2077 bool ok;
2078 if (address_p && DECL_P (t)
2079 && DECL_NONSTATIC_MEMBER_P (t))
2080 ok = perform_or_defer_access_check (TYPE_BINFO (type), t, t,
2081 complain);
2082 else
2083 ok = perform_or_defer_access_check (basebinfo, t, t,
2084 complain);
2085 if (!ok)
2086 return error_mark_node;
2087 if (DECL_STATIC_FUNCTION_P (t))
2088 return t;
2089 member = t;
2091 else
2092 TREE_TYPE (member) = unknown_type_node;
2094 else if (address_p && TREE_CODE (member) == FIELD_DECL)
2096 /* We need additional test besides the one in
2097 check_accessibility_of_qualified_id in case it is
2098 a pointer to non-static member. */
2099 if (!perform_or_defer_access_check (TYPE_BINFO (type), member, member,
2100 complain))
2101 return error_mark_node;
2104 if (!address_p)
2106 /* If MEMBER is non-static, then the program has fallen afoul of
2107 [expr.prim]:
2109 An id-expression that denotes a nonstatic data member or
2110 nonstatic member function of a class can only be used:
2112 -- as part of a class member access (_expr.ref_) in which the
2113 object-expression refers to the member's class or a class
2114 derived from that class, or
2116 -- to form a pointer to member (_expr.unary.op_), or
2118 -- in the body of a nonstatic member function of that class or
2119 of a class derived from that class (_class.mfct.nonstatic_), or
2121 -- in a mem-initializer for a constructor for that class or for
2122 a class derived from that class (_class.base.init_). */
2123 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (member))
2125 /* Build a representation of the qualified name suitable
2126 for use as the operand to "&" -- even though the "&" is
2127 not actually present. */
2128 member = build2 (OFFSET_REF, TREE_TYPE (member), decl, member);
2129 /* In Microsoft mode, treat a non-static member function as if
2130 it were a pointer-to-member. */
2131 if (flag_ms_extensions)
2133 PTRMEM_OK_P (member) = 1;
2134 return cp_build_addr_expr (member, complain);
2136 if (complain & tf_error)
2137 error ("invalid use of non-static member function %qD",
2138 TREE_OPERAND (member, 1));
2139 return error_mark_node;
2141 else if (TREE_CODE (member) == FIELD_DECL)
2143 if (complain & tf_error)
2144 error ("invalid use of non-static data member %qD", member);
2145 return error_mark_node;
2147 return member;
2150 member = build2 (OFFSET_REF, TREE_TYPE (member), decl, member);
2151 PTRMEM_OK_P (member) = 1;
2152 return member;
2155 /* If DECL is a scalar enumeration constant or variable with a
2156 constant initializer, return the initializer (or, its initializers,
2157 recursively); otherwise, return DECL. If STRICT_P, the
2158 initializer is only returned if DECL is a
2159 constant-expression. If RETURN_AGGREGATE_CST_OK_P, it is ok to
2160 return an aggregate constant. */
2162 static tree
2163 constant_value_1 (tree decl, bool strict_p, bool return_aggregate_cst_ok_p)
2165 while (TREE_CODE (decl) == CONST_DECL
2166 || decl_constant_var_p (decl)
2167 || (!strict_p && VAR_P (decl)
2168 && CP_TYPE_CONST_NON_VOLATILE_P (TREE_TYPE (decl))))
2170 tree init;
2171 /* If DECL is a static data member in a template
2172 specialization, we must instantiate it here. The
2173 initializer for the static data member is not processed
2174 until needed; we need it now. */
2175 mark_used (decl, tf_none);
2176 mark_rvalue_use (decl);
2177 init = DECL_INITIAL (decl);
2178 if (init == error_mark_node)
2180 if (TREE_CODE (decl) == CONST_DECL
2181 || DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl))
2182 /* Treat the error as a constant to avoid cascading errors on
2183 excessively recursive template instantiation (c++/9335). */
2184 return init;
2185 else
2186 return decl;
2188 /* Initializers in templates are generally expanded during
2189 instantiation, so before that for const int i(2)
2190 INIT is a TREE_LIST with the actual initializer as
2191 TREE_VALUE. */
2192 if (processing_template_decl
2193 && init
2194 && TREE_CODE (init) == TREE_LIST
2195 && TREE_CHAIN (init) == NULL_TREE)
2196 init = TREE_VALUE (init);
2197 /* Instantiate a non-dependent initializer for user variables. We
2198 mustn't do this for the temporary for an array compound literal;
2199 trying to instatiate the initializer will keep creating new
2200 temporaries until we crash. Probably it's not useful to do it for
2201 other artificial variables, either. */
2202 if (!DECL_ARTIFICIAL (decl))
2203 init = instantiate_non_dependent_or_null (init);
2204 if (!init
2205 || !TREE_TYPE (init)
2206 || !TREE_CONSTANT (init)
2207 || (!return_aggregate_cst_ok_p
2208 /* Unless RETURN_AGGREGATE_CST_OK_P is true, do not
2209 return an aggregate constant (of which string
2210 literals are a special case), as we do not want
2211 to make inadvertent copies of such entities, and
2212 we must be sure that their addresses are the
2213 same everywhere. */
2214 && (TREE_CODE (init) == CONSTRUCTOR
2215 || TREE_CODE (init) == STRING_CST)))
2216 break;
2217 /* Don't return a CONSTRUCTOR for a variable with partial run-time
2218 initialization, since it doesn't represent the entire value. */
2219 if (TREE_CODE (init) == CONSTRUCTOR
2220 && !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl))
2221 break;
2222 /* If the variable has a dynamic initializer, don't use its
2223 DECL_INITIAL which doesn't reflect the real value. */
2224 if (VAR_P (decl)
2225 && TREE_STATIC (decl)
2226 && !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl)
2227 && DECL_NONTRIVIALLY_INITIALIZED_P (decl))
2228 break;
2229 decl = unshare_expr (init);
2231 return decl;
2234 /* If DECL is a CONST_DECL, or a constant VAR_DECL initialized by constant
2235 of integral or enumeration type, or a constexpr variable of scalar type,
2236 then return that value. These are those variables permitted in constant
2237 expressions by [5.19/1]. */
2239 tree
2240 scalar_constant_value (tree decl)
2242 return constant_value_1 (decl, /*strict_p=*/true,
2243 /*return_aggregate_cst_ok_p=*/false);
2246 /* Like scalar_constant_value, but can also return aggregate initializers. */
2248 tree
2249 decl_really_constant_value (tree decl)
2251 return constant_value_1 (decl, /*strict_p=*/true,
2252 /*return_aggregate_cst_ok_p=*/true);
2255 /* A more relaxed version of scalar_constant_value, used by the
2256 common C/C++ code. */
2258 tree
2259 decl_constant_value (tree decl)
2261 return constant_value_1 (decl, /*strict_p=*/processing_template_decl,
2262 /*return_aggregate_cst_ok_p=*/true);
2265 /* Common subroutines of build_new and build_vec_delete. */
2267 /* Build and return a NEW_EXPR. If NELTS is non-NULL, TYPE[NELTS] is
2268 the type of the object being allocated; otherwise, it's just TYPE.
2269 INIT is the initializer, if any. USE_GLOBAL_NEW is true if the
2270 user explicitly wrote "::operator new". PLACEMENT, if non-NULL, is
2271 a vector of arguments to be provided as arguments to a placement
2272 new operator. This routine performs no semantic checks; it just
2273 creates and returns a NEW_EXPR. */
2275 static tree
2276 build_raw_new_expr (vec<tree, va_gc> *placement, tree type, tree nelts,
2277 vec<tree, va_gc> *init, int use_global_new)
2279 tree init_list;
2280 tree new_expr;
2282 /* If INIT is NULL, the we want to store NULL_TREE in the NEW_EXPR.
2283 If INIT is not NULL, then we want to store VOID_ZERO_NODE. This
2284 permits us to distinguish the case of a missing initializer "new
2285 int" from an empty initializer "new int()". */
2286 if (init == NULL)
2287 init_list = NULL_TREE;
2288 else if (init->is_empty ())
2289 init_list = void_node;
2290 else
2291 init_list = build_tree_list_vec (init);
2293 new_expr = build4 (NEW_EXPR, build_pointer_type (type),
2294 build_tree_list_vec (placement), type, nelts,
2295 init_list);
2296 NEW_EXPR_USE_GLOBAL (new_expr) = use_global_new;
2297 TREE_SIDE_EFFECTS (new_expr) = 1;
2299 return new_expr;
2302 /* Diagnose uninitialized const members or reference members of type
2303 TYPE. USING_NEW is used to disambiguate the diagnostic between a
2304 new expression without a new-initializer and a declaration. Returns
2305 the error count. */
2307 static int
2308 diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin,
2309 bool using_new, bool complain)
2311 tree field;
2312 int error_count = 0;
2314 if (type_has_user_provided_constructor (type))
2315 return 0;
2317 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
2319 tree field_type;
2321 if (TREE_CODE (field) != FIELD_DECL)
2322 continue;
2324 field_type = strip_array_types (TREE_TYPE (field));
2326 if (type_has_user_provided_constructor (field_type))
2327 continue;
2329 if (TREE_CODE (field_type) == REFERENCE_TYPE)
2331 ++ error_count;
2332 if (complain)
2334 if (DECL_CONTEXT (field) == origin)
2336 if (using_new)
2337 error ("uninitialized reference member in %q#T "
2338 "using %<new%> without new-initializer", origin);
2339 else
2340 error ("uninitialized reference member in %q#T", origin);
2342 else
2344 if (using_new)
2345 error ("uninitialized reference member in base %q#T "
2346 "of %q#T using %<new%> without new-initializer",
2347 DECL_CONTEXT (field), origin);
2348 else
2349 error ("uninitialized reference member in base %q#T "
2350 "of %q#T", DECL_CONTEXT (field), origin);
2352 inform (DECL_SOURCE_LOCATION (field),
2353 "%q#D should be initialized", field);
2357 if (CP_TYPE_CONST_P (field_type))
2359 ++ error_count;
2360 if (complain)
2362 if (DECL_CONTEXT (field) == origin)
2364 if (using_new)
2365 error ("uninitialized const member in %q#T "
2366 "using %<new%> without new-initializer", origin);
2367 else
2368 error ("uninitialized const member in %q#T", origin);
2370 else
2372 if (using_new)
2373 error ("uninitialized const member in base %q#T "
2374 "of %q#T using %<new%> without new-initializer",
2375 DECL_CONTEXT (field), origin);
2376 else
2377 error ("uninitialized const member in base %q#T "
2378 "of %q#T", DECL_CONTEXT (field), origin);
2380 inform (DECL_SOURCE_LOCATION (field),
2381 "%q#D should be initialized", field);
2385 if (CLASS_TYPE_P (field_type))
2386 error_count
2387 += diagnose_uninitialized_cst_or_ref_member_1 (field_type, origin,
2388 using_new, complain);
2390 return error_count;
2394 diagnose_uninitialized_cst_or_ref_member (tree type, bool using_new, bool complain)
2396 return diagnose_uninitialized_cst_or_ref_member_1 (type, type, using_new, complain);
2399 /* Call __cxa_bad_array_new_length to indicate that the size calculation
2400 overflowed. Pretend it returns sizetype so that it plays nicely in the
2401 COND_EXPR. */
2403 tree
2404 throw_bad_array_new_length (void)
2406 if (!fn)
2408 tree name = get_identifier ("__cxa_throw_bad_array_new_length");
2410 fn = IDENTIFIER_GLOBAL_VALUE (name);
2411 if (!fn)
2412 fn = push_throw_library_fn
2413 (name, build_function_type_list (sizetype, NULL_TREE));
2416 return build_cxx_call (fn, 0, NULL, tf_warning_or_error);
2419 /* Attempt to find the initializer for field T in the initializer INIT,
2420 when non-null. Returns the initializer when successful and NULL
2421 otherwise. */
2422 static tree
2423 find_field_init (tree t, tree init)
2425 if (!init)
2426 return NULL_TREE;
2428 unsigned HOST_WIDE_INT idx;
2429 tree field, elt;
2431 /* Iterate over all top-level initializer elements. */
2432 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (init), idx, field, elt)
2434 /* If the member T is found, return it. */
2435 if (field == t)
2436 return elt;
2438 /* Otherwise continue and/or recurse into nested initializers. */
2439 if (TREE_CODE (elt) == CONSTRUCTOR
2440 && (init = find_field_init (t, elt)))
2441 return init;
2443 return NULL_TREE;
2446 /* Attempt to verify that the argument, OPER, of a placement new expression
2447 refers to an object sufficiently large for an object of TYPE or an array
2448 of NELTS of such objects when NELTS is non-null, and issue a warning when
2449 it does not. SIZE specifies the size needed to construct the object or
2450 array and captures the result of NELTS * sizeof (TYPE). (SIZE could be
2451 greater when the array under construction requires a cookie to store
2452 NELTS. GCC's placement new expression stores the cookie when invoking
2453 a user-defined placement new operator function but not the default one.
2454 Placement new expressions with user-defined placement new operator are
2455 not diagnosed since we don't know how they use the buffer (this could
2456 be a future extension). */
2457 static void
2458 warn_placement_new_too_small (tree type, tree nelts, tree size, tree oper)
2460 location_t loc = EXPR_LOC_OR_LOC (oper, input_location);
2462 /* The number of bytes to add to or subtract from the size of the provided
2463 buffer based on an offset into an array or an array element reference.
2464 Although intermediate results may be negative (as in a[3] - 2) the final
2465 result cannot be. */
2466 HOST_WIDE_INT adjust = 0;
2467 /* True when the size of the entire destination object should be used
2468 to compute the possibly optimistic estimate of the available space. */
2469 bool use_obj_size = false;
2470 /* True when the reference to the destination buffer is an ADDR_EXPR. */
2471 bool addr_expr = false;
2473 STRIP_NOPS (oper);
2475 /* Using a function argument or a (non-array) variable as an argument
2476 to placement new is not checked since it's unknown what it might
2477 point to. */
2478 if (TREE_CODE (oper) == PARM_DECL
2479 || VAR_P (oper)
2480 || TREE_CODE (oper) == COMPONENT_REF)
2481 return;
2483 /* Evaluate any constant expressions. */
2484 size = fold_non_dependent_expr (size);
2486 /* Handle the common case of array + offset expression when the offset
2487 is a constant. */
2488 if (TREE_CODE (oper) == POINTER_PLUS_EXPR)
2490 /* If the offset is comple-time constant, use it to compute a more
2491 accurate estimate of the size of the buffer. Since the operand
2492 of POINTER_PLUS_EXPR is represented as an unsigned type, convert
2493 it to signed first.
2494 Otherwise, use the size of the entire array as an optimistic
2495 estimate (this may lead to false negatives). */
2496 tree adj = TREE_OPERAND (oper, 1);
2497 if (CONSTANT_CLASS_P (adj))
2498 adjust += tree_to_shwi (convert (ssizetype, adj));
2499 else
2500 use_obj_size = true;
2502 oper = TREE_OPERAND (oper, 0);
2504 STRIP_NOPS (oper);
2507 if (TREE_CODE (oper) == TARGET_EXPR)
2508 oper = TREE_OPERAND (oper, 1);
2509 else if (TREE_CODE (oper) == ADDR_EXPR)
2511 addr_expr = true;
2512 oper = TREE_OPERAND (oper, 0);
2515 STRIP_NOPS (oper);
2517 if (TREE_CODE (oper) == ARRAY_REF
2518 && (addr_expr || TREE_CODE (TREE_TYPE (oper)) == ARRAY_TYPE))
2520 /* Similar to the offset computed above, see if the array index
2521 is a compile-time constant. If so, and unless the offset was
2522 not a compile-time constant, use the index to determine the
2523 size of the buffer. Otherwise, use the entire array as
2524 an optimistic estimate of the size. */
2525 const_tree adj = TREE_OPERAND (oper, 1);
2526 if (!use_obj_size && CONSTANT_CLASS_P (adj))
2527 adjust += tree_to_shwi (adj);
2528 else
2530 use_obj_size = true;
2531 adjust = 0;
2534 oper = TREE_OPERAND (oper, 0);
2537 /* Refers to the declared object that constains the subobject referenced
2538 by OPER. When the object is initialized, makes it possible to determine
2539 the actual size of a flexible array member used as the buffer passed
2540 as OPER to placement new. */
2541 tree var_decl = NULL_TREE;
2542 /* True when operand is a COMPONENT_REF, to distinguish flexible array
2543 members from arrays of unspecified size. */
2544 bool compref = TREE_CODE (oper) == COMPONENT_REF;
2546 /* Descend into a struct or union to find the member whose address
2547 is being used as the argument. */
2548 if (TREE_CODE (oper) == COMPONENT_REF)
2550 tree op0 = oper;
2551 while (TREE_CODE (op0 = TREE_OPERAND (op0, 0)) == COMPONENT_REF);
2552 if (VAR_P (op0))
2553 var_decl = op0;
2554 oper = TREE_OPERAND (oper, 1);
2557 if ((addr_expr || !POINTER_TYPE_P (TREE_TYPE (oper)))
2558 && (VAR_P (oper)
2559 || TREE_CODE (oper) == FIELD_DECL
2560 || TREE_CODE (oper) == PARM_DECL))
2562 /* A possibly optimistic estimate of the number of bytes available
2563 in the destination buffer. */
2564 unsigned HOST_WIDE_INT bytes_avail = 0;
2565 /* True when the estimate above is in fact the exact size
2566 of the destination buffer rather than an estimate. */
2567 bool exact_size = true;
2569 /* Treat members of unions and members of structs uniformly, even
2570 though the size of a member of a union may be viewed as extending
2571 to the end of the union itself (it is by __builtin_object_size). */
2572 if ((VAR_P (oper) || use_obj_size)
2573 && DECL_SIZE_UNIT (oper)
2574 && tree_fits_uhwi_p (DECL_SIZE_UNIT (oper)))
2576 /* Use the size of the entire array object when the expression
2577 refers to a variable or its size depends on an expression
2578 that's not a compile-time constant. */
2579 bytes_avail = tree_to_uhwi (DECL_SIZE_UNIT (oper));
2580 exact_size = !use_obj_size;
2582 else if (TYPE_SIZE_UNIT (TREE_TYPE (oper))
2583 && tree_fits_uhwi_p (TYPE_SIZE_UNIT (TREE_TYPE (oper))))
2585 /* Use the size of the type of the destination buffer object
2586 as the optimistic estimate of the available space in it. */
2587 bytes_avail = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (oper)));
2589 else if (var_decl)
2591 /* Constructing into a buffer provided by the flexible array
2592 member of a declared object (which is permitted as a G++
2593 extension). If the array member has been initialized,
2594 determine its size from the initializer. Otherwise,
2595 the array size is zero. */
2596 bytes_avail = 0;
2598 if (tree init = find_field_init (oper, DECL_INITIAL (var_decl)))
2599 bytes_avail = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (init)));
2601 else
2603 /* Bail if neither the size of the object nor its type is known. */
2604 return;
2607 tree_code oper_code = TREE_CODE (TREE_TYPE (oper));
2609 if (compref && oper_code == ARRAY_TYPE)
2611 /* Avoid diagnosing flexible array members (which are accepted
2612 as an extension and diagnosed with -Wpedantic) and zero-length
2613 arrays (also an extension).
2614 Overflowing construction in one-element arrays is diagnosed
2615 only at level 2. */
2616 if (bytes_avail == 0 && !var_decl)
2617 return;
2619 tree nelts = array_type_nelts_top (TREE_TYPE (oper));
2620 tree nelts_cst = maybe_constant_value (nelts);
2621 if (TREE_CODE (nelts_cst) == INTEGER_CST
2622 && integer_onep (nelts_cst)
2623 && !var_decl
2624 && warn_placement_new < 2)
2625 return;
2628 /* The size of the buffer can only be adjusted down but not up. */
2629 gcc_checking_assert (0 <= adjust);
2631 /* Reduce the size of the buffer by the adjustment computed above
2632 from the offset and/or the index into the array. */
2633 if (bytes_avail < static_cast<unsigned HOST_WIDE_INT>(adjust))
2634 bytes_avail = 0;
2635 else
2636 bytes_avail -= adjust;
2638 /* The minimum amount of space needed for the allocation. This
2639 is an optimistic estimate that makes it possible to detect
2640 placement new invocation for some undersize buffers but not
2641 others. */
2642 unsigned HOST_WIDE_INT bytes_need;
2644 if (CONSTANT_CLASS_P (size))
2645 bytes_need = tree_to_uhwi (size);
2646 else if (nelts && CONSTANT_CLASS_P (nelts))
2647 bytes_need = tree_to_uhwi (nelts)
2648 * tree_to_uhwi (TYPE_SIZE_UNIT (type));
2649 else if (tree_fits_uhwi_p (TYPE_SIZE_UNIT (type)))
2650 bytes_need = tree_to_uhwi (TYPE_SIZE_UNIT (type));
2651 else
2653 /* The type is a VLA. */
2654 return;
2657 if (bytes_avail < bytes_need)
2659 if (nelts)
2660 if (CONSTANT_CLASS_P (nelts))
2661 warning_at (loc, OPT_Wplacement_new_,
2662 exact_size ?
2663 "placement new constructing an object of type "
2664 "%<%T [%wu]%> and size %qwu in a region of type %qT "
2665 "and size %qwi"
2666 : "placement new constructing an object of type "
2667 "%<%T [%wu]%> and size %qwu in a region of type %qT "
2668 "and size at most %qwu",
2669 type, tree_to_uhwi (nelts), bytes_need,
2670 TREE_TYPE (oper),
2671 bytes_avail);
2672 else
2673 warning_at (loc, OPT_Wplacement_new_,
2674 exact_size ?
2675 "placement new constructing an array of objects "
2676 "of type %qT and size %qwu in a region of type %qT "
2677 "and size %qwi"
2678 : "placement new constructing an array of objects "
2679 "of type %qT and size %qwu in a region of type %qT "
2680 "and size at most %qwu",
2681 type, bytes_need, TREE_TYPE (oper),
2682 bytes_avail);
2683 else
2684 warning_at (loc, OPT_Wplacement_new_,
2685 exact_size ?
2686 "placement new constructing an object of type %qT "
2687 "and size %qwu in a region of type %qT and size %qwi"
2688 : "placement new constructing an object of type %qT "
2689 "and size %qwu in a region of type %qT and size "
2690 "at most %qwu",
2691 type, bytes_need, TREE_TYPE (oper),
2692 bytes_avail);
2697 /* True if alignof(T) > __STDCPP_DEFAULT_NEW_ALIGNMENT__. */
2699 bool
2700 type_has_new_extended_alignment (tree t)
2702 return (aligned_new_threshold
2703 && TYPE_ALIGN_UNIT (t) > (unsigned)aligned_new_threshold);
2706 /* Return the alignment we expect malloc to guarantee. This should just be
2707 MALLOC_ABI_ALIGNMENT, but that macro defaults to only BITS_PER_WORD for some
2708 reason, so don't let the threshold be smaller than max_align_t_align. */
2710 unsigned
2711 malloc_alignment ()
2713 return MAX (max_align_t_align(), MALLOC_ABI_ALIGNMENT);
2716 /* Determine whether an allocation function is a namespace-scope
2717 non-replaceable placement new function. See DR 1748.
2718 TODO: Enable in all standard modes. */
2719 static bool
2720 std_placement_new_fn_p (tree alloc_fn)
2722 if ((cxx_dialect > cxx14) && DECL_NAMESPACE_SCOPE_P (alloc_fn))
2724 tree first_arg = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (alloc_fn)));
2725 if ((TREE_VALUE (first_arg) == ptr_type_node)
2726 && TREE_CHAIN (first_arg) == void_list_node)
2727 return true;
2729 return false;
2732 /* Generate code for a new-expression, including calling the "operator
2733 new" function, initializing the object, and, if an exception occurs
2734 during construction, cleaning up. The arguments are as for
2735 build_raw_new_expr. This may change PLACEMENT and INIT.
2736 TYPE is the type of the object being constructed, possibly an array
2737 of NELTS elements when NELTS is non-null (in "new T[NELTS]", T may
2738 be an array of the form U[inner], with the whole expression being
2739 "new U[NELTS][inner]"). */
2741 static tree
2742 build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
2743 vec<tree, va_gc> **init, bool globally_qualified_p,
2744 tsubst_flags_t complain)
2746 tree size, rval;
2747 /* True iff this is a call to "operator new[]" instead of just
2748 "operator new". */
2749 bool array_p = false;
2750 /* If ARRAY_P is true, the element type of the array. This is never
2751 an ARRAY_TYPE; for something like "new int[3][4]", the
2752 ELT_TYPE is "int". If ARRAY_P is false, this is the same type as
2753 TYPE. */
2754 tree elt_type;
2755 /* The type of the new-expression. (This type is always a pointer
2756 type.) */
2757 tree pointer_type;
2758 tree non_const_pointer_type;
2759 /* The most significant array bound in int[OUTER_NELTS][inner]. */
2760 tree outer_nelts = NULL_TREE;
2761 /* For arrays with a non-constant number of elements, a bounds checks
2762 on the NELTS parameter to avoid integer overflow at runtime. */
2763 tree outer_nelts_check = NULL_TREE;
2764 bool outer_nelts_from_type = false;
2765 /* Number of the "inner" elements in "new T[OUTER_NELTS][inner]". */
2766 offset_int inner_nelts_count = 1;
2767 tree alloc_call, alloc_expr;
2768 /* Size of the inner array elements (those with constant dimensions). */
2769 offset_int inner_size;
2770 /* The address returned by the call to "operator new". This node is
2771 a VAR_DECL and is therefore reusable. */
2772 tree alloc_node;
2773 tree alloc_fn;
2774 tree cookie_expr, init_expr;
2775 int nothrow, check_new;
2776 /* If non-NULL, the number of extra bytes to allocate at the
2777 beginning of the storage allocated for an array-new expression in
2778 order to store the number of elements. */
2779 tree cookie_size = NULL_TREE;
2780 tree placement_first;
2781 tree placement_expr = NULL_TREE;
2782 /* True if the function we are calling is a placement allocation
2783 function. */
2784 bool placement_allocation_fn_p;
2785 /* True if the storage must be initialized, either by a constructor
2786 or due to an explicit new-initializer. */
2787 bool is_initialized;
2788 /* The address of the thing allocated, not including any cookie. In
2789 particular, if an array cookie is in use, DATA_ADDR is the
2790 address of the first array element. This node is a VAR_DECL, and
2791 is therefore reusable. */
2792 tree data_addr;
2793 tree init_preeval_expr = NULL_TREE;
2794 tree orig_type = type;
2796 if (nelts)
2798 outer_nelts = nelts;
2799 array_p = true;
2801 else if (TREE_CODE (type) == ARRAY_TYPE)
2803 /* Transforms new (T[N]) to new T[N]. The former is a GNU
2804 extension for variable N. (This also covers new T where T is
2805 a VLA typedef.) */
2806 array_p = true;
2807 nelts = array_type_nelts_top (type);
2808 outer_nelts = nelts;
2809 type = TREE_TYPE (type);
2810 outer_nelts_from_type = true;
2813 /* Lots of logic below. depends on whether we have a constant number of
2814 elements, so go ahead and fold it now. */
2815 if (outer_nelts)
2816 outer_nelts = maybe_constant_value (outer_nelts);
2818 /* If our base type is an array, then make sure we know how many elements
2819 it has. */
2820 for (elt_type = type;
2821 TREE_CODE (elt_type) == ARRAY_TYPE;
2822 elt_type = TREE_TYPE (elt_type))
2824 tree inner_nelts = array_type_nelts_top (elt_type);
2825 tree inner_nelts_cst = maybe_constant_value (inner_nelts);
2826 if (TREE_CODE (inner_nelts_cst) == INTEGER_CST)
2828 bool overflow;
2829 offset_int result = wi::mul (wi::to_offset (inner_nelts_cst),
2830 inner_nelts_count, SIGNED, &overflow);
2831 if (overflow)
2833 if (complain & tf_error)
2834 error ("integer overflow in array size");
2835 nelts = error_mark_node;
2837 inner_nelts_count = result;
2839 else
2841 if (complain & tf_error)
2843 error_at (EXPR_LOC_OR_LOC (inner_nelts, input_location),
2844 "array size in new-expression must be constant");
2845 cxx_constant_value(inner_nelts);
2847 nelts = error_mark_node;
2849 if (nelts != error_mark_node)
2850 nelts = cp_build_binary_op (input_location,
2851 MULT_EXPR, nelts,
2852 inner_nelts_cst,
2853 complain);
2856 if (variably_modified_type_p (elt_type, NULL_TREE) && (complain & tf_error))
2858 error ("variably modified type not allowed in new-expression");
2859 return error_mark_node;
2862 if (nelts == error_mark_node)
2863 return error_mark_node;
2865 /* Warn if we performed the (T[N]) to T[N] transformation and N is
2866 variable. */
2867 if (outer_nelts_from_type
2868 && !TREE_CONSTANT (outer_nelts))
2870 if (complain & tf_warning_or_error)
2872 pedwarn (EXPR_LOC_OR_LOC (outer_nelts, input_location), OPT_Wvla,
2873 typedef_variant_p (orig_type)
2874 ? G_("non-constant array new length must be specified "
2875 "directly, not by typedef")
2876 : G_("non-constant array new length must be specified "
2877 "without parentheses around the type-id"));
2879 else
2880 return error_mark_node;
2883 if (VOID_TYPE_P (elt_type))
2885 if (complain & tf_error)
2886 error ("invalid type %<void%> for new");
2887 return error_mark_node;
2890 if (abstract_virtuals_error_sfinae (ACU_NEW, elt_type, complain))
2891 return error_mark_node;
2893 is_initialized = (type_build_ctor_call (elt_type) || *init != NULL);
2895 if (*init == NULL && cxx_dialect < cxx11)
2897 bool maybe_uninitialized_error = false;
2898 /* A program that calls for default-initialization [...] of an
2899 entity of reference type is ill-formed. */
2900 if (CLASSTYPE_REF_FIELDS_NEED_INIT (elt_type))
2901 maybe_uninitialized_error = true;
2903 /* A new-expression that creates an object of type T initializes
2904 that object as follows:
2905 - If the new-initializer is omitted:
2906 -- If T is a (possibly cv-qualified) non-POD class type
2907 (or array thereof), the object is default-initialized (8.5).
2908 [...]
2909 -- Otherwise, the object created has indeterminate
2910 value. If T is a const-qualified type, or a (possibly
2911 cv-qualified) POD class type (or array thereof)
2912 containing (directly or indirectly) a member of
2913 const-qualified type, the program is ill-formed; */
2915 if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (elt_type))
2916 maybe_uninitialized_error = true;
2918 if (maybe_uninitialized_error
2919 && diagnose_uninitialized_cst_or_ref_member (elt_type,
2920 /*using_new=*/true,
2921 complain & tf_error))
2922 return error_mark_node;
2925 if (CP_TYPE_CONST_P (elt_type) && *init == NULL
2926 && default_init_uninitialized_part (elt_type))
2928 if (complain & tf_error)
2929 error ("uninitialized const in %<new%> of %q#T", elt_type);
2930 return error_mark_node;
2933 size = size_in_bytes (elt_type);
2934 if (array_p)
2936 /* Maximum available size in bytes. Half of the address space
2937 minus the cookie size. */
2938 offset_int max_size
2939 = wi::set_bit_in_zero <offset_int> (TYPE_PRECISION (sizetype) - 1);
2940 /* Maximum number of outer elements which can be allocated. */
2941 offset_int max_outer_nelts;
2942 tree max_outer_nelts_tree;
2944 gcc_assert (TREE_CODE (size) == INTEGER_CST);
2945 cookie_size = targetm.cxx.get_cookie_size (elt_type);
2946 gcc_assert (TREE_CODE (cookie_size) == INTEGER_CST);
2947 gcc_checking_assert (wi::ltu_p (wi::to_offset (cookie_size), max_size));
2948 /* Unconditionally subtract the cookie size. This decreases the
2949 maximum object size and is safe even if we choose not to use
2950 a cookie after all. */
2951 max_size -= wi::to_offset (cookie_size);
2952 bool overflow;
2953 inner_size = wi::mul (wi::to_offset (size), inner_nelts_count, SIGNED,
2954 &overflow);
2955 if (overflow || wi::gtu_p (inner_size, max_size))
2957 if (complain & tf_error)
2958 error ("size of array is too large");
2959 return error_mark_node;
2962 max_outer_nelts = wi::udiv_trunc (max_size, inner_size);
2963 max_outer_nelts_tree = wide_int_to_tree (sizetype, max_outer_nelts);
2965 size = size_binop (MULT_EXPR, size, fold_convert (sizetype, nelts));
2967 if (INTEGER_CST == TREE_CODE (outer_nelts))
2969 if (tree_int_cst_lt (max_outer_nelts_tree, outer_nelts))
2971 /* When the array size is constant, check it at compile time
2972 to make sure it doesn't exceed the implementation-defined
2973 maximum, as required by C++ 14 (in C++ 11 this requirement
2974 isn't explicitly stated but it's enforced anyway -- see
2975 grokdeclarator in cp/decl.c). */
2976 if (complain & tf_error)
2977 error ("size of array is too large");
2978 return error_mark_node;
2981 else
2983 /* When a runtime check is necessary because the array size
2984 isn't constant, keep only the top-most seven bits (starting
2985 with the most significant non-zero bit) of the maximum size
2986 to compare the array size against, to simplify encoding the
2987 constant maximum size in the instruction stream. */
2989 unsigned shift = (max_outer_nelts.get_precision ()) - 7
2990 - wi::clz (max_outer_nelts);
2991 max_outer_nelts = (max_outer_nelts >> shift) << shift;
2993 outer_nelts_check = fold_build2 (LE_EXPR, boolean_type_node,
2994 outer_nelts,
2995 max_outer_nelts_tree);
2999 tree align_arg = NULL_TREE;
3000 if (type_has_new_extended_alignment (elt_type))
3001 align_arg = build_int_cst (align_type_node, TYPE_ALIGN_UNIT (elt_type));
3003 alloc_fn = NULL_TREE;
3005 /* If PLACEMENT is a single simple pointer type not passed by
3006 reference, prepare to capture it in a temporary variable. Do
3007 this now, since PLACEMENT will change in the calls below. */
3008 placement_first = NULL_TREE;
3009 if (vec_safe_length (*placement) == 1
3010 && (TYPE_PTR_P (TREE_TYPE ((**placement)[0]))))
3011 placement_first = (**placement)[0];
3013 bool member_new_p = false;
3015 /* Allocate the object. */
3016 tree fnname;
3017 tree fns;
3019 fnname = cp_operator_id (array_p ? VEC_NEW_EXPR : NEW_EXPR);
3021 member_new_p = !globally_qualified_p
3022 && CLASS_TYPE_P (elt_type)
3023 && (array_p
3024 ? TYPE_HAS_ARRAY_NEW_OPERATOR (elt_type)
3025 : TYPE_HAS_NEW_OPERATOR (elt_type));
3027 if (member_new_p)
3029 /* Use a class-specific operator new. */
3030 /* If a cookie is required, add some extra space. */
3031 if (array_p && TYPE_VEC_NEW_USES_COOKIE (elt_type))
3032 size = size_binop (PLUS_EXPR, size, cookie_size);
3033 else
3035 cookie_size = NULL_TREE;
3036 /* No size arithmetic necessary, so the size check is
3037 not needed. */
3038 if (outer_nelts_check != NULL && inner_size == 1)
3039 outer_nelts_check = NULL_TREE;
3041 /* Perform the overflow check. */
3042 tree errval = TYPE_MAX_VALUE (sizetype);
3043 if (cxx_dialect >= cxx11 && flag_exceptions)
3044 errval = throw_bad_array_new_length ();
3045 if (outer_nelts_check != NULL_TREE)
3046 size = fold_build3 (COND_EXPR, sizetype, outer_nelts_check,
3047 size, errval);
3048 /* Create the argument list. */
3049 vec_safe_insert (*placement, 0, size);
3050 /* Do name-lookup to find the appropriate operator. */
3051 fns = lookup_fnfields (elt_type, fnname, /*protect=*/2);
3052 if (fns == NULL_TREE)
3054 if (complain & tf_error)
3055 error ("no suitable %qD found in class %qT", fnname, elt_type);
3056 return error_mark_node;
3058 if (TREE_CODE (fns) == TREE_LIST)
3060 if (complain & tf_error)
3062 error ("request for member %qD is ambiguous", fnname);
3063 print_candidates (fns);
3065 return error_mark_node;
3067 tree dummy = build_dummy_object (elt_type);
3068 alloc_call = NULL_TREE;
3069 if (align_arg)
3071 vec<tree, va_gc> *align_args
3072 = vec_copy_and_insert (*placement, align_arg, 1);
3073 alloc_call
3074 = build_new_method_call (dummy, fns, &align_args,
3075 /*conversion_path=*/NULL_TREE,
3076 LOOKUP_NORMAL, &alloc_fn, tf_none);
3077 /* If no matching function is found and the allocated object type
3078 has new-extended alignment, the alignment argument is removed
3079 from the argument list, and overload resolution is performed
3080 again. */
3081 if (alloc_call == error_mark_node)
3082 alloc_call = NULL_TREE;
3084 if (!alloc_call)
3085 alloc_call = build_new_method_call (dummy, fns, placement,
3086 /*conversion_path=*/NULL_TREE,
3087 LOOKUP_NORMAL,
3088 &alloc_fn, complain);
3090 else
3092 /* Use a global operator new. */
3093 /* See if a cookie might be required. */
3094 if (!(array_p && TYPE_VEC_NEW_USES_COOKIE (elt_type)))
3096 cookie_size = NULL_TREE;
3097 /* No size arithmetic necessary, so the size check is
3098 not needed. */
3099 if (outer_nelts_check != NULL && inner_size == 1)
3100 outer_nelts_check = NULL_TREE;
3103 alloc_call = build_operator_new_call (fnname, placement,
3104 &size, &cookie_size,
3105 align_arg, outer_nelts_check,
3106 &alloc_fn, complain);
3109 if (alloc_call == error_mark_node)
3110 return error_mark_node;
3112 gcc_assert (alloc_fn != NULL_TREE);
3114 /* Now, check to see if this function is actually a placement
3115 allocation function. This can happen even when PLACEMENT is NULL
3116 because we might have something like:
3118 struct S { void* operator new (size_t, int i = 0); };
3120 A call to `new S' will get this allocation function, even though
3121 there is no explicit placement argument. If there is more than
3122 one argument, or there are variable arguments, then this is a
3123 placement allocation function. */
3124 placement_allocation_fn_p
3125 = (type_num_arguments (TREE_TYPE (alloc_fn)) > 1
3126 || varargs_function_p (alloc_fn));
3128 if (warn_aligned_new
3129 && !placement_allocation_fn_p
3130 && TYPE_ALIGN (elt_type) > malloc_alignment ()
3131 && (warn_aligned_new > 1
3132 || CP_DECL_CONTEXT (alloc_fn) == global_namespace)
3133 && !aligned_allocation_fn_p (alloc_fn))
3135 if (warning (OPT_Waligned_new_, "%<new%> of type %qT with extended "
3136 "alignment %d", elt_type, TYPE_ALIGN_UNIT (elt_type)))
3138 inform (input_location, "uses %qD, which does not have an alignment "
3139 "parameter", alloc_fn);
3140 if (!aligned_new_threshold)
3141 inform (input_location, "use %<-faligned-new%> to enable C++17 "
3142 "over-aligned new support");
3146 /* If we found a simple case of PLACEMENT_EXPR above, then copy it
3147 into a temporary variable. */
3148 if (!processing_template_decl
3149 && TREE_CODE (alloc_call) == CALL_EXPR
3150 && call_expr_nargs (alloc_call) == 2
3151 && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (alloc_call, 0))) == INTEGER_TYPE
3152 && TYPE_PTR_P (TREE_TYPE (CALL_EXPR_ARG (alloc_call, 1))))
3154 tree placement = CALL_EXPR_ARG (alloc_call, 1);
3156 if (placement_first != NULL_TREE
3157 && (INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (TREE_TYPE (placement)))
3158 || VOID_TYPE_P (TREE_TYPE (TREE_TYPE (placement)))))
3160 placement_expr = get_target_expr (placement_first);
3161 CALL_EXPR_ARG (alloc_call, 1)
3162 = fold_convert (TREE_TYPE (placement), placement_expr);
3165 if (!member_new_p
3166 && VOID_TYPE_P (TREE_TYPE (TREE_TYPE (CALL_EXPR_ARG (alloc_call, 1)))))
3168 /* Attempt to make the warning point at the operator new argument. */
3169 if (placement_first)
3170 placement = placement_first;
3172 warn_placement_new_too_small (orig_type, nelts, size, placement);
3176 /* In the simple case, we can stop now. */
3177 pointer_type = build_pointer_type (type);
3178 if (!cookie_size && !is_initialized)
3179 return build_nop (pointer_type, alloc_call);
3181 /* Store the result of the allocation call in a variable so that we can
3182 use it more than once. */
3183 alloc_expr = get_target_expr (alloc_call);
3184 alloc_node = TARGET_EXPR_SLOT (alloc_expr);
3186 /* Strip any COMPOUND_EXPRs from ALLOC_CALL. */
3187 while (TREE_CODE (alloc_call) == COMPOUND_EXPR)
3188 alloc_call = TREE_OPERAND (alloc_call, 1);
3190 /* Preevaluate the placement args so that we don't reevaluate them for a
3191 placement delete. */
3192 if (placement_allocation_fn_p)
3194 tree inits;
3195 stabilize_call (alloc_call, &inits);
3196 if (inits)
3197 alloc_expr = build2 (COMPOUND_EXPR, TREE_TYPE (alloc_expr), inits,
3198 alloc_expr);
3201 /* unless an allocation function is declared with an empty excep-
3202 tion-specification (_except.spec_), throw(), it indicates failure to
3203 allocate storage by throwing a bad_alloc exception (clause _except_,
3204 _lib.bad.alloc_); it returns a non-null pointer otherwise If the allo-
3205 cation function is declared with an empty exception-specification,
3206 throw(), it returns null to indicate failure to allocate storage and a
3207 non-null pointer otherwise.
3209 So check for a null exception spec on the op new we just called. */
3211 nothrow = TYPE_NOTHROW_P (TREE_TYPE (alloc_fn));
3212 check_new
3213 = flag_check_new || (nothrow && !std_placement_new_fn_p (alloc_fn));
3215 if (cookie_size)
3217 tree cookie;
3218 tree cookie_ptr;
3219 tree size_ptr_type;
3221 /* Adjust so we're pointing to the start of the object. */
3222 data_addr = fold_build_pointer_plus (alloc_node, cookie_size);
3224 /* Store the number of bytes allocated so that we can know how
3225 many elements to destroy later. We use the last sizeof
3226 (size_t) bytes to store the number of elements. */
3227 cookie_ptr = size_binop (MINUS_EXPR, cookie_size, size_in_bytes (sizetype));
3228 cookie_ptr = fold_build_pointer_plus_loc (input_location,
3229 alloc_node, cookie_ptr);
3230 size_ptr_type = build_pointer_type (sizetype);
3231 cookie_ptr = fold_convert (size_ptr_type, cookie_ptr);
3232 cookie = cp_build_indirect_ref (cookie_ptr, RO_NULL, complain);
3234 cookie_expr = build2 (MODIFY_EXPR, sizetype, cookie, nelts);
3236 if (targetm.cxx.cookie_has_size ())
3238 /* Also store the element size. */
3239 cookie_ptr = fold_build_pointer_plus (cookie_ptr,
3240 fold_build1_loc (input_location,
3241 NEGATE_EXPR, sizetype,
3242 size_in_bytes (sizetype)));
3244 cookie = cp_build_indirect_ref (cookie_ptr, RO_NULL, complain);
3245 cookie = build2 (MODIFY_EXPR, sizetype, cookie,
3246 size_in_bytes (elt_type));
3247 cookie_expr = build2 (COMPOUND_EXPR, TREE_TYPE (cookie_expr),
3248 cookie, cookie_expr);
3251 else
3253 cookie_expr = NULL_TREE;
3254 data_addr = alloc_node;
3257 /* Now use a pointer to the type we've actually allocated. */
3259 /* But we want to operate on a non-const version to start with,
3260 since we'll be modifying the elements. */
3261 non_const_pointer_type = build_pointer_type
3262 (cp_build_qualified_type (type, cp_type_quals (type) & ~TYPE_QUAL_CONST));
3264 data_addr = fold_convert (non_const_pointer_type, data_addr);
3265 /* Any further uses of alloc_node will want this type, too. */
3266 alloc_node = fold_convert (non_const_pointer_type, alloc_node);
3268 /* Now initialize the allocated object. Note that we preevaluate the
3269 initialization expression, apart from the actual constructor call or
3270 assignment--we do this because we want to delay the allocation as long
3271 as possible in order to minimize the size of the exception region for
3272 placement delete. */
3273 if (is_initialized)
3275 bool stable;
3276 bool explicit_value_init_p = false;
3278 if (*init != NULL && (*init)->is_empty ())
3280 *init = NULL;
3281 explicit_value_init_p = true;
3284 if (processing_template_decl && explicit_value_init_p)
3286 /* build_value_init doesn't work in templates, and we don't need
3287 the initializer anyway since we're going to throw it away and
3288 rebuild it at instantiation time, so just build up a single
3289 constructor call to get any appropriate diagnostics. */
3290 init_expr = cp_build_indirect_ref (data_addr, RO_NULL, complain);
3291 if (type_build_ctor_call (elt_type))
3292 init_expr = build_special_member_call (init_expr,
3293 complete_ctor_identifier,
3294 init, elt_type,
3295 LOOKUP_NORMAL,
3296 complain);
3297 stable = stabilize_init (init_expr, &init_preeval_expr);
3299 else if (array_p)
3301 tree vecinit = NULL_TREE;
3302 if (vec_safe_length (*init) == 1
3303 && DIRECT_LIST_INIT_P ((**init)[0]))
3305 vecinit = (**init)[0];
3306 if (CONSTRUCTOR_NELTS (vecinit) == 0)
3307 /* List-value-initialization, leave it alone. */;
3308 else
3310 tree arraytype, domain;
3311 if (TREE_CONSTANT (nelts))
3312 domain = compute_array_index_type (NULL_TREE, nelts,
3313 complain);
3314 else
3315 /* We'll check the length at runtime. */
3316 domain = NULL_TREE;
3317 arraytype = build_cplus_array_type (type, domain);
3318 vecinit = digest_init (arraytype, vecinit, complain);
3321 else if (*init)
3323 if (complain & tf_error)
3324 permerror (input_location,
3325 "parenthesized initializer in array new");
3326 else
3327 return error_mark_node;
3328 vecinit = build_tree_list_vec (*init);
3330 init_expr
3331 = build_vec_init (data_addr,
3332 cp_build_binary_op (input_location,
3333 MINUS_EXPR, outer_nelts,
3334 integer_one_node,
3335 complain),
3336 vecinit,
3337 explicit_value_init_p,
3338 /*from_array=*/0,
3339 complain);
3341 /* An array initialization is stable because the initialization
3342 of each element is a full-expression, so the temporaries don't
3343 leak out. */
3344 stable = true;
3346 else
3348 init_expr = cp_build_indirect_ref (data_addr, RO_NULL, complain);
3350 if (type_build_ctor_call (type) && !explicit_value_init_p)
3352 init_expr = build_special_member_call (init_expr,
3353 complete_ctor_identifier,
3354 init, elt_type,
3355 LOOKUP_NORMAL,
3356 complain);
3358 else if (explicit_value_init_p)
3360 /* Something like `new int()'. NO_CLEANUP is needed so
3361 we don't try and build a (possibly ill-formed)
3362 destructor. */
3363 tree val = build_value_init (type, complain | tf_no_cleanup);
3364 if (val == error_mark_node)
3365 return error_mark_node;
3366 init_expr = build2 (INIT_EXPR, type, init_expr, val);
3368 else
3370 tree ie;
3372 /* We are processing something like `new int (10)', which
3373 means allocate an int, and initialize it with 10. */
3375 ie = build_x_compound_expr_from_vec (*init, "new initializer",
3376 complain);
3377 init_expr = cp_build_modify_expr (input_location, init_expr,
3378 INIT_EXPR, ie, complain);
3380 /* If the initializer uses C++14 aggregate NSDMI that refer to the
3381 object being initialized, replace them now and don't try to
3382 preevaluate. */
3383 bool had_placeholder = false;
3384 if (!processing_template_decl
3385 && TREE_CODE (init_expr) == INIT_EXPR)
3386 TREE_OPERAND (init_expr, 1)
3387 = replace_placeholders (TREE_OPERAND (init_expr, 1),
3388 TREE_OPERAND (init_expr, 0),
3389 &had_placeholder);
3390 stable = (!had_placeholder
3391 && stabilize_init (init_expr, &init_preeval_expr));
3394 if (init_expr == error_mark_node)
3395 return error_mark_node;
3397 /* If any part of the object initialization terminates by throwing an
3398 exception and a suitable deallocation function can be found, the
3399 deallocation function is called to free the memory in which the
3400 object was being constructed, after which the exception continues
3401 to propagate in the context of the new-expression. If no
3402 unambiguous matching deallocation function can be found,
3403 propagating the exception does not cause the object's memory to be
3404 freed. */
3405 if (flag_exceptions)
3407 enum tree_code dcode = array_p ? VEC_DELETE_EXPR : DELETE_EXPR;
3408 tree cleanup;
3410 /* The Standard is unclear here, but the right thing to do
3411 is to use the same method for finding deallocation
3412 functions that we use for finding allocation functions. */
3413 cleanup = (build_op_delete_call
3414 (dcode,
3415 alloc_node,
3416 size,
3417 globally_qualified_p,
3418 placement_allocation_fn_p ? alloc_call : NULL_TREE,
3419 alloc_fn,
3420 complain));
3422 if (!cleanup)
3423 /* We're done. */;
3424 else if (stable)
3425 /* This is much simpler if we were able to preevaluate all of
3426 the arguments to the constructor call. */
3428 /* CLEANUP is compiler-generated, so no diagnostics. */
3429 TREE_NO_WARNING (cleanup) = true;
3430 init_expr = build2 (TRY_CATCH_EXPR, void_type_node,
3431 init_expr, cleanup);
3432 /* Likewise, this try-catch is compiler-generated. */
3433 TREE_NO_WARNING (init_expr) = true;
3435 else
3436 /* Ack! First we allocate the memory. Then we set our sentry
3437 variable to true, and expand a cleanup that deletes the
3438 memory if sentry is true. Then we run the constructor, and
3439 finally clear the sentry.
3441 We need to do this because we allocate the space first, so
3442 if there are any temporaries with cleanups in the
3443 constructor args and we weren't able to preevaluate them, we
3444 need this EH region to extend until end of full-expression
3445 to preserve nesting. */
3447 tree end, sentry, begin;
3449 begin = get_target_expr (boolean_true_node);
3450 CLEANUP_EH_ONLY (begin) = 1;
3452 sentry = TARGET_EXPR_SLOT (begin);
3454 /* CLEANUP is compiler-generated, so no diagnostics. */
3455 TREE_NO_WARNING (cleanup) = true;
3457 TARGET_EXPR_CLEANUP (begin)
3458 = build3 (COND_EXPR, void_type_node, sentry,
3459 cleanup, void_node);
3461 end = build2 (MODIFY_EXPR, TREE_TYPE (sentry),
3462 sentry, boolean_false_node);
3464 init_expr
3465 = build2 (COMPOUND_EXPR, void_type_node, begin,
3466 build2 (COMPOUND_EXPR, void_type_node, init_expr,
3467 end));
3468 /* Likewise, this is compiler-generated. */
3469 TREE_NO_WARNING (init_expr) = true;
3473 else
3474 init_expr = NULL_TREE;
3476 /* Now build up the return value in reverse order. */
3478 rval = data_addr;
3480 if (init_expr)
3481 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), init_expr, rval);
3482 if (cookie_expr)
3483 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), cookie_expr, rval);
3485 if (rval == data_addr)
3486 /* If we don't have an initializer or a cookie, strip the TARGET_EXPR
3487 and return the call (which doesn't need to be adjusted). */
3488 rval = TARGET_EXPR_INITIAL (alloc_expr);
3489 else
3491 if (check_new)
3493 tree ifexp = cp_build_binary_op (input_location,
3494 NE_EXPR, alloc_node,
3495 nullptr_node,
3496 complain);
3497 rval = build_conditional_expr (input_location, ifexp, rval,
3498 alloc_node, complain);
3501 /* Perform the allocation before anything else, so that ALLOC_NODE
3502 has been initialized before we start using it. */
3503 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), alloc_expr, rval);
3506 if (init_preeval_expr)
3507 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), init_preeval_expr, rval);
3509 /* A new-expression is never an lvalue. */
3510 gcc_assert (!obvalue_p (rval));
3512 return convert (pointer_type, rval);
3515 /* Generate a representation for a C++ "new" expression. *PLACEMENT
3516 is a vector of placement-new arguments (or NULL if none). If NELTS
3517 is NULL, TYPE is the type of the storage to be allocated. If NELTS
3518 is not NULL, then this is an array-new allocation; TYPE is the type
3519 of the elements in the array and NELTS is the number of elements in
3520 the array. *INIT, if non-NULL, is the initializer for the new
3521 object, or an empty vector to indicate an initializer of "()". If
3522 USE_GLOBAL_NEW is true, then the user explicitly wrote "::new"
3523 rather than just "new". This may change PLACEMENT and INIT. */
3525 tree
3526 build_new (vec<tree, va_gc> **placement, tree type, tree nelts,
3527 vec<tree, va_gc> **init, int use_global_new, tsubst_flags_t complain)
3529 tree rval;
3530 vec<tree, va_gc> *orig_placement = NULL;
3531 tree orig_nelts = NULL_TREE;
3532 vec<tree, va_gc> *orig_init = NULL;
3534 if (type == error_mark_node)
3535 return error_mark_node;
3537 if (nelts == NULL_TREE
3538 /* Don't do auto deduction where it might affect mangling. */
3539 && (!processing_template_decl || at_function_scope_p ()))
3541 tree auto_node = type_uses_auto (type);
3542 if (auto_node)
3544 tree d_init = NULL_TREE;
3545 if (vec_safe_length (*init) == 1)
3547 d_init = (**init)[0];
3548 d_init = resolve_nondeduced_context (d_init, complain);
3550 type = do_auto_deduction (type, d_init, auto_node);
3554 if (processing_template_decl)
3556 if (dependent_type_p (type)
3557 || any_type_dependent_arguments_p (*placement)
3558 || (nelts && type_dependent_expression_p (nelts))
3559 || (nelts && *init)
3560 || any_type_dependent_arguments_p (*init))
3561 return build_raw_new_expr (*placement, type, nelts, *init,
3562 use_global_new);
3564 orig_placement = make_tree_vector_copy (*placement);
3565 orig_nelts = nelts;
3566 if (*init)
3568 orig_init = make_tree_vector_copy (*init);
3569 /* Also copy any CONSTRUCTORs in *init, since reshape_init and
3570 digest_init clobber them in place. */
3571 for (unsigned i = 0; i < orig_init->length(); ++i)
3573 tree e = (**init)[i];
3574 if (TREE_CODE (e) == CONSTRUCTOR)
3575 (**init)[i] = copy_node (e);
3579 make_args_non_dependent (*placement);
3580 if (nelts)
3581 nelts = build_non_dependent_expr (nelts);
3582 make_args_non_dependent (*init);
3585 if (nelts)
3587 if (!build_expr_type_conversion (WANT_INT | WANT_ENUM, nelts, false))
3589 if (complain & tf_error)
3590 permerror (input_location, "size in array new must have integral type");
3591 else
3592 return error_mark_node;
3595 /* Try to determine the constant value only for the purposes
3596 of the diagnostic below but continue to use the original
3597 value and handle const folding later. */
3598 const_tree cst_nelts = maybe_constant_value (nelts);
3600 /* The expression in a noptr-new-declarator is erroneous if it's of
3601 non-class type and its value before converting to std::size_t is
3602 less than zero. ... If the expression is a constant expression,
3603 the program is ill-fomed. */
3604 if (INTEGER_CST == TREE_CODE (cst_nelts)
3605 && tree_int_cst_sgn (cst_nelts) == -1)
3607 if (complain & tf_error)
3608 error ("size of array is negative");
3609 return error_mark_node;
3612 nelts = mark_rvalue_use (nelts);
3613 nelts = cp_save_expr (cp_convert (sizetype, nelts, complain));
3616 /* ``A reference cannot be created by the new operator. A reference
3617 is not an object (8.2.2, 8.4.3), so a pointer to it could not be
3618 returned by new.'' ARM 5.3.3 */
3619 if (TREE_CODE (type) == REFERENCE_TYPE)
3621 if (complain & tf_error)
3622 error ("new cannot be applied to a reference type");
3623 else
3624 return error_mark_node;
3625 type = TREE_TYPE (type);
3628 if (TREE_CODE (type) == FUNCTION_TYPE)
3630 if (complain & tf_error)
3631 error ("new cannot be applied to a function type");
3632 return error_mark_node;
3635 /* The type allocated must be complete. If the new-type-id was
3636 "T[N]" then we are just checking that "T" is complete here, but
3637 that is equivalent, since the value of "N" doesn't matter. */
3638 if (!complete_type_or_maybe_complain (type, NULL_TREE, complain))
3639 return error_mark_node;
3641 rval = build_new_1 (placement, type, nelts, init, use_global_new, complain);
3642 if (rval == error_mark_node)
3643 return error_mark_node;
3645 if (processing_template_decl)
3647 tree ret = build_raw_new_expr (orig_placement, type, orig_nelts,
3648 orig_init, use_global_new);
3649 release_tree_vector (orig_placement);
3650 release_tree_vector (orig_init);
3651 return ret;
3654 /* Wrap it in a NOP_EXPR so warn_if_unused_value doesn't complain. */
3655 rval = build1 (NOP_EXPR, TREE_TYPE (rval), rval);
3656 TREE_NO_WARNING (rval) = 1;
3658 return rval;
3661 static tree
3662 build_vec_delete_1 (tree base, tree maxindex, tree type,
3663 special_function_kind auto_delete_vec,
3664 int use_global_delete, tsubst_flags_t complain)
3666 tree virtual_size;
3667 tree ptype = build_pointer_type (type = complete_type (type));
3668 tree size_exp;
3670 /* Temporary variables used by the loop. */
3671 tree tbase, tbase_init;
3673 /* This is the body of the loop that implements the deletion of a
3674 single element, and moves temp variables to next elements. */
3675 tree body;
3677 /* This is the LOOP_EXPR that governs the deletion of the elements. */
3678 tree loop = 0;
3680 /* This is the thing that governs what to do after the loop has run. */
3681 tree deallocate_expr = 0;
3683 /* This is the BIND_EXPR which holds the outermost iterator of the
3684 loop. It is convenient to set this variable up and test it before
3685 executing any other code in the loop.
3686 This is also the containing expression returned by this function. */
3687 tree controller = NULL_TREE;
3688 tree tmp;
3690 /* We should only have 1-D arrays here. */
3691 gcc_assert (TREE_CODE (type) != ARRAY_TYPE);
3693 if (base == error_mark_node || maxindex == error_mark_node)
3694 return error_mark_node;
3696 if (!COMPLETE_TYPE_P (type))
3698 if ((complain & tf_warning)
3699 && warning (OPT_Wdelete_incomplete,
3700 "possible problem detected in invocation of "
3701 "delete [] operator:"))
3703 cxx_incomplete_type_diagnostic (base, type, DK_WARNING);
3704 inform (input_location, "neither the destructor nor the "
3705 "class-specific operator delete [] will be called, "
3706 "even if they are declared when the class is defined");
3708 /* This size won't actually be used. */
3709 size_exp = size_one_node;
3710 goto no_destructor;
3713 size_exp = size_in_bytes (type);
3715 if (! MAYBE_CLASS_TYPE_P (type))
3716 goto no_destructor;
3717 else if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
3719 /* Make sure the destructor is callable. */
3720 if (type_build_dtor_call (type))
3722 tmp = build_delete (ptype, base, sfk_complete_destructor,
3723 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1,
3724 complain);
3725 if (tmp == error_mark_node)
3726 return error_mark_node;
3728 goto no_destructor;
3731 /* The below is short by the cookie size. */
3732 virtual_size = size_binop (MULT_EXPR, size_exp,
3733 fold_convert (sizetype, maxindex));
3735 tbase = create_temporary_var (ptype);
3736 tbase_init
3737 = cp_build_modify_expr (input_location, tbase, NOP_EXPR,
3738 fold_build_pointer_plus_loc (input_location,
3739 fold_convert (ptype,
3740 base),
3741 virtual_size),
3742 complain);
3743 if (tbase_init == error_mark_node)
3744 return error_mark_node;
3745 controller = build3 (BIND_EXPR, void_type_node, tbase,
3746 NULL_TREE, NULL_TREE);
3747 TREE_SIDE_EFFECTS (controller) = 1;
3749 body = build1 (EXIT_EXPR, void_type_node,
3750 build2 (EQ_EXPR, boolean_type_node, tbase,
3751 fold_convert (ptype, base)));
3752 tmp = fold_build1_loc (input_location, NEGATE_EXPR, sizetype, size_exp);
3753 tmp = fold_build_pointer_plus (tbase, tmp);
3754 tmp = cp_build_modify_expr (input_location, tbase, NOP_EXPR, tmp, complain);
3755 if (tmp == error_mark_node)
3756 return error_mark_node;
3757 body = build_compound_expr (input_location, body, tmp);
3758 tmp = build_delete (ptype, tbase, sfk_complete_destructor,
3759 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1,
3760 complain);
3761 if (tmp == error_mark_node)
3762 return error_mark_node;
3763 body = build_compound_expr (input_location, body, tmp);
3765 loop = build1 (LOOP_EXPR, void_type_node, body);
3766 loop = build_compound_expr (input_location, tbase_init, loop);
3768 no_destructor:
3769 /* Delete the storage if appropriate. */
3770 if (auto_delete_vec == sfk_deleting_destructor)
3772 tree base_tbd;
3774 /* The below is short by the cookie size. */
3775 virtual_size = size_binop (MULT_EXPR, size_exp,
3776 fold_convert (sizetype, maxindex));
3778 if (! TYPE_VEC_NEW_USES_COOKIE (type))
3779 /* no header */
3780 base_tbd = base;
3781 else
3783 tree cookie_size;
3785 cookie_size = targetm.cxx.get_cookie_size (type);
3786 base_tbd = cp_build_binary_op (input_location,
3787 MINUS_EXPR,
3788 cp_convert (string_type_node,
3789 base, complain),
3790 cookie_size,
3791 complain);
3792 if (base_tbd == error_mark_node)
3793 return error_mark_node;
3794 base_tbd = cp_convert (ptype, base_tbd, complain);
3795 /* True size with header. */
3796 virtual_size = size_binop (PLUS_EXPR, virtual_size, cookie_size);
3799 deallocate_expr = build_op_delete_call (VEC_DELETE_EXPR,
3800 base_tbd, virtual_size,
3801 use_global_delete & 1,
3802 /*placement=*/NULL_TREE,
3803 /*alloc_fn=*/NULL_TREE,
3804 complain);
3807 body = loop;
3808 if (!deallocate_expr)
3810 else if (!body)
3811 body = deallocate_expr;
3812 else
3813 /* The delete operator mist be called, even if a destructor
3814 throws. */
3815 body = build2 (TRY_FINALLY_EXPR, void_type_node, body, deallocate_expr);
3817 if (!body)
3818 body = integer_zero_node;
3820 /* Outermost wrapper: If pointer is null, punt. */
3821 tree cond = build2_loc (input_location, NE_EXPR, boolean_type_node, base,
3822 fold_convert (TREE_TYPE (base), nullptr_node));
3823 /* This is a compiler generated comparison, don't emit
3824 e.g. -Wnonnull-compare warning for it. */
3825 TREE_NO_WARNING (cond) = 1;
3826 body = build3_loc (input_location, COND_EXPR, void_type_node,
3827 cond, body, integer_zero_node);
3828 COND_EXPR_IS_VEC_DELETE (body) = true;
3829 body = build1 (NOP_EXPR, void_type_node, body);
3831 if (controller)
3833 TREE_OPERAND (controller, 1) = body;
3834 body = controller;
3837 if (TREE_CODE (base) == SAVE_EXPR)
3838 /* Pre-evaluate the SAVE_EXPR outside of the BIND_EXPR. */
3839 body = build2 (COMPOUND_EXPR, void_type_node, base, body);
3841 return convert_to_void (body, ICV_CAST, complain);
3844 /* Create an unnamed variable of the indicated TYPE. */
3846 tree
3847 create_temporary_var (tree type)
3849 tree decl;
3851 decl = build_decl (input_location,
3852 VAR_DECL, NULL_TREE, type);
3853 TREE_USED (decl) = 1;
3854 DECL_ARTIFICIAL (decl) = 1;
3855 DECL_IGNORED_P (decl) = 1;
3856 DECL_CONTEXT (decl) = current_function_decl;
3858 return decl;
3861 /* Create a new temporary variable of the indicated TYPE, initialized
3862 to INIT.
3864 It is not entered into current_binding_level, because that breaks
3865 things when it comes time to do final cleanups (which take place
3866 "outside" the binding contour of the function). */
3868 tree
3869 get_temp_regvar (tree type, tree init)
3871 tree decl;
3873 decl = create_temporary_var (type);
3874 add_decl_expr (decl);
3876 finish_expr_stmt (cp_build_modify_expr (input_location, decl, INIT_EXPR,
3877 init, tf_warning_or_error));
3879 return decl;
3882 /* Subroutine of build_vec_init. Returns true if assigning to an array of
3883 INNER_ELT_TYPE from INIT is trivial. */
3885 static bool
3886 vec_copy_assign_is_trivial (tree inner_elt_type, tree init)
3888 tree fromtype = inner_elt_type;
3889 if (lvalue_p (init))
3890 fromtype = cp_build_reference_type (fromtype, /*rval*/false);
3891 return is_trivially_xible (MODIFY_EXPR, inner_elt_type, fromtype);
3894 /* Subroutine of build_vec_init: Check that the array has at least N
3895 elements. Other parameters are local variables in build_vec_init. */
3897 void
3898 finish_length_check (tree atype, tree iterator, tree obase, unsigned n)
3900 tree nelts = build_int_cst (ptrdiff_type_node, n - 1);
3901 if (TREE_CODE (atype) != ARRAY_TYPE)
3903 if (flag_exceptions)
3905 tree c = fold_build2 (LT_EXPR, boolean_type_node, iterator,
3906 nelts);
3907 c = build3 (COND_EXPR, void_type_node, c,
3908 throw_bad_array_new_length (), void_node);
3909 finish_expr_stmt (c);
3911 /* Don't check an array new when -fno-exceptions. */
3913 else if (sanitize_flags_p (SANITIZE_BOUNDS))
3915 /* Make sure the last element of the initializer is in bounds. */
3916 finish_expr_stmt
3917 (ubsan_instrument_bounds
3918 (input_location, obase, &nelts, /*ignore_off_by_one*/false));
3922 /* `build_vec_init' returns tree structure that performs
3923 initialization of a vector of aggregate types.
3925 BASE is a reference to the vector, of ARRAY_TYPE, or a pointer
3926 to the first element, of POINTER_TYPE.
3927 MAXINDEX is the maximum index of the array (one less than the
3928 number of elements). It is only used if BASE is a pointer or
3929 TYPE_DOMAIN (TREE_TYPE (BASE)) == NULL_TREE.
3931 INIT is the (possibly NULL) initializer.
3933 If EXPLICIT_VALUE_INIT_P is true, then INIT must be NULL. All
3934 elements in the array are value-initialized.
3936 FROM_ARRAY is 0 if we should init everything with INIT
3937 (i.e., every element initialized from INIT).
3938 FROM_ARRAY is 1 if we should index into INIT in parallel
3939 with initialization of DECL.
3940 FROM_ARRAY is 2 if we should index into INIT in parallel,
3941 but use assignment instead of initialization. */
3943 tree
3944 build_vec_init (tree base, tree maxindex, tree init,
3945 bool explicit_value_init_p,
3946 int from_array, tsubst_flags_t complain)
3948 tree rval;
3949 tree base2 = NULL_TREE;
3950 tree itype = NULL_TREE;
3951 tree iterator;
3952 /* The type of BASE. */
3953 tree atype = TREE_TYPE (base);
3954 /* The type of an element in the array. */
3955 tree type = TREE_TYPE (atype);
3956 /* The element type reached after removing all outer array
3957 types. */
3958 tree inner_elt_type;
3959 /* The type of a pointer to an element in the array. */
3960 tree ptype;
3961 tree stmt_expr;
3962 tree compound_stmt;
3963 int destroy_temps;
3964 tree try_block = NULL_TREE;
3965 int num_initialized_elts = 0;
3966 bool is_global;
3967 tree obase = base;
3968 bool xvalue = false;
3969 bool errors = false;
3970 location_t loc = (init ? EXPR_LOC_OR_LOC (init, input_location)
3971 : location_of (base));
3973 if (TREE_CODE (atype) == ARRAY_TYPE && TYPE_DOMAIN (atype))
3974 maxindex = array_type_nelts (atype);
3976 if (maxindex == NULL_TREE || maxindex == error_mark_node)
3977 return error_mark_node;
3979 maxindex = maybe_constant_value (maxindex);
3980 if (explicit_value_init_p)
3981 gcc_assert (!init);
3983 inner_elt_type = strip_array_types (type);
3985 /* Look through the TARGET_EXPR around a compound literal. */
3986 if (init && TREE_CODE (init) == TARGET_EXPR
3987 && TREE_CODE (TARGET_EXPR_INITIAL (init)) == CONSTRUCTOR
3988 && from_array != 2)
3989 init = TARGET_EXPR_INITIAL (init);
3991 bool direct_init = false;
3992 if (from_array && init && BRACE_ENCLOSED_INITIALIZER_P (init)
3993 && CONSTRUCTOR_NELTS (init) == 1)
3995 tree elt = CONSTRUCTOR_ELT (init, 0)->value;
3996 if (TREE_CODE (TREE_TYPE (elt)) == ARRAY_TYPE)
3998 direct_init = DIRECT_LIST_INIT_P (init);
3999 init = elt;
4003 /* If we have a braced-init-list or string constant, make sure that the array
4004 is big enough for all the initializers. */
4005 bool length_check = (init
4006 && (TREE_CODE (init) == STRING_CST
4007 || (TREE_CODE (init) == CONSTRUCTOR
4008 && CONSTRUCTOR_NELTS (init) > 0))
4009 && !TREE_CONSTANT (maxindex));
4011 if (init
4012 && TREE_CODE (atype) == ARRAY_TYPE
4013 && TREE_CONSTANT (maxindex)
4014 && (from_array == 2
4015 ? vec_copy_assign_is_trivial (inner_elt_type, init)
4016 : !TYPE_NEEDS_CONSTRUCTING (type))
4017 && ((TREE_CODE (init) == CONSTRUCTOR
4018 && (BRACE_ENCLOSED_INITIALIZER_P (init)
4019 || (same_type_ignoring_top_level_qualifiers_p
4020 (atype, TREE_TYPE (init))))
4021 /* Don't do this if the CONSTRUCTOR might contain something
4022 that might throw and require us to clean up. */
4023 && (vec_safe_is_empty (CONSTRUCTOR_ELTS (init))
4024 || ! TYPE_HAS_NONTRIVIAL_DESTRUCTOR (inner_elt_type)))
4025 || from_array))
4027 /* Do non-default initialization of trivial arrays resulting from
4028 brace-enclosed initializers. In this case, digest_init and
4029 store_constructor will handle the semantics for us. */
4031 if (BRACE_ENCLOSED_INITIALIZER_P (init))
4032 init = digest_init (atype, init, complain);
4033 stmt_expr = build2 (INIT_EXPR, atype, base, init);
4034 return stmt_expr;
4037 maxindex = cp_convert (ptrdiff_type_node, maxindex, complain);
4038 maxindex = fold_simple (maxindex);
4040 if (TREE_CODE (atype) == ARRAY_TYPE)
4042 ptype = build_pointer_type (type);
4043 base = decay_conversion (base, complain);
4044 if (base == error_mark_node)
4045 return error_mark_node;
4046 base = cp_convert (ptype, base, complain);
4048 else
4049 ptype = atype;
4051 /* The code we are generating looks like:
4053 T* t1 = (T*) base;
4054 T* rval = t1;
4055 ptrdiff_t iterator = maxindex;
4056 try {
4057 for (; iterator != -1; --iterator) {
4058 ... initialize *t1 ...
4059 ++t1;
4061 } catch (...) {
4062 ... destroy elements that were constructed ...
4064 rval;
4067 We can omit the try and catch blocks if we know that the
4068 initialization will never throw an exception, or if the array
4069 elements do not have destructors. We can omit the loop completely if
4070 the elements of the array do not have constructors.
4072 We actually wrap the entire body of the above in a STMT_EXPR, for
4073 tidiness.
4075 When copying from array to another, when the array elements have
4076 only trivial copy constructors, we should use __builtin_memcpy
4077 rather than generating a loop. That way, we could take advantage
4078 of whatever cleverness the back end has for dealing with copies
4079 of blocks of memory. */
4081 is_global = begin_init_stmts (&stmt_expr, &compound_stmt);
4082 destroy_temps = stmts_are_full_exprs_p ();
4083 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
4084 rval = get_temp_regvar (ptype, base);
4085 base = get_temp_regvar (ptype, rval);
4086 iterator = get_temp_regvar (ptrdiff_type_node, maxindex);
4088 /* If initializing one array from another, initialize element by
4089 element. We rely upon the below calls to do the argument
4090 checking. Evaluate the initializer before entering the try block. */
4091 if (from_array && init && TREE_CODE (init) != CONSTRUCTOR)
4093 if (lvalue_kind (init) & clk_rvalueref)
4094 xvalue = true;
4095 base2 = decay_conversion (init, complain);
4096 if (base2 == error_mark_node)
4097 return error_mark_node;
4098 itype = TREE_TYPE (base2);
4099 base2 = get_temp_regvar (itype, base2);
4100 itype = TREE_TYPE (itype);
4103 /* Protect the entire array initialization so that we can destroy
4104 the partially constructed array if an exception is thrown.
4105 But don't do this if we're assigning. */
4106 if (flag_exceptions && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
4107 && from_array != 2)
4109 try_block = begin_try_block ();
4112 /* Should we try to create a constant initializer? */
4113 bool try_const = (TREE_CODE (atype) == ARRAY_TYPE
4114 && TREE_CONSTANT (maxindex)
4115 && (init ? TREE_CODE (init) == CONSTRUCTOR
4116 : (type_has_constexpr_default_constructor
4117 (inner_elt_type)))
4118 && (literal_type_p (inner_elt_type)
4119 || TYPE_HAS_CONSTEXPR_CTOR (inner_elt_type)));
4120 vec<constructor_elt, va_gc> *const_vec = NULL;
4121 bool saw_non_const = false;
4122 /* If we're initializing a static array, we want to do static
4123 initialization of any elements with constant initializers even if
4124 some are non-constant. */
4125 bool do_static_init = (DECL_P (obase) && TREE_STATIC (obase));
4127 bool empty_list = false;
4128 if (init && BRACE_ENCLOSED_INITIALIZER_P (init)
4129 && CONSTRUCTOR_NELTS (init) == 0)
4130 /* Skip over the handling of non-empty init lists. */
4131 empty_list = true;
4133 /* Maybe pull out constant value when from_array? */
4135 else if (init != NULL_TREE && TREE_CODE (init) == CONSTRUCTOR)
4137 /* Do non-default initialization of non-trivial arrays resulting from
4138 brace-enclosed initializers. */
4139 unsigned HOST_WIDE_INT idx;
4140 tree field, elt;
4141 /* If the constructor already has the array type, it's been through
4142 digest_init, so we shouldn't try to do anything more. */
4143 bool digested = same_type_p (atype, TREE_TYPE (init));
4144 from_array = 0;
4146 if (length_check)
4147 finish_length_check (atype, iterator, obase, CONSTRUCTOR_NELTS (init));
4149 if (try_const)
4150 vec_alloc (const_vec, CONSTRUCTOR_NELTS (init));
4152 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (init), idx, field, elt)
4154 tree baseref = build1 (INDIRECT_REF, type, base);
4155 tree one_init;
4157 num_initialized_elts++;
4159 current_stmt_tree ()->stmts_are_full_exprs_p = 1;
4160 if (digested)
4161 one_init = build2 (INIT_EXPR, type, baseref, elt);
4162 else if (MAYBE_CLASS_TYPE_P (type) || TREE_CODE (type) == ARRAY_TYPE)
4163 one_init = build_aggr_init (baseref, elt, 0, complain);
4164 else
4165 one_init = cp_build_modify_expr (input_location, baseref,
4166 NOP_EXPR, elt, complain);
4167 if (one_init == error_mark_node)
4168 errors = true;
4169 if (try_const)
4171 tree e = maybe_constant_init (one_init);
4172 if (reduced_constant_expression_p (e))
4174 CONSTRUCTOR_APPEND_ELT (const_vec, field, e);
4175 if (do_static_init)
4176 one_init = NULL_TREE;
4177 else
4178 one_init = build2 (INIT_EXPR, type, baseref, e);
4180 else
4182 if (do_static_init)
4184 tree value = build_zero_init (TREE_TYPE (e), NULL_TREE,
4185 true);
4186 if (value)
4187 CONSTRUCTOR_APPEND_ELT (const_vec, field, value);
4189 saw_non_const = true;
4193 if (one_init)
4194 finish_expr_stmt (one_init);
4195 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
4197 one_init = cp_build_unary_op (PREINCREMENT_EXPR, base, false,
4198 complain);
4199 if (one_init == error_mark_node)
4200 errors = true;
4201 else
4202 finish_expr_stmt (one_init);
4204 one_init = cp_build_unary_op (PREDECREMENT_EXPR, iterator, false,
4205 complain);
4206 if (one_init == error_mark_node)
4207 errors = true;
4208 else
4209 finish_expr_stmt (one_init);
4212 /* Any elements without explicit initializers get T{}. */
4213 empty_list = true;
4215 else if (init && TREE_CODE (init) == STRING_CST)
4217 /* Check that the array is at least as long as the string. */
4218 if (length_check)
4219 finish_length_check (atype, iterator, obase,
4220 TREE_STRING_LENGTH (init));
4221 tree length = build_int_cst (ptrdiff_type_node,
4222 TREE_STRING_LENGTH (init));
4224 /* Copy the string to the first part of the array. */
4225 tree alias_set = build_int_cst (build_pointer_type (type), 0);
4226 tree lhs = build2 (MEM_REF, TREE_TYPE (init), base, alias_set);
4227 tree stmt = build2 (MODIFY_EXPR, void_type_node, lhs, init);
4228 finish_expr_stmt (stmt);
4230 /* Adjust the counter and pointer. */
4231 stmt = cp_build_binary_op (loc, MINUS_EXPR, iterator, length, complain);
4232 stmt = build2 (MODIFY_EXPR, void_type_node, iterator, stmt);
4233 finish_expr_stmt (stmt);
4235 stmt = cp_build_binary_op (loc, PLUS_EXPR, base, length, complain);
4236 stmt = build2 (MODIFY_EXPR, void_type_node, base, stmt);
4237 finish_expr_stmt (stmt);
4239 /* And set the rest of the array to NUL. */
4240 from_array = 0;
4241 explicit_value_init_p = true;
4243 else if (from_array)
4245 if (init)
4246 /* OK, we set base2 above. */;
4247 else if (CLASS_TYPE_P (type)
4248 && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
4250 if (complain & tf_error)
4251 error ("initializer ends prematurely");
4252 errors = true;
4256 /* Now, default-initialize any remaining elements. We don't need to
4257 do that if a) the type does not need constructing, or b) we've
4258 already initialized all the elements.
4260 We do need to keep going if we're copying an array. */
4262 if (try_const && !init)
4263 /* With a constexpr default constructor, which we checked for when
4264 setting try_const above, default-initialization is equivalent to
4265 value-initialization, and build_value_init gives us something more
4266 friendly to maybe_constant_init. */
4267 explicit_value_init_p = true;
4268 if (from_array
4269 || ((type_build_ctor_call (type) || init || explicit_value_init_p)
4270 && ! (tree_fits_shwi_p (maxindex)
4271 && (num_initialized_elts
4272 == tree_to_shwi (maxindex) + 1))))
4274 /* If the ITERATOR is lesser or equal to -1, then we don't have to loop;
4275 we've already initialized all the elements. */
4276 tree for_stmt;
4277 tree elt_init;
4278 tree to;
4280 for_stmt = begin_for_stmt (NULL_TREE, NULL_TREE);
4281 finish_init_stmt (for_stmt);
4282 finish_for_cond (build2 (GT_EXPR, boolean_type_node, iterator,
4283 build_int_cst (TREE_TYPE (iterator), -1)),
4284 for_stmt, false);
4285 elt_init = cp_build_unary_op (PREDECREMENT_EXPR, iterator, false,
4286 complain);
4287 if (elt_init == error_mark_node)
4288 errors = true;
4289 finish_for_expr (elt_init, for_stmt);
4291 to = build1 (INDIRECT_REF, type, base);
4293 /* If the initializer is {}, then all elements are initialized from T{}.
4294 But for non-classes, that's the same as value-initialization. */
4295 if (empty_list)
4297 if (cxx_dialect >= cxx11 && AGGREGATE_TYPE_P (type))
4299 init = build_constructor (init_list_type_node, NULL);
4301 else
4303 init = NULL_TREE;
4304 explicit_value_init_p = true;
4308 if (from_array)
4310 tree from;
4312 if (base2)
4314 from = build1 (INDIRECT_REF, itype, base2);
4315 if (xvalue)
4316 from = move (from);
4317 if (direct_init)
4318 from = build_tree_list (NULL_TREE, from);
4320 else
4321 from = NULL_TREE;
4323 if (from_array == 2)
4324 elt_init = cp_build_modify_expr (input_location, to, NOP_EXPR,
4325 from, complain);
4326 else if (type_build_ctor_call (type))
4327 elt_init = build_aggr_init (to, from, 0, complain);
4328 else if (from)
4329 elt_init = cp_build_modify_expr (input_location, to, NOP_EXPR, from,
4330 complain);
4331 else
4332 gcc_unreachable ();
4334 else if (TREE_CODE (type) == ARRAY_TYPE)
4336 if (init && !BRACE_ENCLOSED_INITIALIZER_P (init))
4337 sorry
4338 ("cannot initialize multi-dimensional array with initializer");
4339 elt_init = build_vec_init (build1 (INDIRECT_REF, type, base),
4340 0, init,
4341 explicit_value_init_p,
4342 0, complain);
4344 else if (explicit_value_init_p)
4346 elt_init = build_value_init (type, complain);
4347 if (elt_init != error_mark_node)
4348 elt_init = build2 (INIT_EXPR, type, to, elt_init);
4350 else
4352 gcc_assert (type_build_ctor_call (type) || init);
4353 if (CLASS_TYPE_P (type))
4354 elt_init = build_aggr_init (to, init, 0, complain);
4355 else
4357 if (TREE_CODE (init) == TREE_LIST)
4358 init = build_x_compound_expr_from_list (init, ELK_INIT,
4359 complain);
4360 elt_init = build2 (INIT_EXPR, type, to, init);
4364 if (elt_init == error_mark_node)
4365 errors = true;
4367 if (try_const)
4369 /* FIXME refs to earlier elts */
4370 tree e = maybe_constant_init (elt_init);
4371 if (reduced_constant_expression_p (e))
4373 if (initializer_zerop (e))
4374 /* Don't fill the CONSTRUCTOR with zeros. */
4375 e = NULL_TREE;
4376 if (do_static_init)
4377 elt_init = NULL_TREE;
4379 else
4381 saw_non_const = true;
4382 if (do_static_init)
4383 e = build_zero_init (TREE_TYPE (e), NULL_TREE, true);
4384 else
4385 e = NULL_TREE;
4388 if (e)
4390 int max = tree_to_shwi (maxindex)+1;
4391 for (; num_initialized_elts < max; ++num_initialized_elts)
4393 tree field = size_int (num_initialized_elts);
4394 CONSTRUCTOR_APPEND_ELT (const_vec, field, e);
4399 current_stmt_tree ()->stmts_are_full_exprs_p = 1;
4400 if (elt_init)
4401 finish_expr_stmt (elt_init);
4402 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
4404 finish_expr_stmt (cp_build_unary_op (PREINCREMENT_EXPR, base, false,
4405 complain));
4406 if (base2)
4407 finish_expr_stmt (cp_build_unary_op (PREINCREMENT_EXPR, base2, false,
4408 complain));
4410 finish_for_stmt (for_stmt);
4413 /* Make sure to cleanup any partially constructed elements. */
4414 if (flag_exceptions && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
4415 && from_array != 2)
4417 tree e;
4418 tree m = cp_build_binary_op (input_location,
4419 MINUS_EXPR, maxindex, iterator,
4420 complain);
4422 /* Flatten multi-dimensional array since build_vec_delete only
4423 expects one-dimensional array. */
4424 if (TREE_CODE (type) == ARRAY_TYPE)
4425 m = cp_build_binary_op (input_location,
4426 MULT_EXPR, m,
4427 /* Avoid mixing signed and unsigned. */
4428 convert (TREE_TYPE (m),
4429 array_type_nelts_total (type)),
4430 complain);
4432 finish_cleanup_try_block (try_block);
4433 e = build_vec_delete_1 (rval, m,
4434 inner_elt_type, sfk_complete_destructor,
4435 /*use_global_delete=*/0, complain);
4436 if (e == error_mark_node)
4437 errors = true;
4438 finish_cleanup (e, try_block);
4441 /* The value of the array initialization is the array itself, RVAL
4442 is a pointer to the first element. */
4443 finish_stmt_expr_expr (rval, stmt_expr);
4445 stmt_expr = finish_init_stmts (is_global, stmt_expr, compound_stmt);
4447 current_stmt_tree ()->stmts_are_full_exprs_p = destroy_temps;
4449 if (errors)
4450 return error_mark_node;
4452 if (try_const)
4454 if (!saw_non_const)
4456 tree const_init = build_constructor (atype, const_vec);
4457 return build2 (INIT_EXPR, atype, obase, const_init);
4459 else if (do_static_init && !vec_safe_is_empty (const_vec))
4460 DECL_INITIAL (obase) = build_constructor (atype, const_vec);
4461 else
4462 vec_free (const_vec);
4465 /* Now make the result have the correct type. */
4466 if (TREE_CODE (atype) == ARRAY_TYPE)
4468 atype = build_pointer_type (atype);
4469 stmt_expr = build1 (NOP_EXPR, atype, stmt_expr);
4470 stmt_expr = cp_build_indirect_ref (stmt_expr, RO_NULL, complain);
4471 TREE_NO_WARNING (stmt_expr) = 1;
4474 return stmt_expr;
4477 /* Call the DTOR_KIND destructor for EXP. FLAGS are as for
4478 build_delete. */
4480 static tree
4481 build_dtor_call (tree exp, special_function_kind dtor_kind, int flags,
4482 tsubst_flags_t complain)
4484 tree name;
4485 tree fn;
4486 switch (dtor_kind)
4488 case sfk_complete_destructor:
4489 name = complete_dtor_identifier;
4490 break;
4492 case sfk_base_destructor:
4493 name = base_dtor_identifier;
4494 break;
4496 case sfk_deleting_destructor:
4497 name = deleting_dtor_identifier;
4498 break;
4500 default:
4501 gcc_unreachable ();
4503 fn = lookup_fnfields (TREE_TYPE (exp), name, /*protect=*/2);
4504 return build_new_method_call (exp, fn,
4505 /*args=*/NULL,
4506 /*conversion_path=*/NULL_TREE,
4507 flags,
4508 /*fn_p=*/NULL,
4509 complain);
4512 /* Generate a call to a destructor. TYPE is the type to cast ADDR to.
4513 ADDR is an expression which yields the store to be destroyed.
4514 AUTO_DELETE is the name of the destructor to call, i.e., either
4515 sfk_complete_destructor, sfk_base_destructor, or
4516 sfk_deleting_destructor.
4518 FLAGS is the logical disjunction of zero or more LOOKUP_
4519 flags. See cp-tree.h for more info. */
4521 tree
4522 build_delete (tree otype, tree addr, special_function_kind auto_delete,
4523 int flags, int use_global_delete, tsubst_flags_t complain)
4525 tree expr;
4527 if (addr == error_mark_node)
4528 return error_mark_node;
4530 tree type = TYPE_MAIN_VARIANT (otype);
4532 /* Can happen when CURRENT_EXCEPTION_OBJECT gets its type
4533 set to `error_mark_node' before it gets properly cleaned up. */
4534 if (type == error_mark_node)
4535 return error_mark_node;
4537 if (TREE_CODE (type) == POINTER_TYPE)
4538 type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
4540 if (TREE_CODE (type) == ARRAY_TYPE)
4542 if (TYPE_DOMAIN (type) == NULL_TREE)
4544 if (complain & tf_error)
4545 error ("unknown array size in delete");
4546 return error_mark_node;
4548 return build_vec_delete (addr, array_type_nelts (type),
4549 auto_delete, use_global_delete, complain);
4552 if (TYPE_PTR_P (otype))
4554 addr = mark_rvalue_use (addr);
4556 /* We don't want to warn about delete of void*, only other
4557 incomplete types. Deleting other incomplete types
4558 invokes undefined behavior, but it is not ill-formed, so
4559 compile to something that would even do The Right Thing
4560 (TM) should the type have a trivial dtor and no delete
4561 operator. */
4562 if (!VOID_TYPE_P (type))
4564 complete_type (type);
4565 if (!COMPLETE_TYPE_P (type))
4567 if ((complain & tf_warning)
4568 && warning (OPT_Wdelete_incomplete,
4569 "possible problem detected in invocation of "
4570 "delete operator:"))
4572 cxx_incomplete_type_diagnostic (addr, type, DK_WARNING);
4573 inform (input_location,
4574 "neither the destructor nor the class-specific "
4575 "operator delete will be called, even if they are "
4576 "declared when the class is defined");
4579 else if (auto_delete == sfk_deleting_destructor && warn_delnonvdtor
4580 && MAYBE_CLASS_TYPE_P (type) && !CLASSTYPE_FINAL (type)
4581 && TYPE_POLYMORPHIC_P (type))
4583 tree dtor = CLASSTYPE_DESTRUCTOR (type);
4584 if (!dtor || !DECL_VINDEX (dtor))
4586 if (CLASSTYPE_PURE_VIRTUALS (type))
4587 warning (OPT_Wdelete_non_virtual_dtor,
4588 "deleting object of abstract class type %qT"
4589 " which has non-virtual destructor"
4590 " will cause undefined behavior", type);
4591 else
4592 warning (OPT_Wdelete_non_virtual_dtor,
4593 "deleting object of polymorphic class type %qT"
4594 " which has non-virtual destructor"
4595 " might cause undefined behavior", type);
4599 if (TREE_SIDE_EFFECTS (addr))
4600 addr = save_expr (addr);
4602 /* Throw away const and volatile on target type of addr. */
4603 addr = convert_force (build_pointer_type (type), addr, 0, complain);
4605 else
4607 /* Don't check PROTECT here; leave that decision to the
4608 destructor. If the destructor is accessible, call it,
4609 else report error. */
4610 addr = cp_build_addr_expr (addr, complain);
4611 if (addr == error_mark_node)
4612 return error_mark_node;
4613 if (TREE_SIDE_EFFECTS (addr))
4614 addr = save_expr (addr);
4616 addr = convert_force (build_pointer_type (type), addr, 0, complain);
4619 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
4621 /* Make sure the destructor is callable. */
4622 if (type_build_dtor_call (type))
4624 expr = build_dtor_call (cp_build_indirect_ref (addr, RO_NULL,
4625 complain),
4626 sfk_complete_destructor, flags, complain);
4627 if (expr == error_mark_node)
4628 return error_mark_node;
4631 if (auto_delete != sfk_deleting_destructor)
4632 return void_node;
4634 return build_op_delete_call (DELETE_EXPR, addr,
4635 cxx_sizeof_nowarn (type),
4636 use_global_delete,
4637 /*placement=*/NULL_TREE,
4638 /*alloc_fn=*/NULL_TREE,
4639 complain);
4641 else
4643 tree head = NULL_TREE;
4644 tree do_delete = NULL_TREE;
4645 tree ifexp;
4647 if (CLASSTYPE_LAZY_DESTRUCTOR (type))
4648 lazily_declare_fn (sfk_destructor, type);
4650 /* For `::delete x', we must not use the deleting destructor
4651 since then we would not be sure to get the global `operator
4652 delete'. */
4653 if (use_global_delete && auto_delete == sfk_deleting_destructor)
4655 /* We will use ADDR multiple times so we must save it. */
4656 addr = save_expr (addr);
4657 head = get_target_expr (build_headof (addr));
4658 /* Delete the object. */
4659 do_delete = build_op_delete_call (DELETE_EXPR,
4660 head,
4661 cxx_sizeof_nowarn (type),
4662 /*global_p=*/true,
4663 /*placement=*/NULL_TREE,
4664 /*alloc_fn=*/NULL_TREE,
4665 complain);
4666 /* Otherwise, treat this like a complete object destructor
4667 call. */
4668 auto_delete = sfk_complete_destructor;
4670 /* If the destructor is non-virtual, there is no deleting
4671 variant. Instead, we must explicitly call the appropriate
4672 `operator delete' here. */
4673 else if (!DECL_VIRTUAL_P (CLASSTYPE_DESTRUCTOR (type))
4674 && auto_delete == sfk_deleting_destructor)
4676 /* We will use ADDR multiple times so we must save it. */
4677 addr = save_expr (addr);
4678 /* Build the call. */
4679 do_delete = build_op_delete_call (DELETE_EXPR,
4680 addr,
4681 cxx_sizeof_nowarn (type),
4682 /*global_p=*/false,
4683 /*placement=*/NULL_TREE,
4684 /*alloc_fn=*/NULL_TREE,
4685 complain);
4686 /* Call the complete object destructor. */
4687 auto_delete = sfk_complete_destructor;
4689 else if (auto_delete == sfk_deleting_destructor
4690 && TYPE_GETS_REG_DELETE (type))
4692 /* Make sure we have access to the member op delete, even though
4693 we'll actually be calling it from the destructor. */
4694 build_op_delete_call (DELETE_EXPR, addr, cxx_sizeof_nowarn (type),
4695 /*global_p=*/false,
4696 /*placement=*/NULL_TREE,
4697 /*alloc_fn=*/NULL_TREE,
4698 complain);
4701 expr = build_dtor_call (cp_build_indirect_ref (addr, RO_NULL, complain),
4702 auto_delete, flags, complain);
4703 if (expr == error_mark_node)
4704 return error_mark_node;
4705 if (do_delete)
4706 /* The delete operator must be called, regardless of whether
4707 the destructor throws.
4709 [expr.delete]/7 The deallocation function is called
4710 regardless of whether the destructor for the object or some
4711 element of the array throws an exception. */
4712 expr = build2 (TRY_FINALLY_EXPR, void_type_node, expr, do_delete);
4714 /* We need to calculate this before the dtor changes the vptr. */
4715 if (head)
4716 expr = build2 (COMPOUND_EXPR, void_type_node, head, expr);
4718 if (flags & LOOKUP_DESTRUCTOR)
4719 /* Explicit destructor call; don't check for null pointer. */
4720 ifexp = integer_one_node;
4721 else
4723 /* Handle deleting a null pointer. */
4724 warning_sentinel s (warn_address);
4725 ifexp = cp_build_binary_op (input_location, NE_EXPR, addr,
4726 nullptr_node, complain);
4727 if (ifexp == error_mark_node)
4728 return error_mark_node;
4729 /* This is a compiler generated comparison, don't emit
4730 e.g. -Wnonnull-compare warning for it. */
4731 else if (TREE_CODE (ifexp) == NE_EXPR)
4732 TREE_NO_WARNING (ifexp) = 1;
4735 if (ifexp != integer_one_node)
4736 expr = build3 (COND_EXPR, void_type_node, ifexp, expr, void_node);
4738 return expr;
4742 /* At the beginning of a destructor, push cleanups that will call the
4743 destructors for our base classes and members.
4745 Called from begin_destructor_body. */
4747 void
4748 push_base_cleanups (void)
4750 tree binfo, base_binfo;
4751 int i;
4752 tree member;
4753 tree expr;
4754 vec<tree, va_gc> *vbases;
4756 /* Run destructors for all virtual baseclasses. */
4757 if (!ABSTRACT_CLASS_TYPE_P (current_class_type)
4758 && CLASSTYPE_VBASECLASSES (current_class_type))
4760 tree cond = (condition_conversion
4761 (build2 (BIT_AND_EXPR, integer_type_node,
4762 current_in_charge_parm,
4763 integer_two_node)));
4765 /* The CLASSTYPE_VBASECLASSES vector is in initialization
4766 order, which is also the right order for pushing cleanups. */
4767 for (vbases = CLASSTYPE_VBASECLASSES (current_class_type), i = 0;
4768 vec_safe_iterate (vbases, i, &base_binfo); i++)
4770 if (type_build_dtor_call (BINFO_TYPE (base_binfo)))
4772 expr = build_special_member_call (current_class_ref,
4773 base_dtor_identifier,
4774 NULL,
4775 base_binfo,
4776 (LOOKUP_NORMAL
4777 | LOOKUP_NONVIRTUAL),
4778 tf_warning_or_error);
4779 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo)))
4781 expr = build3 (COND_EXPR, void_type_node, cond,
4782 expr, void_node);
4783 finish_decl_cleanup (NULL_TREE, expr);
4789 /* Take care of the remaining baseclasses. */
4790 for (binfo = TYPE_BINFO (current_class_type), i = 0;
4791 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
4793 if (BINFO_VIRTUAL_P (base_binfo)
4794 || !type_build_dtor_call (BINFO_TYPE (base_binfo)))
4795 continue;
4797 expr = build_special_member_call (current_class_ref,
4798 base_dtor_identifier,
4799 NULL, base_binfo,
4800 LOOKUP_NORMAL | LOOKUP_NONVIRTUAL,
4801 tf_warning_or_error);
4802 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo)))
4803 finish_decl_cleanup (NULL_TREE, expr);
4806 /* Don't automatically destroy union members. */
4807 if (TREE_CODE (current_class_type) == UNION_TYPE)
4808 return;
4810 for (member = TYPE_FIELDS (current_class_type); member;
4811 member = DECL_CHAIN (member))
4813 tree this_type = TREE_TYPE (member);
4814 if (this_type == error_mark_node
4815 || TREE_CODE (member) != FIELD_DECL
4816 || DECL_ARTIFICIAL (member))
4817 continue;
4818 if (ANON_AGGR_TYPE_P (this_type))
4819 continue;
4820 if (type_build_dtor_call (this_type))
4822 tree this_member = (build_class_member_access_expr
4823 (current_class_ref, member,
4824 /*access_path=*/NULL_TREE,
4825 /*preserve_reference=*/false,
4826 tf_warning_or_error));
4827 expr = build_delete (this_type, this_member,
4828 sfk_complete_destructor,
4829 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_NORMAL,
4830 0, tf_warning_or_error);
4831 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (this_type))
4832 finish_decl_cleanup (NULL_TREE, expr);
4837 /* Build a C++ vector delete expression.
4838 MAXINDEX is the number of elements to be deleted.
4839 ELT_SIZE is the nominal size of each element in the vector.
4840 BASE is the expression that should yield the store to be deleted.
4841 This function expands (or synthesizes) these calls itself.
4842 AUTO_DELETE_VEC says whether the container (vector) should be deallocated.
4844 This also calls delete for virtual baseclasses of elements of the vector.
4846 Update: MAXINDEX is no longer needed. The size can be extracted from the
4847 start of the vector for pointers, and from the type for arrays. We still
4848 use MAXINDEX for arrays because it happens to already have one of the
4849 values we'd have to extract. (We could use MAXINDEX with pointers to
4850 confirm the size, and trap if the numbers differ; not clear that it'd
4851 be worth bothering.) */
4853 tree
4854 build_vec_delete (tree base, tree maxindex,
4855 special_function_kind auto_delete_vec,
4856 int use_global_delete, tsubst_flags_t complain)
4858 tree type;
4859 tree rval;
4860 tree base_init = NULL_TREE;
4862 type = TREE_TYPE (base);
4864 if (TYPE_PTR_P (type))
4866 /* Step back one from start of vector, and read dimension. */
4867 tree cookie_addr;
4868 tree size_ptr_type = build_pointer_type (sizetype);
4870 base = mark_rvalue_use (base);
4871 if (TREE_SIDE_EFFECTS (base))
4873 base_init = get_target_expr (base);
4874 base = TARGET_EXPR_SLOT (base_init);
4876 type = strip_array_types (TREE_TYPE (type));
4877 cookie_addr = fold_build1_loc (input_location, NEGATE_EXPR,
4878 sizetype, TYPE_SIZE_UNIT (sizetype));
4879 cookie_addr = fold_build_pointer_plus (fold_convert (size_ptr_type, base),
4880 cookie_addr);
4881 maxindex = cp_build_indirect_ref (cookie_addr, RO_NULL, complain);
4883 else if (TREE_CODE (type) == ARRAY_TYPE)
4885 /* Get the total number of things in the array, maxindex is a
4886 bad name. */
4887 maxindex = array_type_nelts_total (type);
4888 type = strip_array_types (type);
4889 base = decay_conversion (base, complain);
4890 if (base == error_mark_node)
4891 return error_mark_node;
4892 if (TREE_SIDE_EFFECTS (base))
4894 base_init = get_target_expr (base);
4895 base = TARGET_EXPR_SLOT (base_init);
4898 else
4900 if (base != error_mark_node && !(complain & tf_error))
4901 error ("type to vector delete is neither pointer or array type");
4902 return error_mark_node;
4905 rval = build_vec_delete_1 (base, maxindex, type, auto_delete_vec,
4906 use_global_delete, complain);
4907 if (base_init && rval != error_mark_node)
4908 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), base_init, rval);
4910 return rval;
4913 #include "gt-cp-init.h"