jit: document union types
[official-gcc.git] / gcc / cp / init.c
blob871ddb5e68673c08e1502879068394b694713be7
1 /* Handle initialization things in C++.
2 Copyright (C) 1987-2015 Free Software Foundation, Inc.
3 Contributed by Michael Tiemann (tiemann@cygnus.com)
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 /* High-level class interface. */
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "alias.h"
28 #include "symtab.h"
29 #include "tree.h"
30 #include "stringpool.h"
31 #include "varasm.h"
32 #include "cp-tree.h"
33 #include "flags.h"
34 #include "target.h"
35 #include "gimplify.h"
36 #include "c-family/c-ubsan.h"
38 static bool begin_init_stmts (tree *, tree *);
39 static tree finish_init_stmts (bool, tree, tree);
40 static void construct_virtual_base (tree, tree);
41 static void expand_aggr_init_1 (tree, tree, tree, tree, int, tsubst_flags_t);
42 static void expand_default_init (tree, tree, tree, tree, int, tsubst_flags_t);
43 static void perform_member_init (tree, tree);
44 static int member_init_ok_or_else (tree, tree, tree);
45 static void expand_virtual_init (tree, tree);
46 static tree sort_mem_initializers (tree, tree);
47 static tree initializing_context (tree);
48 static void expand_cleanup_for_base (tree, tree);
49 static tree dfs_initialize_vtbl_ptrs (tree, void *);
50 static tree build_field_list (tree, tree, int *);
51 static int diagnose_uninitialized_cst_or_ref_member_1 (tree, tree, bool, bool);
53 /* We are about to generate some complex initialization code.
54 Conceptually, it is all a single expression. However, we may want
55 to include conditionals, loops, and other such statement-level
56 constructs. Therefore, we build the initialization code inside a
57 statement-expression. This function starts such an expression.
58 STMT_EXPR_P and COMPOUND_STMT_P are filled in by this function;
59 pass them back to finish_init_stmts when the expression is
60 complete. */
62 static bool
63 begin_init_stmts (tree *stmt_expr_p, tree *compound_stmt_p)
65 bool is_global = !building_stmt_list_p ();
67 *stmt_expr_p = begin_stmt_expr ();
68 *compound_stmt_p = begin_compound_stmt (BCS_NO_SCOPE);
70 return is_global;
73 /* Finish out the statement-expression begun by the previous call to
74 begin_init_stmts. Returns the statement-expression itself. */
76 static tree
77 finish_init_stmts (bool is_global, tree stmt_expr, tree compound_stmt)
79 finish_compound_stmt (compound_stmt);
81 stmt_expr = finish_stmt_expr (stmt_expr, true);
83 gcc_assert (!building_stmt_list_p () == is_global);
85 return stmt_expr;
88 /* Constructors */
90 /* Called from initialize_vtbl_ptrs via dfs_walk. BINFO is the base
91 which we want to initialize the vtable pointer for, DATA is
92 TREE_LIST whose TREE_VALUE is the this ptr expression. */
94 static tree
95 dfs_initialize_vtbl_ptrs (tree binfo, void *data)
97 if (!TYPE_CONTAINS_VPTR_P (BINFO_TYPE (binfo)))
98 return dfs_skip_bases;
100 if (!BINFO_PRIMARY_P (binfo) || BINFO_VIRTUAL_P (binfo))
102 tree base_ptr = TREE_VALUE ((tree) data);
104 base_ptr = build_base_path (PLUS_EXPR, base_ptr, binfo, /*nonnull=*/1,
105 tf_warning_or_error);
107 expand_virtual_init (binfo, base_ptr);
110 return NULL_TREE;
113 /* Initialize all the vtable pointers in the object pointed to by
114 ADDR. */
116 void
117 initialize_vtbl_ptrs (tree addr)
119 tree list;
120 tree type;
122 type = TREE_TYPE (TREE_TYPE (addr));
123 list = build_tree_list (type, addr);
125 /* Walk through the hierarchy, initializing the vptr in each base
126 class. We do these in pre-order because we can't find the virtual
127 bases for a class until we've initialized the vtbl for that
128 class. */
129 dfs_walk_once (TYPE_BINFO (type), dfs_initialize_vtbl_ptrs, NULL, list);
132 /* Return an expression for the zero-initialization of an object with
133 type T. This expression will either be a constant (in the case
134 that T is a scalar), or a CONSTRUCTOR (in the case that T is an
135 aggregate), or NULL (in the case that T does not require
136 initialization). In either case, the value can be used as
137 DECL_INITIAL for a decl of the indicated TYPE; it is a valid static
138 initializer. If NELTS is non-NULL, and TYPE is an ARRAY_TYPE, NELTS
139 is the number of elements in the array. If STATIC_STORAGE_P is
140 TRUE, initializers are only generated for entities for which
141 zero-initialization does not simply mean filling the storage with
142 zero bytes. FIELD_SIZE, if non-NULL, is the bit size of the field,
143 subfields with bit positions at or above that bit size shouldn't
144 be added. Note that this only works when the result is assigned
145 to a base COMPONENT_REF; if we only have a pointer to the base subobject,
146 expand_assignment will end up clearing the full size of TYPE. */
148 static tree
149 build_zero_init_1 (tree type, tree nelts, bool static_storage_p,
150 tree field_size)
152 tree init = NULL_TREE;
154 /* [dcl.init]
156 To zero-initialize an object of type T means:
158 -- if T is a scalar type, the storage is set to the value of zero
159 converted to T.
161 -- if T is a non-union class type, the storage for each nonstatic
162 data member and each base-class subobject is zero-initialized.
164 -- if T is a union type, the storage for its first data member is
165 zero-initialized.
167 -- if T is an array type, the storage for each element is
168 zero-initialized.
170 -- if T is a reference type, no initialization is performed. */
172 gcc_assert (nelts == NULL_TREE || TREE_CODE (nelts) == INTEGER_CST);
174 if (type == error_mark_node)
176 else if (static_storage_p && zero_init_p (type))
177 /* In order to save space, we do not explicitly build initializers
178 for items that do not need them. GCC's semantics are that
179 items with static storage duration that are not otherwise
180 initialized are initialized to zero. */
182 else if (TYPE_PTR_OR_PTRMEM_P (type))
183 init = convert (type, nullptr_node);
184 else if (SCALAR_TYPE_P (type))
185 init = convert (type, integer_zero_node);
186 else if (RECORD_OR_UNION_CODE_P (TREE_CODE (type)))
188 tree field;
189 vec<constructor_elt, va_gc> *v = NULL;
191 /* Iterate over the fields, building initializations. */
192 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
194 if (TREE_CODE (field) != FIELD_DECL)
195 continue;
197 if (TREE_TYPE (field) == error_mark_node)
198 continue;
200 /* Don't add virtual bases for base classes if they are beyond
201 the size of the current field, that means it is present
202 somewhere else in the object. */
203 if (field_size)
205 tree bitpos = bit_position (field);
206 if (TREE_CODE (bitpos) == INTEGER_CST
207 && !tree_int_cst_lt (bitpos, field_size))
208 continue;
211 /* Note that for class types there will be FIELD_DECLs
212 corresponding to base classes as well. Thus, iterating
213 over TYPE_FIELDs will result in correct initialization of
214 all of the subobjects. */
215 if (!static_storage_p || !zero_init_p (TREE_TYPE (field)))
217 tree new_field_size
218 = (DECL_FIELD_IS_BASE (field)
219 && DECL_SIZE (field)
220 && TREE_CODE (DECL_SIZE (field)) == INTEGER_CST)
221 ? DECL_SIZE (field) : NULL_TREE;
222 tree value = build_zero_init_1 (TREE_TYPE (field),
223 /*nelts=*/NULL_TREE,
224 static_storage_p,
225 new_field_size);
226 if (value)
227 CONSTRUCTOR_APPEND_ELT(v, field, value);
230 /* For unions, only the first field is initialized. */
231 if (TREE_CODE (type) == UNION_TYPE)
232 break;
235 /* Build a constructor to contain the initializations. */
236 init = build_constructor (type, v);
238 else if (TREE_CODE (type) == ARRAY_TYPE)
240 tree max_index;
241 vec<constructor_elt, va_gc> *v = NULL;
243 /* Iterate over the array elements, building initializations. */
244 if (nelts)
245 max_index = fold_build2_loc (input_location,
246 MINUS_EXPR, TREE_TYPE (nelts),
247 nelts, integer_one_node);
248 else
249 max_index = array_type_nelts (type);
251 /* If we have an error_mark here, we should just return error mark
252 as we don't know the size of the array yet. */
253 if (max_index == error_mark_node)
254 return error_mark_node;
255 gcc_assert (TREE_CODE (max_index) == INTEGER_CST);
257 /* A zero-sized array, which is accepted as an extension, will
258 have an upper bound of -1. */
259 if (!tree_int_cst_equal (max_index, integer_minus_one_node))
261 constructor_elt ce;
263 /* If this is a one element array, we just use a regular init. */
264 if (tree_int_cst_equal (size_zero_node, max_index))
265 ce.index = size_zero_node;
266 else
267 ce.index = build2 (RANGE_EXPR, sizetype, size_zero_node,
268 max_index);
270 ce.value = build_zero_init_1 (TREE_TYPE (type),
271 /*nelts=*/NULL_TREE,
272 static_storage_p, NULL_TREE);
273 if (ce.value)
275 vec_alloc (v, 1);
276 v->quick_push (ce);
280 /* Build a constructor to contain the initializations. */
281 init = build_constructor (type, v);
283 else if (VECTOR_TYPE_P (type))
284 init = build_zero_cst (type);
285 else
286 gcc_assert (TREE_CODE (type) == REFERENCE_TYPE);
288 /* In all cases, the initializer is a constant. */
289 if (init)
290 TREE_CONSTANT (init) = 1;
292 return init;
295 /* Return an expression for the zero-initialization of an object with
296 type T. This expression will either be a constant (in the case
297 that T is a scalar), or a CONSTRUCTOR (in the case that T is an
298 aggregate), or NULL (in the case that T does not require
299 initialization). In either case, the value can be used as
300 DECL_INITIAL for a decl of the indicated TYPE; it is a valid static
301 initializer. If NELTS is non-NULL, and TYPE is an ARRAY_TYPE, NELTS
302 is the number of elements in the array. If STATIC_STORAGE_P is
303 TRUE, initializers are only generated for entities for which
304 zero-initialization does not simply mean filling the storage with
305 zero bytes. */
307 tree
308 build_zero_init (tree type, tree nelts, bool static_storage_p)
310 return build_zero_init_1 (type, nelts, static_storage_p, NULL_TREE);
313 /* Return a suitable initializer for value-initializing an object of type
314 TYPE, as described in [dcl.init]. */
316 tree
317 build_value_init (tree type, tsubst_flags_t complain)
319 /* [dcl.init]
321 To value-initialize an object of type T means:
323 - if T is a class type (clause 9) with either no default constructor
324 (12.1) or a default constructor that is user-provided or deleted,
325 then then the object is default-initialized;
327 - if T is a (possibly cv-qualified) class type without a user-provided
328 or deleted default constructor, then the object is zero-initialized
329 and the semantic constraints for default-initialization are checked,
330 and if T has a non-trivial default constructor, the object is
331 default-initialized;
333 - if T is an array type, then each element is value-initialized;
335 - otherwise, the object is zero-initialized.
337 A program that calls for default-initialization or
338 value-initialization of an entity of reference type is ill-formed. */
340 /* The AGGR_INIT_EXPR tweaking below breaks in templates. */
341 gcc_assert (!processing_template_decl
342 || (SCALAR_TYPE_P (type) || TREE_CODE (type) == ARRAY_TYPE));
344 if (CLASS_TYPE_P (type)
345 && type_build_ctor_call (type))
347 tree ctor =
348 build_special_member_call (NULL_TREE, complete_ctor_identifier,
349 NULL, type, LOOKUP_NORMAL,
350 complain);
351 if (ctor == error_mark_node)
352 return ctor;
353 tree fn = NULL_TREE;
354 if (TREE_CODE (ctor) == CALL_EXPR)
355 fn = get_callee_fndecl (ctor);
356 ctor = build_aggr_init_expr (type, ctor);
357 if (fn && user_provided_p (fn))
358 return ctor;
359 else if (TYPE_HAS_COMPLEX_DFLT (type))
361 /* This is a class that needs constructing, but doesn't have
362 a user-provided constructor. So we need to zero-initialize
363 the object and then call the implicitly defined ctor.
364 This will be handled in simplify_aggr_init_expr. */
365 AGGR_INIT_ZERO_FIRST (ctor) = 1;
366 return ctor;
370 /* Discard any access checking during subobject initialization;
371 the checks are implied by the call to the ctor which we have
372 verified is OK (cpp0x/defaulted46.C). */
373 push_deferring_access_checks (dk_deferred);
374 tree r = build_value_init_noctor (type, complain);
375 pop_deferring_access_checks ();
376 return r;
379 /* Like build_value_init, but don't call the constructor for TYPE. Used
380 for base initializers. */
382 tree
383 build_value_init_noctor (tree type, tsubst_flags_t complain)
385 if (!COMPLETE_TYPE_P (type))
387 if (complain & tf_error)
388 error ("value-initialization of incomplete type %qT", type);
389 return error_mark_node;
391 /* FIXME the class and array cases should just use digest_init once it is
392 SFINAE-enabled. */
393 if (CLASS_TYPE_P (type))
395 gcc_assert (!TYPE_HAS_COMPLEX_DFLT (type)
396 || errorcount != 0);
398 if (TREE_CODE (type) != UNION_TYPE)
400 tree field;
401 vec<constructor_elt, va_gc> *v = NULL;
403 /* Iterate over the fields, building initializations. */
404 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
406 tree ftype, value;
408 if (TREE_CODE (field) != FIELD_DECL)
409 continue;
411 ftype = TREE_TYPE (field);
413 if (ftype == error_mark_node)
414 continue;
416 /* We could skip vfields and fields of types with
417 user-defined constructors, but I think that won't improve
418 performance at all; it should be simpler in general just
419 to zero out the entire object than try to only zero the
420 bits that actually need it. */
422 /* Note that for class types there will be FIELD_DECLs
423 corresponding to base classes as well. Thus, iterating
424 over TYPE_FIELDs will result in correct initialization of
425 all of the subobjects. */
426 value = build_value_init (ftype, complain);
427 value = maybe_constant_init (value);
429 if (value == error_mark_node)
430 return error_mark_node;
432 CONSTRUCTOR_APPEND_ELT(v, field, value);
434 /* We shouldn't have gotten here for anything that would need
435 non-trivial initialization, and gimplify_init_ctor_preeval
436 would need to be fixed to allow it. */
437 gcc_assert (TREE_CODE (value) != TARGET_EXPR
438 && TREE_CODE (value) != AGGR_INIT_EXPR);
441 /* Build a constructor to contain the zero- initializations. */
442 return build_constructor (type, v);
445 else if (TREE_CODE (type) == ARRAY_TYPE)
447 vec<constructor_elt, va_gc> *v = NULL;
449 /* Iterate over the array elements, building initializations. */
450 tree max_index = array_type_nelts (type);
452 /* If we have an error_mark here, we should just return error mark
453 as we don't know the size of the array yet. */
454 if (max_index == error_mark_node)
456 if (complain & tf_error)
457 error ("cannot value-initialize array of unknown bound %qT",
458 type);
459 return error_mark_node;
461 gcc_assert (TREE_CODE (max_index) == INTEGER_CST);
463 /* A zero-sized array, which is accepted as an extension, will
464 have an upper bound of -1. */
465 if (!tree_int_cst_equal (max_index, integer_minus_one_node))
467 constructor_elt ce;
469 /* If this is a one element array, we just use a regular init. */
470 if (tree_int_cst_equal (size_zero_node, max_index))
471 ce.index = size_zero_node;
472 else
473 ce.index = build2 (RANGE_EXPR, sizetype, size_zero_node, max_index);
475 ce.value = build_value_init (TREE_TYPE (type), complain);
476 ce.value = maybe_constant_init (ce.value);
477 if (ce.value == error_mark_node)
478 return error_mark_node;
480 vec_alloc (v, 1);
481 v->quick_push (ce);
483 /* We shouldn't have gotten here for anything that would need
484 non-trivial initialization, and gimplify_init_ctor_preeval
485 would need to be fixed to allow it. */
486 gcc_assert (TREE_CODE (ce.value) != TARGET_EXPR
487 && TREE_CODE (ce.value) != AGGR_INIT_EXPR);
490 /* Build a constructor to contain the initializations. */
491 return build_constructor (type, v);
493 else if (TREE_CODE (type) == FUNCTION_TYPE)
495 if (complain & tf_error)
496 error ("value-initialization of function type %qT", type);
497 return error_mark_node;
499 else if (TREE_CODE (type) == REFERENCE_TYPE)
501 if (complain & tf_error)
502 error ("value-initialization of reference type %qT", type);
503 return error_mark_node;
506 return build_zero_init (type, NULL_TREE, /*static_storage_p=*/false);
509 /* Initialize current class with INIT, a TREE_LIST of
510 arguments for a target constructor. If TREE_LIST is void_type_node,
511 an empty initializer list was given. */
513 static void
514 perform_target_ctor (tree init)
516 tree decl = current_class_ref;
517 tree type = current_class_type;
519 finish_expr_stmt (build_aggr_init (decl, init,
520 LOOKUP_NORMAL|LOOKUP_DELEGATING_CONS,
521 tf_warning_or_error));
522 if (type_build_dtor_call (type))
524 tree expr = build_delete (type, decl, sfk_complete_destructor,
525 LOOKUP_NORMAL
526 |LOOKUP_NONVIRTUAL
527 |LOOKUP_DESTRUCTOR,
528 0, tf_warning_or_error);
529 if (expr != error_mark_node
530 && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type))
531 finish_eh_cleanup (expr);
535 /* Return the non-static data initializer for FIELD_DECL MEMBER. */
537 tree
538 get_nsdmi (tree member, bool in_ctor)
540 tree init;
541 tree save_ccp = current_class_ptr;
542 tree save_ccr = current_class_ref;
544 if (!in_ctor)
546 /* Use a PLACEHOLDER_EXPR when we don't have a 'this' parameter to
547 refer to; constexpr evaluation knows what to do with it. */
548 current_class_ref = build0 (PLACEHOLDER_EXPR, DECL_CONTEXT (member));
549 current_class_ptr = build_address (current_class_ref);
552 if (DECL_LANG_SPECIFIC (member) && DECL_TEMPLATE_INFO (member))
554 init = DECL_INITIAL (DECL_TI_TEMPLATE (member));
555 if (TREE_CODE (init) == DEFAULT_ARG)
556 goto unparsed;
558 /* Check recursive instantiation. */
559 if (DECL_INSTANTIATING_NSDMI_P (member))
561 error ("recursive instantiation of non-static data member "
562 "initializer for %qD", member);
563 init = error_mark_node;
565 else
567 DECL_INSTANTIATING_NSDMI_P (member) = 1;
569 /* Do deferred instantiation of the NSDMI. */
570 init = (tsubst_copy_and_build
571 (init, DECL_TI_ARGS (member),
572 tf_warning_or_error, member, /*function_p=*/false,
573 /*integral_constant_expression_p=*/false));
574 init = digest_nsdmi_init (member, init);
576 DECL_INSTANTIATING_NSDMI_P (member) = 0;
579 else
581 init = DECL_INITIAL (member);
582 if (init && TREE_CODE (init) == DEFAULT_ARG)
584 unparsed:
585 error ("constructor required before non-static data member "
586 "for %qD has been parsed", member);
587 DECL_INITIAL (member) = error_mark_node;
588 init = error_mark_node;
590 /* Strip redundant TARGET_EXPR so we don't need to remap it, and
591 so the aggregate init code below will see a CONSTRUCTOR. */
592 if (init && TREE_CODE (init) == TARGET_EXPR
593 && !VOID_TYPE_P (TREE_TYPE (TARGET_EXPR_INITIAL (init))))
594 init = TARGET_EXPR_INITIAL (init);
595 init = break_out_target_exprs (init);
597 current_class_ptr = save_ccp;
598 current_class_ref = save_ccr;
599 return init;
602 /* Initialize MEMBER, a FIELD_DECL, with INIT, a TREE_LIST of
603 arguments. If TREE_LIST is void_type_node, an empty initializer
604 list was given; if NULL_TREE no initializer was given. */
606 static void
607 perform_member_init (tree member, tree init)
609 tree decl;
610 tree type = TREE_TYPE (member);
612 /* Use the non-static data member initializer if there was no
613 mem-initializer for this field. */
614 if (init == NULL_TREE)
615 init = get_nsdmi (member, /*ctor*/true);
617 if (init == error_mark_node)
618 return;
620 /* Effective C++ rule 12 requires that all data members be
621 initialized. */
622 if (warn_ecpp && init == NULL_TREE && TREE_CODE (type) != ARRAY_TYPE)
623 warning_at (DECL_SOURCE_LOCATION (current_function_decl), OPT_Weffc__,
624 "%qD should be initialized in the member initialization list",
625 member);
627 /* Get an lvalue for the data member. */
628 decl = build_class_member_access_expr (current_class_ref, member,
629 /*access_path=*/NULL_TREE,
630 /*preserve_reference=*/true,
631 tf_warning_or_error);
632 if (decl == error_mark_node)
633 return;
635 if (warn_init_self && init && TREE_CODE (init) == TREE_LIST
636 && TREE_CHAIN (init) == NULL_TREE)
638 tree val = TREE_VALUE (init);
639 /* Handle references. */
640 if (REFERENCE_REF_P (val))
641 val = TREE_OPERAND (val, 0);
642 if (TREE_CODE (val) == COMPONENT_REF && TREE_OPERAND (val, 1) == member
643 && TREE_OPERAND (val, 0) == current_class_ref)
644 warning_at (DECL_SOURCE_LOCATION (current_function_decl),
645 OPT_Winit_self, "%qD is initialized with itself",
646 member);
649 if (init == void_type_node)
651 /* mem() means value-initialization. */
652 if (TREE_CODE (type) == ARRAY_TYPE)
654 init = build_vec_init_expr (type, init, tf_warning_or_error);
655 init = build2 (INIT_EXPR, type, decl, init);
656 finish_expr_stmt (init);
658 else
660 tree value = build_value_init (type, tf_warning_or_error);
661 if (value == error_mark_node)
662 return;
663 init = build2 (INIT_EXPR, type, decl, value);
664 finish_expr_stmt (init);
667 /* Deal with this here, as we will get confused if we try to call the
668 assignment op for an anonymous union. This can happen in a
669 synthesized copy constructor. */
670 else if (ANON_AGGR_TYPE_P (type))
672 if (init)
674 init = build2 (INIT_EXPR, type, decl, TREE_VALUE (init));
675 finish_expr_stmt (init);
678 else if (init
679 && (TREE_CODE (type) == REFERENCE_TYPE
680 /* Pre-digested NSDMI. */
681 || (((TREE_CODE (init) == CONSTRUCTOR
682 && TREE_TYPE (init) == type)
683 /* { } mem-initializer. */
684 || (TREE_CODE (init) == TREE_LIST
685 && DIRECT_LIST_INIT_P (TREE_VALUE (init))))
686 && (CP_AGGREGATE_TYPE_P (type)
687 || is_std_init_list (type)))))
689 /* With references and list-initialization, we need to deal with
690 extending temporary lifetimes. 12.2p5: "A temporary bound to a
691 reference member in a constructor’s ctor-initializer (12.6.2)
692 persists until the constructor exits." */
693 unsigned i; tree t;
694 vec<tree, va_gc> *cleanups = make_tree_vector ();
695 if (TREE_CODE (init) == TREE_LIST)
696 init = build_x_compound_expr_from_list (init, ELK_MEM_INIT,
697 tf_warning_or_error);
698 if (TREE_TYPE (init) != type)
700 if (BRACE_ENCLOSED_INITIALIZER_P (init)
701 && CP_AGGREGATE_TYPE_P (type))
702 init = reshape_init (type, init, tf_warning_or_error);
703 init = digest_init (type, init, tf_warning_or_error);
705 if (init == error_mark_node)
706 return;
707 /* A FIELD_DECL doesn't really have a suitable lifetime, but
708 make_temporary_var_for_ref_to_temp will treat it as automatic and
709 set_up_extended_ref_temp wants to use the decl in a warning. */
710 init = extend_ref_init_temps (member, init, &cleanups);
711 if (TREE_CODE (type) == ARRAY_TYPE
712 && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (type)))
713 init = build_vec_init_expr (type, init, tf_warning_or_error);
714 init = build2 (INIT_EXPR, type, decl, init);
715 finish_expr_stmt (init);
716 FOR_EACH_VEC_ELT (*cleanups, i, t)
717 push_cleanup (decl, t, false);
718 release_tree_vector (cleanups);
720 else if (type_build_ctor_call (type)
721 || (init && CLASS_TYPE_P (strip_array_types (type))))
723 if (TREE_CODE (type) == ARRAY_TYPE)
725 if (init)
727 if (TREE_CHAIN (init))
728 init = error_mark_node;
729 else
730 init = TREE_VALUE (init);
731 if (BRACE_ENCLOSED_INITIALIZER_P (init))
732 init = digest_init (type, init, tf_warning_or_error);
734 if (init == NULL_TREE
735 || same_type_ignoring_top_level_qualifiers_p (type,
736 TREE_TYPE (init)))
738 init = build_vec_init_expr (type, init, tf_warning_or_error);
739 init = build2 (INIT_EXPR, type, decl, init);
740 finish_expr_stmt (init);
742 else
743 error ("invalid initializer for array member %q#D", member);
745 else
747 int flags = LOOKUP_NORMAL;
748 if (DECL_DEFAULTED_FN (current_function_decl))
749 flags |= LOOKUP_DEFAULTED;
750 if (CP_TYPE_CONST_P (type)
751 && init == NULL_TREE
752 && default_init_uninitialized_part (type))
754 /* TYPE_NEEDS_CONSTRUCTING can be set just because we have a
755 vtable; still give this diagnostic. */
756 if (permerror (DECL_SOURCE_LOCATION (current_function_decl),
757 "uninitialized const member in %q#T", type))
758 inform (DECL_SOURCE_LOCATION (member),
759 "%q#D should be initialized", member );
761 finish_expr_stmt (build_aggr_init (decl, init, flags,
762 tf_warning_or_error));
765 else
767 if (init == NULL_TREE)
769 tree core_type;
770 /* member traversal: note it leaves init NULL */
771 if (TREE_CODE (type) == REFERENCE_TYPE)
773 if (permerror (DECL_SOURCE_LOCATION (current_function_decl),
774 "uninitialized reference member in %q#T", type))
775 inform (DECL_SOURCE_LOCATION (member),
776 "%q#D should be initialized", member);
778 else if (CP_TYPE_CONST_P (type))
780 if (permerror (DECL_SOURCE_LOCATION (current_function_decl),
781 "uninitialized const member in %q#T", type))
782 inform (DECL_SOURCE_LOCATION (member),
783 "%q#D should be initialized", member );
786 core_type = strip_array_types (type);
788 if (CLASS_TYPE_P (core_type)
789 && (CLASSTYPE_READONLY_FIELDS_NEED_INIT (core_type)
790 || CLASSTYPE_REF_FIELDS_NEED_INIT (core_type)))
791 diagnose_uninitialized_cst_or_ref_member (core_type,
792 /*using_new=*/false,
793 /*complain=*/true);
795 else if (TREE_CODE (init) == TREE_LIST)
796 /* There was an explicit member initialization. Do some work
797 in that case. */
798 init = build_x_compound_expr_from_list (init, ELK_MEM_INIT,
799 tf_warning_or_error);
801 if (init)
802 finish_expr_stmt (cp_build_modify_expr (decl, INIT_EXPR, init,
803 tf_warning_or_error));
806 if (type_build_dtor_call (type))
808 tree expr;
810 expr = build_class_member_access_expr (current_class_ref, member,
811 /*access_path=*/NULL_TREE,
812 /*preserve_reference=*/false,
813 tf_warning_or_error);
814 expr = build_delete (type, expr, sfk_complete_destructor,
815 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0,
816 tf_warning_or_error);
818 if (expr != error_mark_node
819 && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type))
820 finish_eh_cleanup (expr);
824 /* Returns a TREE_LIST containing (as the TREE_PURPOSE of each node) all
825 the FIELD_DECLs on the TYPE_FIELDS list for T, in reverse order. */
827 static tree
828 build_field_list (tree t, tree list, int *uses_unions_p)
830 tree fields;
832 /* Note whether or not T is a union. */
833 if (TREE_CODE (t) == UNION_TYPE)
834 *uses_unions_p = 1;
836 for (fields = TYPE_FIELDS (t); fields; fields = DECL_CHAIN (fields))
838 tree fieldtype;
840 /* Skip CONST_DECLs for enumeration constants and so forth. */
841 if (TREE_CODE (fields) != FIELD_DECL || DECL_ARTIFICIAL (fields))
842 continue;
844 fieldtype = TREE_TYPE (fields);
845 /* Keep track of whether or not any fields are unions. */
846 if (TREE_CODE (fieldtype) == UNION_TYPE)
847 *uses_unions_p = 1;
849 /* For an anonymous struct or union, we must recursively
850 consider the fields of the anonymous type. They can be
851 directly initialized from the constructor. */
852 if (ANON_AGGR_TYPE_P (fieldtype))
854 /* Add this field itself. Synthesized copy constructors
855 initialize the entire aggregate. */
856 list = tree_cons (fields, NULL_TREE, list);
857 /* And now add the fields in the anonymous aggregate. */
858 list = build_field_list (fieldtype, list, uses_unions_p);
860 /* Add this field. */
861 else if (DECL_NAME (fields))
862 list = tree_cons (fields, NULL_TREE, list);
865 return list;
868 /* The MEM_INITS are a TREE_LIST. The TREE_PURPOSE of each list gives
869 a FIELD_DECL or BINFO in T that needs initialization. The
870 TREE_VALUE gives the initializer, or list of initializer arguments.
872 Return a TREE_LIST containing all of the initializations required
873 for T, in the order in which they should be performed. The output
874 list has the same format as the input. */
876 static tree
877 sort_mem_initializers (tree t, tree mem_inits)
879 tree init;
880 tree base, binfo, base_binfo;
881 tree sorted_inits;
882 tree next_subobject;
883 vec<tree, va_gc> *vbases;
884 int i;
885 int uses_unions_p = 0;
887 /* Build up a list of initializations. The TREE_PURPOSE of entry
888 will be the subobject (a FIELD_DECL or BINFO) to initialize. The
889 TREE_VALUE will be the constructor arguments, or NULL if no
890 explicit initialization was provided. */
891 sorted_inits = NULL_TREE;
893 /* Process the virtual bases. */
894 for (vbases = CLASSTYPE_VBASECLASSES (t), i = 0;
895 vec_safe_iterate (vbases, i, &base); i++)
896 sorted_inits = tree_cons (base, NULL_TREE, sorted_inits);
898 /* Process the direct bases. */
899 for (binfo = TYPE_BINFO (t), i = 0;
900 BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i)
901 if (!BINFO_VIRTUAL_P (base_binfo))
902 sorted_inits = tree_cons (base_binfo, NULL_TREE, sorted_inits);
904 /* Process the non-static data members. */
905 sorted_inits = build_field_list (t, sorted_inits, &uses_unions_p);
906 /* Reverse the entire list of initializations, so that they are in
907 the order that they will actually be performed. */
908 sorted_inits = nreverse (sorted_inits);
910 /* If the user presented the initializers in an order different from
911 that in which they will actually occur, we issue a warning. Keep
912 track of the next subobject which can be explicitly initialized
913 without issuing a warning. */
914 next_subobject = sorted_inits;
916 /* Go through the explicit initializers, filling in TREE_PURPOSE in
917 the SORTED_INITS. */
918 for (init = mem_inits; init; init = TREE_CHAIN (init))
920 tree subobject;
921 tree subobject_init;
923 subobject = TREE_PURPOSE (init);
925 /* If the explicit initializers are in sorted order, then
926 SUBOBJECT will be NEXT_SUBOBJECT, or something following
927 it. */
928 for (subobject_init = next_subobject;
929 subobject_init;
930 subobject_init = TREE_CHAIN (subobject_init))
931 if (TREE_PURPOSE (subobject_init) == subobject)
932 break;
934 /* Issue a warning if the explicit initializer order does not
935 match that which will actually occur.
936 ??? Are all these on the correct lines? */
937 if (warn_reorder && !subobject_init)
939 if (TREE_CODE (TREE_PURPOSE (next_subobject)) == FIELD_DECL)
940 warning (OPT_Wreorder, "%q+D will be initialized after",
941 TREE_PURPOSE (next_subobject));
942 else
943 warning (OPT_Wreorder, "base %qT will be initialized after",
944 TREE_PURPOSE (next_subobject));
945 if (TREE_CODE (subobject) == FIELD_DECL)
946 warning (OPT_Wreorder, " %q+#D", subobject);
947 else
948 warning (OPT_Wreorder, " base %qT", subobject);
949 warning_at (DECL_SOURCE_LOCATION (current_function_decl),
950 OPT_Wreorder, " when initialized here");
953 /* Look again, from the beginning of the list. */
954 if (!subobject_init)
956 subobject_init = sorted_inits;
957 while (TREE_PURPOSE (subobject_init) != subobject)
958 subobject_init = TREE_CHAIN (subobject_init);
961 /* It is invalid to initialize the same subobject more than
962 once. */
963 if (TREE_VALUE (subobject_init))
965 if (TREE_CODE (subobject) == FIELD_DECL)
966 error_at (DECL_SOURCE_LOCATION (current_function_decl),
967 "multiple initializations given for %qD",
968 subobject);
969 else
970 error_at (DECL_SOURCE_LOCATION (current_function_decl),
971 "multiple initializations given for base %qT",
972 subobject);
975 /* Record the initialization. */
976 TREE_VALUE (subobject_init) = TREE_VALUE (init);
977 next_subobject = subobject_init;
980 /* [class.base.init]
982 If a ctor-initializer specifies more than one mem-initializer for
983 multiple members of the same union (including members of
984 anonymous unions), the ctor-initializer is ill-formed.
986 Here we also splice out uninitialized union members. */
987 if (uses_unions_p)
989 tree *last_p = NULL;
990 tree *p;
991 for (p = &sorted_inits; *p; )
993 tree field;
994 tree ctx;
996 init = *p;
998 field = TREE_PURPOSE (init);
1000 /* Skip base classes. */
1001 if (TREE_CODE (field) != FIELD_DECL)
1002 goto next;
1004 /* If this is an anonymous union with no explicit initializer,
1005 splice it out. */
1006 if (!TREE_VALUE (init) && ANON_UNION_TYPE_P (TREE_TYPE (field)))
1007 goto splice;
1009 /* See if this field is a member of a union, or a member of a
1010 structure contained in a union, etc. */
1011 for (ctx = DECL_CONTEXT (field);
1012 !same_type_p (ctx, t);
1013 ctx = TYPE_CONTEXT (ctx))
1014 if (TREE_CODE (ctx) == UNION_TYPE
1015 || !ANON_AGGR_TYPE_P (ctx))
1016 break;
1017 /* If this field is not a member of a union, skip it. */
1018 if (TREE_CODE (ctx) != UNION_TYPE)
1019 goto next;
1021 /* If this union member has no explicit initializer and no NSDMI,
1022 splice it out. */
1023 if (TREE_VALUE (init) || DECL_INITIAL (field))
1024 /* OK. */;
1025 else
1026 goto splice;
1028 /* It's only an error if we have two initializers for the same
1029 union type. */
1030 if (!last_p)
1032 last_p = p;
1033 goto next;
1036 /* See if LAST_FIELD and the field initialized by INIT are
1037 members of the same union. If so, there's a problem,
1038 unless they're actually members of the same structure
1039 which is itself a member of a union. For example, given:
1041 union { struct { int i; int j; }; };
1043 initializing both `i' and `j' makes sense. */
1044 ctx = common_enclosing_class (DECL_CONTEXT (field),
1045 DECL_CONTEXT (TREE_PURPOSE (*last_p)));
1047 if (ctx && TREE_CODE (ctx) == UNION_TYPE)
1049 /* A mem-initializer hides an NSDMI. */
1050 if (TREE_VALUE (init) && !TREE_VALUE (*last_p))
1051 *last_p = TREE_CHAIN (*last_p);
1052 else if (TREE_VALUE (*last_p) && !TREE_VALUE (init))
1053 goto splice;
1054 else
1056 error_at (DECL_SOURCE_LOCATION (current_function_decl),
1057 "initializations for multiple members of %qT",
1058 ctx);
1059 goto splice;
1063 last_p = p;
1065 next:
1066 p = &TREE_CHAIN (*p);
1067 continue;
1068 splice:
1069 *p = TREE_CHAIN (*p);
1070 continue;
1074 return sorted_inits;
1077 /* Initialize all bases and members of CURRENT_CLASS_TYPE. MEM_INITS
1078 is a TREE_LIST giving the explicit mem-initializer-list for the
1079 constructor. The TREE_PURPOSE of each entry is a subobject (a
1080 FIELD_DECL or a BINFO) of the CURRENT_CLASS_TYPE. The TREE_VALUE
1081 is a TREE_LIST giving the arguments to the constructor or
1082 void_type_node for an empty list of arguments. */
1084 void
1085 emit_mem_initializers (tree mem_inits)
1087 int flags = LOOKUP_NORMAL;
1089 /* We will already have issued an error message about the fact that
1090 the type is incomplete. */
1091 if (!COMPLETE_TYPE_P (current_class_type))
1092 return;
1094 if (mem_inits
1095 && TYPE_P (TREE_PURPOSE (mem_inits))
1096 && same_type_p (TREE_PURPOSE (mem_inits), current_class_type))
1098 /* Delegating constructor. */
1099 gcc_assert (TREE_CHAIN (mem_inits) == NULL_TREE);
1100 perform_target_ctor (TREE_VALUE (mem_inits));
1101 return;
1104 if (DECL_DEFAULTED_FN (current_function_decl)
1105 && ! DECL_INHERITED_CTOR_BASE (current_function_decl))
1106 flags |= LOOKUP_DEFAULTED;
1108 /* Sort the mem-initializers into the order in which the
1109 initializations should be performed. */
1110 mem_inits = sort_mem_initializers (current_class_type, mem_inits);
1112 in_base_initializer = 1;
1114 /* Initialize base classes. */
1115 for (; (mem_inits
1116 && TREE_CODE (TREE_PURPOSE (mem_inits)) != FIELD_DECL);
1117 mem_inits = TREE_CHAIN (mem_inits))
1119 tree subobject = TREE_PURPOSE (mem_inits);
1120 tree arguments = TREE_VALUE (mem_inits);
1122 /* We already have issued an error message. */
1123 if (arguments == error_mark_node)
1124 continue;
1126 if (arguments == NULL_TREE)
1128 /* If these initializations are taking place in a copy constructor,
1129 the base class should probably be explicitly initialized if there
1130 is a user-defined constructor in the base class (other than the
1131 default constructor, which will be called anyway). */
1132 if (extra_warnings
1133 && DECL_COPY_CONSTRUCTOR_P (current_function_decl)
1134 && type_has_user_nondefault_constructor (BINFO_TYPE (subobject)))
1135 warning_at (DECL_SOURCE_LOCATION (current_function_decl),
1136 OPT_Wextra, "base class %q#T should be explicitly "
1137 "initialized in the copy constructor",
1138 BINFO_TYPE (subobject));
1141 /* Initialize the base. */
1142 if (BINFO_VIRTUAL_P (subobject))
1143 construct_virtual_base (subobject, arguments);
1144 else
1146 tree base_addr;
1148 base_addr = build_base_path (PLUS_EXPR, current_class_ptr,
1149 subobject, 1, tf_warning_or_error);
1150 expand_aggr_init_1 (subobject, NULL_TREE,
1151 cp_build_indirect_ref (base_addr, RO_NULL,
1152 tf_warning_or_error),
1153 arguments,
1154 flags,
1155 tf_warning_or_error);
1156 expand_cleanup_for_base (subobject, NULL_TREE);
1159 in_base_initializer = 0;
1161 /* Initialize the vptrs. */
1162 initialize_vtbl_ptrs (current_class_ptr);
1164 /* Initialize the data members. */
1165 while (mem_inits)
1167 perform_member_init (TREE_PURPOSE (mem_inits),
1168 TREE_VALUE (mem_inits));
1169 mem_inits = TREE_CHAIN (mem_inits);
1173 /* Returns the address of the vtable (i.e., the value that should be
1174 assigned to the vptr) for BINFO. */
1176 tree
1177 build_vtbl_address (tree binfo)
1179 tree binfo_for = binfo;
1180 tree vtbl;
1182 if (BINFO_VPTR_INDEX (binfo) && BINFO_VIRTUAL_P (binfo))
1183 /* If this is a virtual primary base, then the vtable we want to store
1184 is that for the base this is being used as the primary base of. We
1185 can't simply skip the initialization, because we may be expanding the
1186 inits of a subobject constructor where the virtual base layout
1187 can be different. */
1188 while (BINFO_PRIMARY_P (binfo_for))
1189 binfo_for = BINFO_INHERITANCE_CHAIN (binfo_for);
1191 /* Figure out what vtable BINFO's vtable is based on, and mark it as
1192 used. */
1193 vtbl = get_vtbl_decl_for_binfo (binfo_for);
1194 TREE_USED (vtbl) = true;
1196 /* Now compute the address to use when initializing the vptr. */
1197 vtbl = unshare_expr (BINFO_VTABLE (binfo_for));
1198 if (VAR_P (vtbl))
1199 vtbl = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (vtbl)), vtbl);
1201 return vtbl;
1204 /* This code sets up the virtual function tables appropriate for
1205 the pointer DECL. It is a one-ply initialization.
1207 BINFO is the exact type that DECL is supposed to be. In
1208 multiple inheritance, this might mean "C's A" if C : A, B. */
1210 static void
1211 expand_virtual_init (tree binfo, tree decl)
1213 tree vtbl, vtbl_ptr;
1214 tree vtt_index;
1216 /* Compute the initializer for vptr. */
1217 vtbl = build_vtbl_address (binfo);
1219 /* We may get this vptr from a VTT, if this is a subobject
1220 constructor or subobject destructor. */
1221 vtt_index = BINFO_VPTR_INDEX (binfo);
1222 if (vtt_index)
1224 tree vtbl2;
1225 tree vtt_parm;
1227 /* Compute the value to use, when there's a VTT. */
1228 vtt_parm = current_vtt_parm;
1229 vtbl2 = fold_build_pointer_plus (vtt_parm, vtt_index);
1230 vtbl2 = cp_build_indirect_ref (vtbl2, RO_NULL, tf_warning_or_error);
1231 vtbl2 = convert (TREE_TYPE (vtbl), vtbl2);
1233 /* The actual initializer is the VTT value only in the subobject
1234 constructor. In maybe_clone_body we'll substitute NULL for
1235 the vtt_parm in the case of the non-subobject constructor. */
1236 vtbl = build3 (COND_EXPR,
1237 TREE_TYPE (vtbl),
1238 build2 (EQ_EXPR, boolean_type_node,
1239 current_in_charge_parm, integer_zero_node),
1240 vtbl2,
1241 vtbl);
1244 /* Compute the location of the vtpr. */
1245 vtbl_ptr = build_vfield_ref (cp_build_indirect_ref (decl, RO_NULL,
1246 tf_warning_or_error),
1247 TREE_TYPE (binfo));
1248 gcc_assert (vtbl_ptr != error_mark_node);
1250 /* Assign the vtable to the vptr. */
1251 vtbl = convert_force (TREE_TYPE (vtbl_ptr), vtbl, 0, tf_warning_or_error);
1252 finish_expr_stmt (cp_build_modify_expr (vtbl_ptr, NOP_EXPR, vtbl,
1253 tf_warning_or_error));
1256 /* If an exception is thrown in a constructor, those base classes already
1257 constructed must be destroyed. This function creates the cleanup
1258 for BINFO, which has just been constructed. If FLAG is non-NULL,
1259 it is a DECL which is nonzero when this base needs to be
1260 destroyed. */
1262 static void
1263 expand_cleanup_for_base (tree binfo, tree flag)
1265 tree expr;
1267 if (!type_build_dtor_call (BINFO_TYPE (binfo)))
1268 return;
1270 /* Call the destructor. */
1271 expr = build_special_member_call (current_class_ref,
1272 base_dtor_identifier,
1273 NULL,
1274 binfo,
1275 LOOKUP_NORMAL | LOOKUP_NONVIRTUAL,
1276 tf_warning_or_error);
1278 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (BINFO_TYPE (binfo)))
1279 return;
1281 if (flag)
1282 expr = fold_build3_loc (input_location,
1283 COND_EXPR, void_type_node,
1284 c_common_truthvalue_conversion (input_location, flag),
1285 expr, integer_zero_node);
1287 finish_eh_cleanup (expr);
1290 /* Construct the virtual base-class VBASE passing the ARGUMENTS to its
1291 constructor. */
1293 static void
1294 construct_virtual_base (tree vbase, tree arguments)
1296 tree inner_if_stmt;
1297 tree exp;
1298 tree flag;
1300 /* If there are virtual base classes with destructors, we need to
1301 emit cleanups to destroy them if an exception is thrown during
1302 the construction process. These exception regions (i.e., the
1303 period during which the cleanups must occur) begin from the time
1304 the construction is complete to the end of the function. If we
1305 create a conditional block in which to initialize the
1306 base-classes, then the cleanup region for the virtual base begins
1307 inside a block, and ends outside of that block. This situation
1308 confuses the sjlj exception-handling code. Therefore, we do not
1309 create a single conditional block, but one for each
1310 initialization. (That way the cleanup regions always begin
1311 in the outer block.) We trust the back end to figure out
1312 that the FLAG will not change across initializations, and
1313 avoid doing multiple tests. */
1314 flag = DECL_CHAIN (DECL_ARGUMENTS (current_function_decl));
1315 inner_if_stmt = begin_if_stmt ();
1316 finish_if_stmt_cond (flag, inner_if_stmt);
1318 /* Compute the location of the virtual base. If we're
1319 constructing virtual bases, then we must be the most derived
1320 class. Therefore, we don't have to look up the virtual base;
1321 we already know where it is. */
1322 exp = convert_to_base_statically (current_class_ref, vbase);
1324 expand_aggr_init_1 (vbase, current_class_ref, exp, arguments,
1325 0, tf_warning_or_error);
1326 finish_then_clause (inner_if_stmt);
1327 finish_if_stmt (inner_if_stmt);
1329 expand_cleanup_for_base (vbase, flag);
1332 /* Find the context in which this FIELD can be initialized. */
1334 static tree
1335 initializing_context (tree field)
1337 tree t = DECL_CONTEXT (field);
1339 /* Anonymous union members can be initialized in the first enclosing
1340 non-anonymous union context. */
1341 while (t && ANON_AGGR_TYPE_P (t))
1342 t = TYPE_CONTEXT (t);
1343 return t;
1346 /* Function to give error message if member initialization specification
1347 is erroneous. FIELD is the member we decided to initialize.
1348 TYPE is the type for which the initialization is being performed.
1349 FIELD must be a member of TYPE.
1351 MEMBER_NAME is the name of the member. */
1353 static int
1354 member_init_ok_or_else (tree field, tree type, tree member_name)
1356 if (field == error_mark_node)
1357 return 0;
1358 if (!field)
1360 error ("class %qT does not have any field named %qD", type,
1361 member_name);
1362 return 0;
1364 if (VAR_P (field))
1366 error ("%q#D is a static data member; it can only be "
1367 "initialized at its definition",
1368 field);
1369 return 0;
1371 if (TREE_CODE (field) != FIELD_DECL)
1373 error ("%q#D is not a non-static data member of %qT",
1374 field, type);
1375 return 0;
1377 if (initializing_context (field) != type)
1379 error ("class %qT does not have any field named %qD", type,
1380 member_name);
1381 return 0;
1384 return 1;
1387 /* NAME is a FIELD_DECL, an IDENTIFIER_NODE which names a field, or it
1388 is a _TYPE node or TYPE_DECL which names a base for that type.
1389 Check the validity of NAME, and return either the base _TYPE, base
1390 binfo, or the FIELD_DECL of the member. If NAME is invalid, return
1391 NULL_TREE and issue a diagnostic.
1393 An old style unnamed direct single base construction is permitted,
1394 where NAME is NULL. */
1396 tree
1397 expand_member_init (tree name)
1399 tree basetype;
1400 tree field;
1402 if (!current_class_ref)
1403 return NULL_TREE;
1405 if (!name)
1407 /* This is an obsolete unnamed base class initializer. The
1408 parser will already have warned about its use. */
1409 switch (BINFO_N_BASE_BINFOS (TYPE_BINFO (current_class_type)))
1411 case 0:
1412 error ("unnamed initializer for %qT, which has no base classes",
1413 current_class_type);
1414 return NULL_TREE;
1415 case 1:
1416 basetype = BINFO_TYPE
1417 (BINFO_BASE_BINFO (TYPE_BINFO (current_class_type), 0));
1418 break;
1419 default:
1420 error ("unnamed initializer for %qT, which uses multiple inheritance",
1421 current_class_type);
1422 return NULL_TREE;
1425 else if (TYPE_P (name))
1427 basetype = TYPE_MAIN_VARIANT (name);
1428 name = TYPE_NAME (name);
1430 else if (TREE_CODE (name) == TYPE_DECL)
1431 basetype = TYPE_MAIN_VARIANT (TREE_TYPE (name));
1432 else
1433 basetype = NULL_TREE;
1435 if (basetype)
1437 tree class_binfo;
1438 tree direct_binfo;
1439 tree virtual_binfo;
1440 int i;
1442 if (current_template_parms
1443 || same_type_p (basetype, current_class_type))
1444 return basetype;
1446 class_binfo = TYPE_BINFO (current_class_type);
1447 direct_binfo = NULL_TREE;
1448 virtual_binfo = NULL_TREE;
1450 /* Look for a direct base. */
1451 for (i = 0; BINFO_BASE_ITERATE (class_binfo, i, direct_binfo); ++i)
1452 if (SAME_BINFO_TYPE_P (BINFO_TYPE (direct_binfo), basetype))
1453 break;
1455 /* Look for a virtual base -- unless the direct base is itself
1456 virtual. */
1457 if (!direct_binfo || !BINFO_VIRTUAL_P (direct_binfo))
1458 virtual_binfo = binfo_for_vbase (basetype, current_class_type);
1460 /* [class.base.init]
1462 If a mem-initializer-id is ambiguous because it designates
1463 both a direct non-virtual base class and an inherited virtual
1464 base class, the mem-initializer is ill-formed. */
1465 if (direct_binfo && virtual_binfo)
1467 error ("%qD is both a direct base and an indirect virtual base",
1468 basetype);
1469 return NULL_TREE;
1472 if (!direct_binfo && !virtual_binfo)
1474 if (CLASSTYPE_VBASECLASSES (current_class_type))
1475 error ("type %qT is not a direct or virtual base of %qT",
1476 basetype, current_class_type);
1477 else
1478 error ("type %qT is not a direct base of %qT",
1479 basetype, current_class_type);
1480 return NULL_TREE;
1483 return direct_binfo ? direct_binfo : virtual_binfo;
1485 else
1487 if (identifier_p (name))
1488 field = lookup_field (current_class_type, name, 1, false);
1489 else
1490 field = name;
1492 if (member_init_ok_or_else (field, current_class_type, name))
1493 return field;
1496 return NULL_TREE;
1499 /* This is like `expand_member_init', only it stores one aggregate
1500 value into another.
1502 INIT comes in two flavors: it is either a value which
1503 is to be stored in EXP, or it is a parameter list
1504 to go to a constructor, which will operate on EXP.
1505 If INIT is not a parameter list for a constructor, then set
1506 LOOKUP_ONLYCONVERTING.
1507 If FLAGS is LOOKUP_ONLYCONVERTING then it is the = init form of
1508 the initializer, if FLAGS is 0, then it is the (init) form.
1509 If `init' is a CONSTRUCTOR, then we emit a warning message,
1510 explaining that such initializations are invalid.
1512 If INIT resolves to a CALL_EXPR which happens to return
1513 something of the type we are looking for, then we know
1514 that we can safely use that call to perform the
1515 initialization.
1517 The virtual function table pointer cannot be set up here, because
1518 we do not really know its type.
1520 This never calls operator=().
1522 When initializing, nothing is CONST.
1524 A default copy constructor may have to be used to perform the
1525 initialization.
1527 A constructor or a conversion operator may have to be used to
1528 perform the initialization, but not both, as it would be ambiguous. */
1530 tree
1531 build_aggr_init (tree exp, tree init, int flags, tsubst_flags_t complain)
1533 tree stmt_expr;
1534 tree compound_stmt;
1535 int destroy_temps;
1536 tree type = TREE_TYPE (exp);
1537 int was_const = TREE_READONLY (exp);
1538 int was_volatile = TREE_THIS_VOLATILE (exp);
1539 int is_global;
1541 if (init == error_mark_node)
1542 return error_mark_node;
1544 TREE_READONLY (exp) = 0;
1545 TREE_THIS_VOLATILE (exp) = 0;
1547 if (init && init != void_type_node
1548 && TREE_CODE (init) != TREE_LIST
1549 && !(TREE_CODE (init) == TARGET_EXPR
1550 && TARGET_EXPR_DIRECT_INIT_P (init))
1551 && !DIRECT_LIST_INIT_P (init))
1552 flags |= LOOKUP_ONLYCONVERTING;
1554 if (TREE_CODE (type) == ARRAY_TYPE)
1556 tree itype;
1558 /* An array may not be initialized use the parenthesized
1559 initialization form -- unless the initializer is "()". */
1560 if (init && TREE_CODE (init) == TREE_LIST)
1562 if (complain & tf_error)
1563 error ("bad array initializer");
1564 return error_mark_node;
1566 /* Must arrange to initialize each element of EXP
1567 from elements of INIT. */
1568 itype = init ? TREE_TYPE (init) : NULL_TREE;
1569 if (cv_qualified_p (type))
1570 TREE_TYPE (exp) = cv_unqualified (type);
1571 if (itype && cv_qualified_p (itype))
1572 TREE_TYPE (init) = cv_unqualified (itype);
1573 stmt_expr = build_vec_init (exp, NULL_TREE, init,
1574 /*explicit_value_init_p=*/false,
1575 itype && same_type_p (TREE_TYPE (init),
1576 TREE_TYPE (exp)),
1577 complain);
1578 TREE_READONLY (exp) = was_const;
1579 TREE_THIS_VOLATILE (exp) = was_volatile;
1580 TREE_TYPE (exp) = type;
1581 /* Restore the type of init unless it was used directly. */
1582 if (init && TREE_CODE (stmt_expr) != INIT_EXPR)
1583 TREE_TYPE (init) = itype;
1584 return stmt_expr;
1587 if ((VAR_P (exp) || TREE_CODE (exp) == PARM_DECL)
1588 && !lookup_attribute ("warn_unused", TYPE_ATTRIBUTES (type)))
1589 /* Just know that we've seen something for this node. */
1590 TREE_USED (exp) = 1;
1592 is_global = begin_init_stmts (&stmt_expr, &compound_stmt);
1593 destroy_temps = stmts_are_full_exprs_p ();
1594 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
1595 expand_aggr_init_1 (TYPE_BINFO (type), exp, exp,
1596 init, LOOKUP_NORMAL|flags, complain);
1597 stmt_expr = finish_init_stmts (is_global, stmt_expr, compound_stmt);
1598 current_stmt_tree ()->stmts_are_full_exprs_p = destroy_temps;
1599 TREE_READONLY (exp) = was_const;
1600 TREE_THIS_VOLATILE (exp) = was_volatile;
1602 return stmt_expr;
1605 static void
1606 expand_default_init (tree binfo, tree true_exp, tree exp, tree init, int flags,
1607 tsubst_flags_t complain)
1609 tree type = TREE_TYPE (exp);
1610 tree ctor_name;
1612 /* It fails because there may not be a constructor which takes
1613 its own type as the first (or only parameter), but which does
1614 take other types via a conversion. So, if the thing initializing
1615 the expression is a unit element of type X, first try X(X&),
1616 followed by initialization by X. If neither of these work
1617 out, then look hard. */
1618 tree rval;
1619 vec<tree, va_gc> *parms;
1621 /* If we have direct-initialization from an initializer list, pull
1622 it out of the TREE_LIST so the code below can see it. */
1623 if (init && TREE_CODE (init) == TREE_LIST
1624 && DIRECT_LIST_INIT_P (TREE_VALUE (init)))
1626 gcc_checking_assert ((flags & LOOKUP_ONLYCONVERTING) == 0
1627 && TREE_CHAIN (init) == NULL_TREE);
1628 init = TREE_VALUE (init);
1631 if (init && BRACE_ENCLOSED_INITIALIZER_P (init)
1632 && CP_AGGREGATE_TYPE_P (type))
1633 /* A brace-enclosed initializer for an aggregate. In C++0x this can
1634 happen for direct-initialization, too. */
1636 init = reshape_init (type, init, complain);
1637 init = digest_init (type, init, complain);
1640 /* A CONSTRUCTOR of the target's type is a previously digested
1641 initializer, whether that happened just above or in
1642 cp_parser_late_parsing_nsdmi.
1644 A TARGET_EXPR with TARGET_EXPR_DIRECT_INIT_P or TARGET_EXPR_LIST_INIT_P
1645 set represents the whole initialization, so we shouldn't build up
1646 another ctor call. */
1647 if (init
1648 && (TREE_CODE (init) == CONSTRUCTOR
1649 || (TREE_CODE (init) == TARGET_EXPR
1650 && (TARGET_EXPR_DIRECT_INIT_P (init)
1651 || TARGET_EXPR_LIST_INIT_P (init))))
1652 && same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (init), type))
1654 /* Early initialization via a TARGET_EXPR only works for
1655 complete objects. */
1656 gcc_assert (TREE_CODE (init) == CONSTRUCTOR || true_exp == exp);
1658 init = build2 (INIT_EXPR, TREE_TYPE (exp), exp, init);
1659 TREE_SIDE_EFFECTS (init) = 1;
1660 finish_expr_stmt (init);
1661 return;
1664 if (init && TREE_CODE (init) != TREE_LIST
1665 && (flags & LOOKUP_ONLYCONVERTING))
1667 /* Base subobjects should only get direct-initialization. */
1668 gcc_assert (true_exp == exp);
1670 if (flags & DIRECT_BIND)
1671 /* Do nothing. We hit this in two cases: Reference initialization,
1672 where we aren't initializing a real variable, so we don't want
1673 to run a new constructor; and catching an exception, where we
1674 have already built up the constructor call so we could wrap it
1675 in an exception region. */;
1676 else
1677 init = ocp_convert (type, init, CONV_IMPLICIT|CONV_FORCE_TEMP,
1678 flags, complain);
1680 if (TREE_CODE (init) == MUST_NOT_THROW_EXPR)
1681 /* We need to protect the initialization of a catch parm with a
1682 call to terminate(), which shows up as a MUST_NOT_THROW_EXPR
1683 around the TARGET_EXPR for the copy constructor. See
1684 initialize_handler_parm. */
1686 TREE_OPERAND (init, 0) = build2 (INIT_EXPR, TREE_TYPE (exp), exp,
1687 TREE_OPERAND (init, 0));
1688 TREE_TYPE (init) = void_type_node;
1690 else
1691 init = build2 (INIT_EXPR, TREE_TYPE (exp), exp, init);
1692 TREE_SIDE_EFFECTS (init) = 1;
1693 finish_expr_stmt (init);
1694 return;
1697 if (init == NULL_TREE)
1698 parms = NULL;
1699 else if (TREE_CODE (init) == TREE_LIST && !TREE_TYPE (init))
1701 parms = make_tree_vector ();
1702 for (; init != NULL_TREE; init = TREE_CHAIN (init))
1703 vec_safe_push (parms, TREE_VALUE (init));
1705 else
1706 parms = make_tree_vector_single (init);
1708 if (exp == current_class_ref && current_function_decl
1709 && DECL_HAS_IN_CHARGE_PARM_P (current_function_decl))
1711 /* Delegating constructor. */
1712 tree complete;
1713 tree base;
1714 tree elt; unsigned i;
1716 /* Unshare the arguments for the second call. */
1717 vec<tree, va_gc> *parms2 = make_tree_vector ();
1718 FOR_EACH_VEC_SAFE_ELT (parms, i, elt)
1720 elt = break_out_target_exprs (elt);
1721 vec_safe_push (parms2, elt);
1723 complete = build_special_member_call (exp, complete_ctor_identifier,
1724 &parms2, binfo, flags,
1725 complain);
1726 complete = fold_build_cleanup_point_expr (void_type_node, complete);
1727 release_tree_vector (parms2);
1729 base = build_special_member_call (exp, base_ctor_identifier,
1730 &parms, binfo, flags,
1731 complain);
1732 base = fold_build_cleanup_point_expr (void_type_node, base);
1733 rval = build3 (COND_EXPR, void_type_node,
1734 build2 (EQ_EXPR, boolean_type_node,
1735 current_in_charge_parm, integer_zero_node),
1736 base,
1737 complete);
1739 else
1741 if (true_exp == exp)
1742 ctor_name = complete_ctor_identifier;
1743 else
1744 ctor_name = base_ctor_identifier;
1745 rval = build_special_member_call (exp, ctor_name, &parms, binfo, flags,
1746 complain);
1749 if (parms != NULL)
1750 release_tree_vector (parms);
1752 if (exp == true_exp && TREE_CODE (rval) == CALL_EXPR)
1754 tree fn = get_callee_fndecl (rval);
1755 if (fn && DECL_DECLARED_CONSTEXPR_P (fn))
1757 tree e = maybe_constant_init (rval, exp);
1758 if (TREE_CONSTANT (e))
1759 rval = build2 (INIT_EXPR, type, exp, e);
1763 /* FIXME put back convert_to_void? */
1764 if (TREE_SIDE_EFFECTS (rval))
1765 finish_expr_stmt (rval);
1768 /* This function is responsible for initializing EXP with INIT
1769 (if any).
1771 BINFO is the binfo of the type for who we are performing the
1772 initialization. For example, if W is a virtual base class of A and B,
1773 and C : A, B.
1774 If we are initializing B, then W must contain B's W vtable, whereas
1775 were we initializing C, W must contain C's W vtable.
1777 TRUE_EXP is nonzero if it is the true expression being initialized.
1778 In this case, it may be EXP, or may just contain EXP. The reason we
1779 need this is because if EXP is a base element of TRUE_EXP, we
1780 don't necessarily know by looking at EXP where its virtual
1781 baseclass fields should really be pointing. But we do know
1782 from TRUE_EXP. In constructors, we don't know anything about
1783 the value being initialized.
1785 FLAGS is just passed to `build_new_method_call'. See that function
1786 for its description. */
1788 static void
1789 expand_aggr_init_1 (tree binfo, tree true_exp, tree exp, tree init, int flags,
1790 tsubst_flags_t complain)
1792 tree type = TREE_TYPE (exp);
1794 gcc_assert (init != error_mark_node && type != error_mark_node);
1795 gcc_assert (building_stmt_list_p ());
1797 /* Use a function returning the desired type to initialize EXP for us.
1798 If the function is a constructor, and its first argument is
1799 NULL_TREE, know that it was meant for us--just slide exp on
1800 in and expand the constructor. Constructors now come
1801 as TARGET_EXPRs. */
1803 if (init && VAR_P (exp)
1804 && COMPOUND_LITERAL_P (init))
1806 vec<tree, va_gc> *cleanups = NULL;
1807 /* If store_init_value returns NULL_TREE, the INIT has been
1808 recorded as the DECL_INITIAL for EXP. That means there's
1809 nothing more we have to do. */
1810 init = store_init_value (exp, init, &cleanups, flags);
1811 if (init)
1812 finish_expr_stmt (init);
1813 gcc_assert (!cleanups);
1814 return;
1817 /* If an explicit -- but empty -- initializer list was present,
1818 that's value-initialization. */
1819 if (init == void_type_node)
1821 /* If the type has data but no user-provided ctor, we need to zero
1822 out the object. */
1823 if (!type_has_user_provided_constructor (type)
1824 && !is_really_empty_class (type))
1826 tree field_size = NULL_TREE;
1827 if (exp != true_exp && CLASSTYPE_AS_BASE (type) != type)
1828 /* Don't clobber already initialized virtual bases. */
1829 field_size = TYPE_SIZE (CLASSTYPE_AS_BASE (type));
1830 init = build_zero_init_1 (type, NULL_TREE, /*static_storage_p=*/false,
1831 field_size);
1832 init = build2 (INIT_EXPR, type, exp, init);
1833 finish_expr_stmt (init);
1836 /* If we don't need to mess with the constructor at all,
1837 then we're done. */
1838 if (! type_build_ctor_call (type))
1839 return;
1841 /* Otherwise fall through and call the constructor. */
1842 init = NULL_TREE;
1845 /* We know that expand_default_init can handle everything we want
1846 at this point. */
1847 expand_default_init (binfo, true_exp, exp, init, flags, complain);
1850 /* Report an error if TYPE is not a user-defined, class type. If
1851 OR_ELSE is nonzero, give an error message. */
1854 is_class_type (tree type, int or_else)
1856 if (type == error_mark_node)
1857 return 0;
1859 if (! CLASS_TYPE_P (type))
1861 if (or_else)
1862 error ("%qT is not a class type", type);
1863 return 0;
1865 return 1;
1868 tree
1869 get_type_value (tree name)
1871 if (name == error_mark_node)
1872 return NULL_TREE;
1874 if (IDENTIFIER_HAS_TYPE_VALUE (name))
1875 return IDENTIFIER_TYPE_VALUE (name);
1876 else
1877 return NULL_TREE;
1880 /* Build a reference to a member of an aggregate. This is not a C++
1881 `&', but really something which can have its address taken, and
1882 then act as a pointer to member, for example TYPE :: FIELD can have
1883 its address taken by saying & TYPE :: FIELD. ADDRESS_P is true if
1884 this expression is the operand of "&".
1886 @@ Prints out lousy diagnostics for operator <typename>
1887 @@ fields.
1889 @@ This function should be rewritten and placed in search.c. */
1891 tree
1892 build_offset_ref (tree type, tree member, bool address_p,
1893 tsubst_flags_t complain)
1895 tree decl;
1896 tree basebinfo = NULL_TREE;
1898 /* class templates can come in as TEMPLATE_DECLs here. */
1899 if (TREE_CODE (member) == TEMPLATE_DECL)
1900 return member;
1902 if (dependent_scope_p (type) || type_dependent_expression_p (member))
1903 return build_qualified_name (NULL_TREE, type, member,
1904 /*template_p=*/false);
1906 gcc_assert (TYPE_P (type));
1907 if (! is_class_type (type, 1))
1908 return error_mark_node;
1910 gcc_assert (DECL_P (member) || BASELINK_P (member));
1911 /* Callers should call mark_used before this point. */
1912 gcc_assert (!DECL_P (member) || TREE_USED (member));
1914 type = TYPE_MAIN_VARIANT (type);
1915 if (!COMPLETE_OR_OPEN_TYPE_P (complete_type (type)))
1917 if (complain & tf_error)
1918 error ("incomplete type %qT does not have member %qD", type, member);
1919 return error_mark_node;
1922 /* Entities other than non-static members need no further
1923 processing. */
1924 if (TREE_CODE (member) == TYPE_DECL)
1925 return member;
1926 if (VAR_P (member) || TREE_CODE (member) == CONST_DECL)
1927 return convert_from_reference (member);
1929 if (TREE_CODE (member) == FIELD_DECL && DECL_C_BIT_FIELD (member))
1931 if (complain & tf_error)
1932 error ("invalid pointer to bit-field %qD", member);
1933 return error_mark_node;
1936 /* Set up BASEBINFO for member lookup. */
1937 decl = maybe_dummy_object (type, &basebinfo);
1939 /* A lot of this logic is now handled in lookup_member. */
1940 if (BASELINK_P (member))
1942 /* Go from the TREE_BASELINK to the member function info. */
1943 tree t = BASELINK_FUNCTIONS (member);
1945 if (TREE_CODE (t) != TEMPLATE_ID_EXPR && !really_overloaded_fn (t))
1947 /* Get rid of a potential OVERLOAD around it. */
1948 t = OVL_CURRENT (t);
1950 /* Unique functions are handled easily. */
1952 /* For non-static member of base class, we need a special rule
1953 for access checking [class.protected]:
1955 If the access is to form a pointer to member, the
1956 nested-name-specifier shall name the derived class
1957 (or any class derived from that class). */
1958 if (address_p && DECL_P (t)
1959 && DECL_NONSTATIC_MEMBER_P (t))
1960 perform_or_defer_access_check (TYPE_BINFO (type), t, t,
1961 complain);
1962 else
1963 perform_or_defer_access_check (basebinfo, t, t,
1964 complain);
1966 if (DECL_STATIC_FUNCTION_P (t))
1967 return t;
1968 member = t;
1970 else
1971 TREE_TYPE (member) = unknown_type_node;
1973 else if (address_p && TREE_CODE (member) == FIELD_DECL)
1974 /* We need additional test besides the one in
1975 check_accessibility_of_qualified_id in case it is
1976 a pointer to non-static member. */
1977 perform_or_defer_access_check (TYPE_BINFO (type), member, member,
1978 complain);
1980 if (!address_p)
1982 /* If MEMBER is non-static, then the program has fallen afoul of
1983 [expr.prim]:
1985 An id-expression that denotes a nonstatic data member or
1986 nonstatic member function of a class can only be used:
1988 -- as part of a class member access (_expr.ref_) in which the
1989 object-expression refers to the member's class or a class
1990 derived from that class, or
1992 -- to form a pointer to member (_expr.unary.op_), or
1994 -- in the body of a nonstatic member function of that class or
1995 of a class derived from that class (_class.mfct.nonstatic_), or
1997 -- in a mem-initializer for a constructor for that class or for
1998 a class derived from that class (_class.base.init_). */
1999 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (member))
2001 /* Build a representation of the qualified name suitable
2002 for use as the operand to "&" -- even though the "&" is
2003 not actually present. */
2004 member = build2 (OFFSET_REF, TREE_TYPE (member), decl, member);
2005 /* In Microsoft mode, treat a non-static member function as if
2006 it were a pointer-to-member. */
2007 if (flag_ms_extensions)
2009 PTRMEM_OK_P (member) = 1;
2010 return cp_build_addr_expr (member, complain);
2012 if (complain & tf_error)
2013 error ("invalid use of non-static member function %qD",
2014 TREE_OPERAND (member, 1));
2015 return error_mark_node;
2017 else if (TREE_CODE (member) == FIELD_DECL)
2019 if (complain & tf_error)
2020 error ("invalid use of non-static data member %qD", member);
2021 return error_mark_node;
2023 return member;
2026 member = build2 (OFFSET_REF, TREE_TYPE (member), decl, member);
2027 PTRMEM_OK_P (member) = 1;
2028 return member;
2031 /* If DECL is a scalar enumeration constant or variable with a
2032 constant initializer, return the initializer (or, its initializers,
2033 recursively); otherwise, return DECL. If STRICT_P, the
2034 initializer is only returned if DECL is a
2035 constant-expression. If RETURN_AGGREGATE_CST_OK_P, it is ok to
2036 return an aggregate constant. */
2038 static tree
2039 constant_value_1 (tree decl, bool strict_p, bool return_aggregate_cst_ok_p)
2041 while (TREE_CODE (decl) == CONST_DECL
2042 || (strict_p
2043 ? decl_constant_var_p (decl)
2044 : (VAR_P (decl)
2045 && CP_TYPE_CONST_NON_VOLATILE_P (TREE_TYPE (decl)))))
2047 tree init;
2048 /* If DECL is a static data member in a template
2049 specialization, we must instantiate it here. The
2050 initializer for the static data member is not processed
2051 until needed; we need it now. */
2052 mark_used (decl, tf_none);
2053 mark_rvalue_use (decl);
2054 init = DECL_INITIAL (decl);
2055 if (init == error_mark_node)
2057 if (DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl))
2058 /* Treat the error as a constant to avoid cascading errors on
2059 excessively recursive template instantiation (c++/9335). */
2060 return init;
2061 else
2062 return decl;
2064 /* Initializers in templates are generally expanded during
2065 instantiation, so before that for const int i(2)
2066 INIT is a TREE_LIST with the actual initializer as
2067 TREE_VALUE. */
2068 if (processing_template_decl
2069 && init
2070 && TREE_CODE (init) == TREE_LIST
2071 && TREE_CHAIN (init) == NULL_TREE)
2072 init = TREE_VALUE (init);
2073 if (!init
2074 || !TREE_TYPE (init)
2075 || !TREE_CONSTANT (init)
2076 || (!return_aggregate_cst_ok_p
2077 /* Unless RETURN_AGGREGATE_CST_OK_P is true, do not
2078 return an aggregate constant (of which string
2079 literals are a special case), as we do not want
2080 to make inadvertent copies of such entities, and
2081 we must be sure that their addresses are the
2082 same everywhere. */
2083 && (TREE_CODE (init) == CONSTRUCTOR
2084 || TREE_CODE (init) == STRING_CST)))
2085 break;
2086 decl = unshare_expr (init);
2088 return decl;
2091 /* If DECL is a CONST_DECL, or a constant VAR_DECL initialized by constant
2092 of integral or enumeration type, or a constexpr variable of scalar type,
2093 then return that value. These are those variables permitted in constant
2094 expressions by [5.19/1]. */
2096 tree
2097 scalar_constant_value (tree decl)
2099 return constant_value_1 (decl, /*strict_p=*/true,
2100 /*return_aggregate_cst_ok_p=*/false);
2103 /* Like scalar_constant_value, but can also return aggregate initializers. */
2105 tree
2106 decl_really_constant_value (tree decl)
2108 return constant_value_1 (decl, /*strict_p=*/true,
2109 /*return_aggregate_cst_ok_p=*/true);
2112 /* A more relaxed version of scalar_constant_value, used by the
2113 common C/C++ code. */
2115 tree
2116 decl_constant_value (tree decl)
2118 return constant_value_1 (decl, /*strict_p=*/processing_template_decl,
2119 /*return_aggregate_cst_ok_p=*/true);
2122 /* Common subroutines of build_new and build_vec_delete. */
2124 /* Build and return a NEW_EXPR. If NELTS is non-NULL, TYPE[NELTS] is
2125 the type of the object being allocated; otherwise, it's just TYPE.
2126 INIT is the initializer, if any. USE_GLOBAL_NEW is true if the
2127 user explicitly wrote "::operator new". PLACEMENT, if non-NULL, is
2128 a vector of arguments to be provided as arguments to a placement
2129 new operator. This routine performs no semantic checks; it just
2130 creates and returns a NEW_EXPR. */
2132 static tree
2133 build_raw_new_expr (vec<tree, va_gc> *placement, tree type, tree nelts,
2134 vec<tree, va_gc> *init, int use_global_new)
2136 tree init_list;
2137 tree new_expr;
2139 /* If INIT is NULL, the we want to store NULL_TREE in the NEW_EXPR.
2140 If INIT is not NULL, then we want to store VOID_ZERO_NODE. This
2141 permits us to distinguish the case of a missing initializer "new
2142 int" from an empty initializer "new int()". */
2143 if (init == NULL)
2144 init_list = NULL_TREE;
2145 else if (init->is_empty ())
2146 init_list = void_node;
2147 else
2148 init_list = build_tree_list_vec (init);
2150 new_expr = build4 (NEW_EXPR, build_pointer_type (type),
2151 build_tree_list_vec (placement), type, nelts,
2152 init_list);
2153 NEW_EXPR_USE_GLOBAL (new_expr) = use_global_new;
2154 TREE_SIDE_EFFECTS (new_expr) = 1;
2156 return new_expr;
2159 /* Diagnose uninitialized const members or reference members of type
2160 TYPE. USING_NEW is used to disambiguate the diagnostic between a
2161 new expression without a new-initializer and a declaration. Returns
2162 the error count. */
2164 static int
2165 diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin,
2166 bool using_new, bool complain)
2168 tree field;
2169 int error_count = 0;
2171 if (type_has_user_provided_constructor (type))
2172 return 0;
2174 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
2176 tree field_type;
2178 if (TREE_CODE (field) != FIELD_DECL)
2179 continue;
2181 field_type = strip_array_types (TREE_TYPE (field));
2183 if (type_has_user_provided_constructor (field_type))
2184 continue;
2186 if (TREE_CODE (field_type) == REFERENCE_TYPE)
2188 ++ error_count;
2189 if (complain)
2191 if (DECL_CONTEXT (field) == origin)
2193 if (using_new)
2194 error ("uninitialized reference member in %q#T "
2195 "using %<new%> without new-initializer", origin);
2196 else
2197 error ("uninitialized reference member in %q#T", origin);
2199 else
2201 if (using_new)
2202 error ("uninitialized reference member in base %q#T "
2203 "of %q#T using %<new%> without new-initializer",
2204 DECL_CONTEXT (field), origin);
2205 else
2206 error ("uninitialized reference member in base %q#T "
2207 "of %q#T", DECL_CONTEXT (field), origin);
2209 inform (DECL_SOURCE_LOCATION (field),
2210 "%q#D should be initialized", field);
2214 if (CP_TYPE_CONST_P (field_type))
2216 ++ error_count;
2217 if (complain)
2219 if (DECL_CONTEXT (field) == origin)
2221 if (using_new)
2222 error ("uninitialized const member in %q#T "
2223 "using %<new%> without new-initializer", origin);
2224 else
2225 error ("uninitialized const member in %q#T", origin);
2227 else
2229 if (using_new)
2230 error ("uninitialized const member in base %q#T "
2231 "of %q#T using %<new%> without new-initializer",
2232 DECL_CONTEXT (field), origin);
2233 else
2234 error ("uninitialized const member in base %q#T "
2235 "of %q#T", DECL_CONTEXT (field), origin);
2237 inform (DECL_SOURCE_LOCATION (field),
2238 "%q#D should be initialized", field);
2242 if (CLASS_TYPE_P (field_type))
2243 error_count
2244 += diagnose_uninitialized_cst_or_ref_member_1 (field_type, origin,
2245 using_new, complain);
2247 return error_count;
2251 diagnose_uninitialized_cst_or_ref_member (tree type, bool using_new, bool complain)
2253 return diagnose_uninitialized_cst_or_ref_member_1 (type, type, using_new, complain);
2256 /* Call __cxa_bad_array_new_length to indicate that the size calculation
2257 overflowed. Pretend it returns sizetype so that it plays nicely in the
2258 COND_EXPR. */
2260 tree
2261 throw_bad_array_new_length (void)
2263 tree fn = get_identifier ("__cxa_throw_bad_array_new_length");
2264 if (!get_global_value_if_present (fn, &fn))
2265 fn = push_throw_library_fn (fn, build_function_type_list (sizetype,
2266 NULL_TREE));
2268 return build_cxx_call (fn, 0, NULL, tf_warning_or_error);
2271 /* Generate code for a new-expression, including calling the "operator
2272 new" function, initializing the object, and, if an exception occurs
2273 during construction, cleaning up. The arguments are as for
2274 build_raw_new_expr. This may change PLACEMENT and INIT. */
2276 static tree
2277 build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
2278 vec<tree, va_gc> **init, bool globally_qualified_p,
2279 tsubst_flags_t complain)
2281 tree size, rval;
2282 /* True iff this is a call to "operator new[]" instead of just
2283 "operator new". */
2284 bool array_p = false;
2285 /* If ARRAY_P is true, the element type of the array. This is never
2286 an ARRAY_TYPE; for something like "new int[3][4]", the
2287 ELT_TYPE is "int". If ARRAY_P is false, this is the same type as
2288 TYPE. */
2289 tree elt_type;
2290 /* The type of the new-expression. (This type is always a pointer
2291 type.) */
2292 tree pointer_type;
2293 tree non_const_pointer_type;
2294 tree outer_nelts = NULL_TREE;
2295 /* For arrays, a bounds checks on the NELTS parameter. */
2296 tree outer_nelts_check = NULL_TREE;
2297 bool outer_nelts_from_type = false;
2298 offset_int inner_nelts_count = 1;
2299 tree alloc_call, alloc_expr;
2300 /* Size of the inner array elements. */
2301 offset_int inner_size;
2302 /* The address returned by the call to "operator new". This node is
2303 a VAR_DECL and is therefore reusable. */
2304 tree alloc_node;
2305 tree alloc_fn;
2306 tree cookie_expr, init_expr;
2307 int nothrow, check_new;
2308 int use_java_new = 0;
2309 /* If non-NULL, the number of extra bytes to allocate at the
2310 beginning of the storage allocated for an array-new expression in
2311 order to store the number of elements. */
2312 tree cookie_size = NULL_TREE;
2313 tree placement_first;
2314 tree placement_expr = NULL_TREE;
2315 /* True if the function we are calling is a placement allocation
2316 function. */
2317 bool placement_allocation_fn_p;
2318 /* True if the storage must be initialized, either by a constructor
2319 or due to an explicit new-initializer. */
2320 bool is_initialized;
2321 /* The address of the thing allocated, not including any cookie. In
2322 particular, if an array cookie is in use, DATA_ADDR is the
2323 address of the first array element. This node is a VAR_DECL, and
2324 is therefore reusable. */
2325 tree data_addr;
2326 tree init_preeval_expr = NULL_TREE;
2327 tree orig_type = type;
2329 if (nelts)
2331 outer_nelts = nelts;
2332 array_p = true;
2334 else if (TREE_CODE (type) == ARRAY_TYPE)
2336 /* Transforms new (T[N]) to new T[N]. The former is a GNU
2337 extension for variable N. (This also covers new T where T is
2338 a VLA typedef.) */
2339 array_p = true;
2340 nelts = array_type_nelts_top (type);
2341 outer_nelts = nelts;
2342 type = TREE_TYPE (type);
2343 outer_nelts_from_type = true;
2346 /* If our base type is an array, then make sure we know how many elements
2347 it has. */
2348 for (elt_type = type;
2349 TREE_CODE (elt_type) == ARRAY_TYPE;
2350 elt_type = TREE_TYPE (elt_type))
2352 tree inner_nelts = array_type_nelts_top (elt_type);
2353 tree inner_nelts_cst = maybe_constant_value (inner_nelts);
2354 if (TREE_CODE (inner_nelts_cst) == INTEGER_CST)
2356 bool overflow;
2357 offset_int result = wi::mul (wi::to_offset (inner_nelts_cst),
2358 inner_nelts_count, SIGNED, &overflow);
2359 if (overflow)
2361 if (complain & tf_error)
2362 error ("integer overflow in array size");
2363 nelts = error_mark_node;
2365 inner_nelts_count = result;
2367 else
2369 if (complain & tf_error)
2371 error_at (EXPR_LOC_OR_LOC (inner_nelts, input_location),
2372 "array size in new-expression must be constant");
2373 cxx_constant_value(inner_nelts);
2375 nelts = error_mark_node;
2377 if (nelts != error_mark_node)
2378 nelts = cp_build_binary_op (input_location,
2379 MULT_EXPR, nelts,
2380 inner_nelts_cst,
2381 complain);
2384 if (variably_modified_type_p (elt_type, NULL_TREE) && (complain & tf_error))
2386 error ("variably modified type not allowed in new-expression");
2387 return error_mark_node;
2390 if (nelts == error_mark_node)
2391 return error_mark_node;
2393 /* Warn if we performed the (T[N]) to T[N] transformation and N is
2394 variable. */
2395 if (outer_nelts_from_type
2396 && !TREE_CONSTANT (maybe_constant_value (outer_nelts)))
2398 if (complain & tf_warning_or_error)
2400 const char *msg;
2401 if (typedef_variant_p (orig_type))
2402 msg = ("non-constant array new length must be specified "
2403 "directly, not by typedef");
2404 else
2405 msg = ("non-constant array new length must be specified "
2406 "without parentheses around the type-id");
2407 pedwarn (EXPR_LOC_OR_LOC (outer_nelts, input_location),
2408 OPT_Wvla, msg);
2410 else
2411 return error_mark_node;
2414 if (VOID_TYPE_P (elt_type))
2416 if (complain & tf_error)
2417 error ("invalid type %<void%> for new");
2418 return error_mark_node;
2421 if (abstract_virtuals_error_sfinae (ACU_NEW, elt_type, complain))
2422 return error_mark_node;
2424 is_initialized = (type_build_ctor_call (elt_type) || *init != NULL);
2426 if (*init == NULL && cxx_dialect < cxx11)
2428 bool maybe_uninitialized_error = false;
2429 /* A program that calls for default-initialization [...] of an
2430 entity of reference type is ill-formed. */
2431 if (CLASSTYPE_REF_FIELDS_NEED_INIT (elt_type))
2432 maybe_uninitialized_error = true;
2434 /* A new-expression that creates an object of type T initializes
2435 that object as follows:
2436 - If the new-initializer is omitted:
2437 -- If T is a (possibly cv-qualified) non-POD class type
2438 (or array thereof), the object is default-initialized (8.5).
2439 [...]
2440 -- Otherwise, the object created has indeterminate
2441 value. If T is a const-qualified type, or a (possibly
2442 cv-qualified) POD class type (or array thereof)
2443 containing (directly or indirectly) a member of
2444 const-qualified type, the program is ill-formed; */
2446 if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (elt_type))
2447 maybe_uninitialized_error = true;
2449 if (maybe_uninitialized_error
2450 && diagnose_uninitialized_cst_or_ref_member (elt_type,
2451 /*using_new=*/true,
2452 complain & tf_error))
2453 return error_mark_node;
2456 if (CP_TYPE_CONST_P (elt_type) && *init == NULL
2457 && default_init_uninitialized_part (elt_type))
2459 if (complain & tf_error)
2460 error ("uninitialized const in %<new%> of %q#T", elt_type);
2461 return error_mark_node;
2464 size = size_in_bytes (elt_type);
2465 if (array_p)
2467 /* Maximum available size in bytes. Half of the address space
2468 minus the cookie size. */
2469 offset_int max_size
2470 = wi::set_bit_in_zero <offset_int> (TYPE_PRECISION (sizetype) - 1);
2471 /* Maximum number of outer elements which can be allocated. */
2472 offset_int max_outer_nelts;
2473 tree max_outer_nelts_tree;
2475 gcc_assert (TREE_CODE (size) == INTEGER_CST);
2476 cookie_size = targetm.cxx.get_cookie_size (elt_type);
2477 gcc_assert (TREE_CODE (cookie_size) == INTEGER_CST);
2478 gcc_checking_assert (wi::ltu_p (wi::to_offset (cookie_size), max_size));
2479 /* Unconditionally subtract the cookie size. This decreases the
2480 maximum object size and is safe even if we choose not to use
2481 a cookie after all. */
2482 max_size -= wi::to_offset (cookie_size);
2483 bool overflow;
2484 inner_size = wi::mul (wi::to_offset (size), inner_nelts_count, SIGNED,
2485 &overflow);
2486 if (overflow || wi::gtu_p (inner_size, max_size))
2488 if (complain & tf_error)
2489 error ("size of array is too large");
2490 return error_mark_node;
2493 max_outer_nelts = wi::udiv_trunc (max_size, inner_size);
2494 /* Only keep the top-most seven bits, to simplify encoding the
2495 constant in the instruction stream. */
2497 unsigned shift = (max_outer_nelts.get_precision ()) - 7
2498 - wi::clz (max_outer_nelts);
2499 max_outer_nelts = wi::lshift (wi::lrshift (max_outer_nelts, shift),
2500 shift);
2502 max_outer_nelts_tree = wide_int_to_tree (sizetype, max_outer_nelts);
2504 size = size_binop (MULT_EXPR, size, convert (sizetype, nelts));
2505 outer_nelts_check = fold_build2 (LE_EXPR, boolean_type_node,
2506 outer_nelts,
2507 max_outer_nelts_tree);
2510 alloc_fn = NULL_TREE;
2512 /* If PLACEMENT is a single simple pointer type not passed by
2513 reference, prepare to capture it in a temporary variable. Do
2514 this now, since PLACEMENT will change in the calls below. */
2515 placement_first = NULL_TREE;
2516 if (vec_safe_length (*placement) == 1
2517 && (TYPE_PTR_P (TREE_TYPE ((**placement)[0]))))
2518 placement_first = (**placement)[0];
2520 /* Allocate the object. */
2521 if (vec_safe_is_empty (*placement) && TYPE_FOR_JAVA (elt_type))
2523 tree class_addr;
2524 tree class_decl;
2525 static const char alloc_name[] = "_Jv_AllocObject";
2527 if (!MAYBE_CLASS_TYPE_P (elt_type))
2529 error ("%qT isn%'t a valid Java class type", elt_type);
2530 return error_mark_node;
2533 class_decl = build_java_class_ref (elt_type);
2534 if (class_decl == error_mark_node)
2535 return error_mark_node;
2537 use_java_new = 1;
2538 if (!get_global_value_if_present (get_identifier (alloc_name),
2539 &alloc_fn))
2541 if (complain & tf_error)
2542 error ("call to Java constructor with %qs undefined", alloc_name);
2543 return error_mark_node;
2545 else if (really_overloaded_fn (alloc_fn))
2547 if (complain & tf_error)
2548 error ("%qD should never be overloaded", alloc_fn);
2549 return error_mark_node;
2551 alloc_fn = OVL_CURRENT (alloc_fn);
2552 class_addr = build1 (ADDR_EXPR, jclass_node, class_decl);
2553 alloc_call = cp_build_function_call_nary (alloc_fn, complain,
2554 class_addr, NULL_TREE);
2556 else if (TYPE_FOR_JAVA (elt_type) && MAYBE_CLASS_TYPE_P (elt_type))
2558 error ("Java class %q#T object allocated using placement new", elt_type);
2559 return error_mark_node;
2561 else
2563 tree fnname;
2564 tree fns;
2566 fnname = ansi_opname (array_p ? VEC_NEW_EXPR : NEW_EXPR);
2568 if (!globally_qualified_p
2569 && CLASS_TYPE_P (elt_type)
2570 && (array_p
2571 ? TYPE_HAS_ARRAY_NEW_OPERATOR (elt_type)
2572 : TYPE_HAS_NEW_OPERATOR (elt_type)))
2574 /* Use a class-specific operator new. */
2575 /* If a cookie is required, add some extra space. */
2576 if (array_p && TYPE_VEC_NEW_USES_COOKIE (elt_type))
2577 size = size_binop (PLUS_EXPR, size, cookie_size);
2578 else
2580 cookie_size = NULL_TREE;
2581 /* No size arithmetic necessary, so the size check is
2582 not needed. */
2583 if (outer_nelts_check != NULL && inner_size == 1)
2584 outer_nelts_check = NULL_TREE;
2586 /* Perform the overflow check. */
2587 tree errval = TYPE_MAX_VALUE (sizetype);
2588 if (cxx_dialect >= cxx11 && flag_exceptions)
2589 errval = throw_bad_array_new_length ();
2590 if (outer_nelts_check != NULL_TREE)
2591 size = fold_build3 (COND_EXPR, sizetype, outer_nelts_check,
2592 size, errval);
2593 /* Create the argument list. */
2594 vec_safe_insert (*placement, 0, size);
2595 /* Do name-lookup to find the appropriate operator. */
2596 fns = lookup_fnfields (elt_type, fnname, /*protect=*/2);
2597 if (fns == NULL_TREE)
2599 if (complain & tf_error)
2600 error ("no suitable %qD found in class %qT", fnname, elt_type);
2601 return error_mark_node;
2603 if (TREE_CODE (fns) == TREE_LIST)
2605 if (complain & tf_error)
2607 error ("request for member %qD is ambiguous", fnname);
2608 print_candidates (fns);
2610 return error_mark_node;
2612 alloc_call = build_new_method_call (build_dummy_object (elt_type),
2613 fns, placement,
2614 /*conversion_path=*/NULL_TREE,
2615 LOOKUP_NORMAL,
2616 &alloc_fn,
2617 complain);
2619 else
2621 /* Use a global operator new. */
2622 /* See if a cookie might be required. */
2623 if (!(array_p && TYPE_VEC_NEW_USES_COOKIE (elt_type)))
2625 cookie_size = NULL_TREE;
2626 /* No size arithmetic necessary, so the size check is
2627 not needed. */
2628 if (outer_nelts_check != NULL && inner_size == 1)
2629 outer_nelts_check = NULL_TREE;
2632 alloc_call = build_operator_new_call (fnname, placement,
2633 &size, &cookie_size,
2634 outer_nelts_check,
2635 &alloc_fn, complain);
2639 if (alloc_call == error_mark_node)
2640 return error_mark_node;
2642 gcc_assert (alloc_fn != NULL_TREE);
2644 /* If we found a simple case of PLACEMENT_EXPR above, then copy it
2645 into a temporary variable. */
2646 if (!processing_template_decl
2647 && placement_first != NULL_TREE
2648 && TREE_CODE (alloc_call) == CALL_EXPR
2649 && call_expr_nargs (alloc_call) == 2
2650 && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (alloc_call, 0))) == INTEGER_TYPE
2651 && TYPE_PTR_P (TREE_TYPE (CALL_EXPR_ARG (alloc_call, 1))))
2653 tree placement_arg = CALL_EXPR_ARG (alloc_call, 1);
2655 if (INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (TREE_TYPE (placement_arg)))
2656 || VOID_TYPE_P (TREE_TYPE (TREE_TYPE (placement_arg))))
2658 placement_expr = get_target_expr (placement_first);
2659 CALL_EXPR_ARG (alloc_call, 1)
2660 = convert (TREE_TYPE (placement_arg), placement_expr);
2664 /* In the simple case, we can stop now. */
2665 pointer_type = build_pointer_type (type);
2666 if (!cookie_size && !is_initialized)
2667 return build_nop (pointer_type, alloc_call);
2669 /* Store the result of the allocation call in a variable so that we can
2670 use it more than once. */
2671 alloc_expr = get_target_expr (alloc_call);
2672 alloc_node = TARGET_EXPR_SLOT (alloc_expr);
2674 /* Strip any COMPOUND_EXPRs from ALLOC_CALL. */
2675 while (TREE_CODE (alloc_call) == COMPOUND_EXPR)
2676 alloc_call = TREE_OPERAND (alloc_call, 1);
2678 /* Now, check to see if this function is actually a placement
2679 allocation function. This can happen even when PLACEMENT is NULL
2680 because we might have something like:
2682 struct S { void* operator new (size_t, int i = 0); };
2684 A call to `new S' will get this allocation function, even though
2685 there is no explicit placement argument. If there is more than
2686 one argument, or there are variable arguments, then this is a
2687 placement allocation function. */
2688 placement_allocation_fn_p
2689 = (type_num_arguments (TREE_TYPE (alloc_fn)) > 1
2690 || varargs_function_p (alloc_fn));
2692 /* Preevaluate the placement args so that we don't reevaluate them for a
2693 placement delete. */
2694 if (placement_allocation_fn_p)
2696 tree inits;
2697 stabilize_call (alloc_call, &inits);
2698 if (inits)
2699 alloc_expr = build2 (COMPOUND_EXPR, TREE_TYPE (alloc_expr), inits,
2700 alloc_expr);
2703 /* unless an allocation function is declared with an empty excep-
2704 tion-specification (_except.spec_), throw(), it indicates failure to
2705 allocate storage by throwing a bad_alloc exception (clause _except_,
2706 _lib.bad.alloc_); it returns a non-null pointer otherwise If the allo-
2707 cation function is declared with an empty exception-specification,
2708 throw(), it returns null to indicate failure to allocate storage and a
2709 non-null pointer otherwise.
2711 So check for a null exception spec on the op new we just called. */
2713 nothrow = TYPE_NOTHROW_P (TREE_TYPE (alloc_fn));
2714 check_new = (flag_check_new || nothrow) && ! use_java_new;
2716 if (cookie_size)
2718 tree cookie;
2719 tree cookie_ptr;
2720 tree size_ptr_type;
2722 /* Adjust so we're pointing to the start of the object. */
2723 data_addr = fold_build_pointer_plus (alloc_node, cookie_size);
2725 /* Store the number of bytes allocated so that we can know how
2726 many elements to destroy later. We use the last sizeof
2727 (size_t) bytes to store the number of elements. */
2728 cookie_ptr = size_binop (MINUS_EXPR, cookie_size, size_in_bytes (sizetype));
2729 cookie_ptr = fold_build_pointer_plus_loc (input_location,
2730 alloc_node, cookie_ptr);
2731 size_ptr_type = build_pointer_type (sizetype);
2732 cookie_ptr = fold_convert (size_ptr_type, cookie_ptr);
2733 cookie = cp_build_indirect_ref (cookie_ptr, RO_NULL, complain);
2735 cookie_expr = build2 (MODIFY_EXPR, sizetype, cookie, nelts);
2737 if (targetm.cxx.cookie_has_size ())
2739 /* Also store the element size. */
2740 cookie_ptr = fold_build_pointer_plus (cookie_ptr,
2741 fold_build1_loc (input_location,
2742 NEGATE_EXPR, sizetype,
2743 size_in_bytes (sizetype)));
2745 cookie = cp_build_indirect_ref (cookie_ptr, RO_NULL, complain);
2746 cookie = build2 (MODIFY_EXPR, sizetype, cookie,
2747 size_in_bytes (elt_type));
2748 cookie_expr = build2 (COMPOUND_EXPR, TREE_TYPE (cookie_expr),
2749 cookie, cookie_expr);
2752 else
2754 cookie_expr = NULL_TREE;
2755 data_addr = alloc_node;
2758 /* Now use a pointer to the type we've actually allocated. */
2760 /* But we want to operate on a non-const version to start with,
2761 since we'll be modifying the elements. */
2762 non_const_pointer_type = build_pointer_type
2763 (cp_build_qualified_type (type, cp_type_quals (type) & ~TYPE_QUAL_CONST));
2765 data_addr = fold_convert (non_const_pointer_type, data_addr);
2766 /* Any further uses of alloc_node will want this type, too. */
2767 alloc_node = fold_convert (non_const_pointer_type, alloc_node);
2769 /* Now initialize the allocated object. Note that we preevaluate the
2770 initialization expression, apart from the actual constructor call or
2771 assignment--we do this because we want to delay the allocation as long
2772 as possible in order to minimize the size of the exception region for
2773 placement delete. */
2774 if (is_initialized)
2776 bool stable;
2777 bool explicit_value_init_p = false;
2779 if (*init != NULL && (*init)->is_empty ())
2781 *init = NULL;
2782 explicit_value_init_p = true;
2785 if (processing_template_decl && explicit_value_init_p)
2787 /* build_value_init doesn't work in templates, and we don't need
2788 the initializer anyway since we're going to throw it away and
2789 rebuild it at instantiation time, so just build up a single
2790 constructor call to get any appropriate diagnostics. */
2791 init_expr = cp_build_indirect_ref (data_addr, RO_NULL, complain);
2792 if (type_build_ctor_call (elt_type))
2793 init_expr = build_special_member_call (init_expr,
2794 complete_ctor_identifier,
2795 init, elt_type,
2796 LOOKUP_NORMAL,
2797 complain);
2798 stable = stabilize_init (init_expr, &init_preeval_expr);
2800 else if (array_p)
2802 tree vecinit = NULL_TREE;
2803 if (vec_safe_length (*init) == 1
2804 && DIRECT_LIST_INIT_P ((**init)[0]))
2806 vecinit = (**init)[0];
2807 if (CONSTRUCTOR_NELTS (vecinit) == 0)
2808 /* List-value-initialization, leave it alone. */;
2809 else
2811 tree arraytype, domain;
2812 if (TREE_CONSTANT (nelts))
2813 domain = compute_array_index_type (NULL_TREE, nelts,
2814 complain);
2815 else
2816 /* We'll check the length at runtime. */
2817 domain = NULL_TREE;
2818 arraytype = build_cplus_array_type (type, domain);
2819 vecinit = digest_init (arraytype, vecinit, complain);
2822 else if (*init)
2824 if (complain & tf_error)
2825 permerror (input_location,
2826 "parenthesized initializer in array new");
2827 else
2828 return error_mark_node;
2829 vecinit = build_tree_list_vec (*init);
2831 init_expr
2832 = build_vec_init (data_addr,
2833 cp_build_binary_op (input_location,
2834 MINUS_EXPR, outer_nelts,
2835 integer_one_node,
2836 complain),
2837 vecinit,
2838 explicit_value_init_p,
2839 /*from_array=*/0,
2840 complain);
2842 /* An array initialization is stable because the initialization
2843 of each element is a full-expression, so the temporaries don't
2844 leak out. */
2845 stable = true;
2847 else
2849 init_expr = cp_build_indirect_ref (data_addr, RO_NULL, complain);
2851 if (type_build_ctor_call (type) && !explicit_value_init_p)
2853 init_expr = build_special_member_call (init_expr,
2854 complete_ctor_identifier,
2855 init, elt_type,
2856 LOOKUP_NORMAL,
2857 complain);
2859 else if (explicit_value_init_p)
2861 /* Something like `new int()'. */
2862 tree val = build_value_init (type, complain);
2863 if (val == error_mark_node)
2864 return error_mark_node;
2865 init_expr = build2 (INIT_EXPR, type, init_expr, val);
2867 else
2869 tree ie;
2871 /* We are processing something like `new int (10)', which
2872 means allocate an int, and initialize it with 10. */
2874 ie = build_x_compound_expr_from_vec (*init, "new initializer",
2875 complain);
2876 init_expr = cp_build_modify_expr (init_expr, INIT_EXPR, ie,
2877 complain);
2879 stable = stabilize_init (init_expr, &init_preeval_expr);
2882 if (init_expr == error_mark_node)
2883 return error_mark_node;
2885 /* If any part of the object initialization terminates by throwing an
2886 exception and a suitable deallocation function can be found, the
2887 deallocation function is called to free the memory in which the
2888 object was being constructed, after which the exception continues
2889 to propagate in the context of the new-expression. If no
2890 unambiguous matching deallocation function can be found,
2891 propagating the exception does not cause the object's memory to be
2892 freed. */
2893 if (flag_exceptions && ! use_java_new)
2895 enum tree_code dcode = array_p ? VEC_DELETE_EXPR : DELETE_EXPR;
2896 tree cleanup;
2898 /* The Standard is unclear here, but the right thing to do
2899 is to use the same method for finding deallocation
2900 functions that we use for finding allocation functions. */
2901 cleanup = (build_op_delete_call
2902 (dcode,
2903 alloc_node,
2904 size,
2905 globally_qualified_p,
2906 placement_allocation_fn_p ? alloc_call : NULL_TREE,
2907 alloc_fn,
2908 complain));
2910 if (!cleanup)
2911 /* We're done. */;
2912 else if (stable)
2913 /* This is much simpler if we were able to preevaluate all of
2914 the arguments to the constructor call. */
2916 /* CLEANUP is compiler-generated, so no diagnostics. */
2917 TREE_NO_WARNING (cleanup) = true;
2918 init_expr = build2 (TRY_CATCH_EXPR, void_type_node,
2919 init_expr, cleanup);
2920 /* Likewise, this try-catch is compiler-generated. */
2921 TREE_NO_WARNING (init_expr) = true;
2923 else
2924 /* Ack! First we allocate the memory. Then we set our sentry
2925 variable to true, and expand a cleanup that deletes the
2926 memory if sentry is true. Then we run the constructor, and
2927 finally clear the sentry.
2929 We need to do this because we allocate the space first, so
2930 if there are any temporaries with cleanups in the
2931 constructor args and we weren't able to preevaluate them, we
2932 need this EH region to extend until end of full-expression
2933 to preserve nesting. */
2935 tree end, sentry, begin;
2937 begin = get_target_expr (boolean_true_node);
2938 CLEANUP_EH_ONLY (begin) = 1;
2940 sentry = TARGET_EXPR_SLOT (begin);
2942 /* CLEANUP is compiler-generated, so no diagnostics. */
2943 TREE_NO_WARNING (cleanup) = true;
2945 TARGET_EXPR_CLEANUP (begin)
2946 = build3 (COND_EXPR, void_type_node, sentry,
2947 cleanup, void_node);
2949 end = build2 (MODIFY_EXPR, TREE_TYPE (sentry),
2950 sentry, boolean_false_node);
2952 init_expr
2953 = build2 (COMPOUND_EXPR, void_type_node, begin,
2954 build2 (COMPOUND_EXPR, void_type_node, init_expr,
2955 end));
2956 /* Likewise, this is compiler-generated. */
2957 TREE_NO_WARNING (init_expr) = true;
2961 else
2962 init_expr = NULL_TREE;
2964 /* Now build up the return value in reverse order. */
2966 rval = data_addr;
2968 if (init_expr)
2969 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), init_expr, rval);
2970 if (cookie_expr)
2971 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), cookie_expr, rval);
2973 if (rval == data_addr)
2974 /* If we don't have an initializer or a cookie, strip the TARGET_EXPR
2975 and return the call (which doesn't need to be adjusted). */
2976 rval = TARGET_EXPR_INITIAL (alloc_expr);
2977 else
2979 if (check_new)
2981 tree ifexp = cp_build_binary_op (input_location,
2982 NE_EXPR, alloc_node,
2983 nullptr_node,
2984 complain);
2985 rval = build_conditional_expr (input_location, ifexp, rval,
2986 alloc_node, complain);
2989 /* Perform the allocation before anything else, so that ALLOC_NODE
2990 has been initialized before we start using it. */
2991 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), alloc_expr, rval);
2994 if (init_preeval_expr)
2995 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), init_preeval_expr, rval);
2997 /* A new-expression is never an lvalue. */
2998 gcc_assert (!lvalue_p (rval));
3000 return convert (pointer_type, rval);
3003 /* Generate a representation for a C++ "new" expression. *PLACEMENT
3004 is a vector of placement-new arguments (or NULL if none). If NELTS
3005 is NULL, TYPE is the type of the storage to be allocated. If NELTS
3006 is not NULL, then this is an array-new allocation; TYPE is the type
3007 of the elements in the array and NELTS is the number of elements in
3008 the array. *INIT, if non-NULL, is the initializer for the new
3009 object, or an empty vector to indicate an initializer of "()". If
3010 USE_GLOBAL_NEW is true, then the user explicitly wrote "::new"
3011 rather than just "new". This may change PLACEMENT and INIT. */
3013 tree
3014 build_new (vec<tree, va_gc> **placement, tree type, tree nelts,
3015 vec<tree, va_gc> **init, int use_global_new, tsubst_flags_t complain)
3017 tree rval;
3018 vec<tree, va_gc> *orig_placement = NULL;
3019 tree orig_nelts = NULL_TREE;
3020 vec<tree, va_gc> *orig_init = NULL;
3022 if (type == error_mark_node)
3023 return error_mark_node;
3025 if (nelts == NULL_TREE && vec_safe_length (*init) == 1
3026 /* Don't do auto deduction where it might affect mangling. */
3027 && (!processing_template_decl || at_function_scope_p ()))
3029 tree auto_node = type_uses_auto (type);
3030 if (auto_node)
3032 tree d_init = (**init)[0];
3033 d_init = resolve_nondeduced_context (d_init);
3034 type = do_auto_deduction (type, d_init, auto_node);
3038 if (processing_template_decl)
3040 if (dependent_type_p (type)
3041 || any_type_dependent_arguments_p (*placement)
3042 || (nelts && type_dependent_expression_p (nelts))
3043 || (nelts && *init)
3044 || any_type_dependent_arguments_p (*init))
3045 return build_raw_new_expr (*placement, type, nelts, *init,
3046 use_global_new);
3048 orig_placement = make_tree_vector_copy (*placement);
3049 orig_nelts = nelts;
3050 if (*init)
3051 orig_init = make_tree_vector_copy (*init);
3053 make_args_non_dependent (*placement);
3054 if (nelts)
3055 nelts = build_non_dependent_expr (nelts);
3056 make_args_non_dependent (*init);
3059 if (nelts)
3061 if (!build_expr_type_conversion (WANT_INT | WANT_ENUM, nelts, false))
3063 if (complain & tf_error)
3064 permerror (input_location, "size in array new must have integral type");
3065 else
3066 return error_mark_node;
3068 nelts = mark_rvalue_use (nelts);
3069 nelts = cp_save_expr (cp_convert (sizetype, nelts, complain));
3072 /* ``A reference cannot be created by the new operator. A reference
3073 is not an object (8.2.2, 8.4.3), so a pointer to it could not be
3074 returned by new.'' ARM 5.3.3 */
3075 if (TREE_CODE (type) == REFERENCE_TYPE)
3077 if (complain & tf_error)
3078 error ("new cannot be applied to a reference type");
3079 else
3080 return error_mark_node;
3081 type = TREE_TYPE (type);
3084 if (TREE_CODE (type) == FUNCTION_TYPE)
3086 if (complain & tf_error)
3087 error ("new cannot be applied to a function type");
3088 return error_mark_node;
3091 /* The type allocated must be complete. If the new-type-id was
3092 "T[N]" then we are just checking that "T" is complete here, but
3093 that is equivalent, since the value of "N" doesn't matter. */
3094 if (!complete_type_or_maybe_complain (type, NULL_TREE, complain))
3095 return error_mark_node;
3097 rval = build_new_1 (placement, type, nelts, init, use_global_new, complain);
3098 if (rval == error_mark_node)
3099 return error_mark_node;
3101 if (processing_template_decl)
3103 tree ret = build_raw_new_expr (orig_placement, type, orig_nelts,
3104 orig_init, use_global_new);
3105 release_tree_vector (orig_placement);
3106 release_tree_vector (orig_init);
3107 return ret;
3110 /* Wrap it in a NOP_EXPR so warn_if_unused_value doesn't complain. */
3111 rval = build1 (NOP_EXPR, TREE_TYPE (rval), rval);
3112 TREE_NO_WARNING (rval) = 1;
3114 return rval;
3117 /* Given a Java class, return a decl for the corresponding java.lang.Class. */
3119 tree
3120 build_java_class_ref (tree type)
3122 tree name = NULL_TREE, class_decl;
3123 static tree CL_suffix = NULL_TREE;
3124 if (CL_suffix == NULL_TREE)
3125 CL_suffix = get_identifier("class$");
3126 if (jclass_node == NULL_TREE)
3128 jclass_node = IDENTIFIER_GLOBAL_VALUE (get_identifier ("jclass"));
3129 if (jclass_node == NULL_TREE)
3131 error ("call to Java constructor, while %<jclass%> undefined");
3132 return error_mark_node;
3134 jclass_node = TREE_TYPE (jclass_node);
3137 /* Mangle the class$ field. */
3139 tree field;
3140 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
3141 if (DECL_NAME (field) == CL_suffix)
3143 mangle_decl (field);
3144 name = DECL_ASSEMBLER_NAME (field);
3145 break;
3147 if (!field)
3149 error ("can%'t find %<class$%> in %qT", type);
3150 return error_mark_node;
3154 class_decl = IDENTIFIER_GLOBAL_VALUE (name);
3155 if (class_decl == NULL_TREE)
3157 class_decl = build_decl (input_location,
3158 VAR_DECL, name, TREE_TYPE (jclass_node));
3159 TREE_STATIC (class_decl) = 1;
3160 DECL_EXTERNAL (class_decl) = 1;
3161 TREE_PUBLIC (class_decl) = 1;
3162 DECL_ARTIFICIAL (class_decl) = 1;
3163 DECL_IGNORED_P (class_decl) = 1;
3164 pushdecl_top_level (class_decl);
3165 make_decl_rtl (class_decl);
3167 return class_decl;
3170 static tree
3171 build_vec_delete_1 (tree base, tree maxindex, tree type,
3172 special_function_kind auto_delete_vec,
3173 int use_global_delete, tsubst_flags_t complain)
3175 tree virtual_size;
3176 tree ptype = build_pointer_type (type = complete_type (type));
3177 tree size_exp;
3179 /* Temporary variables used by the loop. */
3180 tree tbase, tbase_init;
3182 /* This is the body of the loop that implements the deletion of a
3183 single element, and moves temp variables to next elements. */
3184 tree body;
3186 /* This is the LOOP_EXPR that governs the deletion of the elements. */
3187 tree loop = 0;
3189 /* This is the thing that governs what to do after the loop has run. */
3190 tree deallocate_expr = 0;
3192 /* This is the BIND_EXPR which holds the outermost iterator of the
3193 loop. It is convenient to set this variable up and test it before
3194 executing any other code in the loop.
3195 This is also the containing expression returned by this function. */
3196 tree controller = NULL_TREE;
3197 tree tmp;
3199 /* We should only have 1-D arrays here. */
3200 gcc_assert (TREE_CODE (type) != ARRAY_TYPE);
3202 if (base == error_mark_node || maxindex == error_mark_node)
3203 return error_mark_node;
3205 if (!COMPLETE_TYPE_P (type))
3207 if ((complain & tf_warning)
3208 && warning (OPT_Wdelete_incomplete,
3209 "possible problem detected in invocation of "
3210 "delete [] operator:"))
3212 cxx_incomplete_type_diagnostic (base, type, DK_WARNING);
3213 inform (input_location, "neither the destructor nor the "
3214 "class-specific operator delete [] will be called, "
3215 "even if they are declared when the class is defined");
3217 /* This size won't actually be used. */
3218 size_exp = size_one_node;
3219 goto no_destructor;
3222 size_exp = size_in_bytes (type);
3224 if (! MAYBE_CLASS_TYPE_P (type))
3225 goto no_destructor;
3226 else if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
3228 /* Make sure the destructor is callable. */
3229 if (type_build_dtor_call (type))
3231 tmp = build_delete (ptype, base, sfk_complete_destructor,
3232 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1,
3233 complain);
3234 if (tmp == error_mark_node)
3235 return error_mark_node;
3237 goto no_destructor;
3240 /* The below is short by the cookie size. */
3241 virtual_size = size_binop (MULT_EXPR, size_exp,
3242 convert (sizetype, maxindex));
3244 tbase = create_temporary_var (ptype);
3245 tbase_init
3246 = cp_build_modify_expr (tbase, NOP_EXPR,
3247 fold_build_pointer_plus_loc (input_location,
3248 fold_convert (ptype,
3249 base),
3250 virtual_size),
3251 complain);
3252 if (tbase_init == error_mark_node)
3253 return error_mark_node;
3254 controller = build3 (BIND_EXPR, void_type_node, tbase,
3255 NULL_TREE, NULL_TREE);
3256 TREE_SIDE_EFFECTS (controller) = 1;
3258 body = build1 (EXIT_EXPR, void_type_node,
3259 build2 (EQ_EXPR, boolean_type_node, tbase,
3260 fold_convert (ptype, base)));
3261 tmp = fold_build1_loc (input_location, NEGATE_EXPR, sizetype, size_exp);
3262 tmp = fold_build_pointer_plus (tbase, tmp);
3263 tmp = cp_build_modify_expr (tbase, NOP_EXPR, tmp, complain);
3264 if (tmp == error_mark_node)
3265 return error_mark_node;
3266 body = build_compound_expr (input_location, body, tmp);
3267 tmp = build_delete (ptype, tbase, sfk_complete_destructor,
3268 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1,
3269 complain);
3270 if (tmp == error_mark_node)
3271 return error_mark_node;
3272 body = build_compound_expr (input_location, body, tmp);
3274 loop = build1 (LOOP_EXPR, void_type_node, body);
3275 loop = build_compound_expr (input_location, tbase_init, loop);
3277 no_destructor:
3278 /* Delete the storage if appropriate. */
3279 if (auto_delete_vec == sfk_deleting_destructor)
3281 tree base_tbd;
3283 /* The below is short by the cookie size. */
3284 virtual_size = size_binop (MULT_EXPR, size_exp,
3285 convert (sizetype, maxindex));
3287 if (! TYPE_VEC_NEW_USES_COOKIE (type))
3288 /* no header */
3289 base_tbd = base;
3290 else
3292 tree cookie_size;
3294 cookie_size = targetm.cxx.get_cookie_size (type);
3295 base_tbd = cp_build_binary_op (input_location,
3296 MINUS_EXPR,
3297 cp_convert (string_type_node,
3298 base, complain),
3299 cookie_size,
3300 complain);
3301 if (base_tbd == error_mark_node)
3302 return error_mark_node;
3303 base_tbd = cp_convert (ptype, base_tbd, complain);
3304 /* True size with header. */
3305 virtual_size = size_binop (PLUS_EXPR, virtual_size, cookie_size);
3308 deallocate_expr = build_op_delete_call (VEC_DELETE_EXPR,
3309 base_tbd, virtual_size,
3310 use_global_delete & 1,
3311 /*placement=*/NULL_TREE,
3312 /*alloc_fn=*/NULL_TREE,
3313 complain);
3316 body = loop;
3317 if (!deallocate_expr)
3319 else if (!body)
3320 body = deallocate_expr;
3321 else
3322 body = build_compound_expr (input_location, body, deallocate_expr);
3324 if (!body)
3325 body = integer_zero_node;
3327 /* Outermost wrapper: If pointer is null, punt. */
3328 body = fold_build3_loc (input_location, COND_EXPR, void_type_node,
3329 fold_build2_loc (input_location,
3330 NE_EXPR, boolean_type_node, base,
3331 convert (TREE_TYPE (base),
3332 nullptr_node)),
3333 body, integer_zero_node);
3334 body = build1 (NOP_EXPR, void_type_node, body);
3336 if (controller)
3338 TREE_OPERAND (controller, 1) = body;
3339 body = controller;
3342 if (TREE_CODE (base) == SAVE_EXPR)
3343 /* Pre-evaluate the SAVE_EXPR outside of the BIND_EXPR. */
3344 body = build2 (COMPOUND_EXPR, void_type_node, base, body);
3346 return convert_to_void (body, ICV_CAST, complain);
3349 /* Create an unnamed variable of the indicated TYPE. */
3351 tree
3352 create_temporary_var (tree type)
3354 tree decl;
3356 decl = build_decl (input_location,
3357 VAR_DECL, NULL_TREE, type);
3358 TREE_USED (decl) = 1;
3359 DECL_ARTIFICIAL (decl) = 1;
3360 DECL_IGNORED_P (decl) = 1;
3361 DECL_CONTEXT (decl) = current_function_decl;
3363 return decl;
3366 /* Create a new temporary variable of the indicated TYPE, initialized
3367 to INIT.
3369 It is not entered into current_binding_level, because that breaks
3370 things when it comes time to do final cleanups (which take place
3371 "outside" the binding contour of the function). */
3373 tree
3374 get_temp_regvar (tree type, tree init)
3376 tree decl;
3378 decl = create_temporary_var (type);
3379 add_decl_expr (decl);
3381 finish_expr_stmt (cp_build_modify_expr (decl, INIT_EXPR, init,
3382 tf_warning_or_error));
3384 return decl;
3387 /* Subroutine of build_vec_init. Returns true if assigning to an array of
3388 INNER_ELT_TYPE from INIT is trivial. */
3390 static bool
3391 vec_copy_assign_is_trivial (tree inner_elt_type, tree init)
3393 tree fromtype = inner_elt_type;
3394 if (real_lvalue_p (init))
3395 fromtype = cp_build_reference_type (fromtype, /*rval*/false);
3396 return is_trivially_xible (MODIFY_EXPR, inner_elt_type, fromtype);
3399 /* `build_vec_init' returns tree structure that performs
3400 initialization of a vector of aggregate types.
3402 BASE is a reference to the vector, of ARRAY_TYPE, or a pointer
3403 to the first element, of POINTER_TYPE.
3404 MAXINDEX is the maximum index of the array (one less than the
3405 number of elements). It is only used if BASE is a pointer or
3406 TYPE_DOMAIN (TREE_TYPE (BASE)) == NULL_TREE.
3408 INIT is the (possibly NULL) initializer.
3410 If EXPLICIT_VALUE_INIT_P is true, then INIT must be NULL. All
3411 elements in the array are value-initialized.
3413 FROM_ARRAY is 0 if we should init everything with INIT
3414 (i.e., every element initialized from INIT).
3415 FROM_ARRAY is 1 if we should index into INIT in parallel
3416 with initialization of DECL.
3417 FROM_ARRAY is 2 if we should index into INIT in parallel,
3418 but use assignment instead of initialization. */
3420 tree
3421 build_vec_init (tree base, tree maxindex, tree init,
3422 bool explicit_value_init_p,
3423 int from_array, tsubst_flags_t complain)
3425 tree rval;
3426 tree base2 = NULL_TREE;
3427 tree itype = NULL_TREE;
3428 tree iterator;
3429 /* The type of BASE. */
3430 tree atype = TREE_TYPE (base);
3431 /* The type of an element in the array. */
3432 tree type = TREE_TYPE (atype);
3433 /* The element type reached after removing all outer array
3434 types. */
3435 tree inner_elt_type;
3436 /* The type of a pointer to an element in the array. */
3437 tree ptype;
3438 tree stmt_expr;
3439 tree compound_stmt;
3440 int destroy_temps;
3441 tree try_block = NULL_TREE;
3442 int num_initialized_elts = 0;
3443 bool is_global;
3444 tree obase = base;
3445 bool xvalue = false;
3446 bool errors = false;
3448 if (TREE_CODE (atype) == ARRAY_TYPE && TYPE_DOMAIN (atype))
3449 maxindex = array_type_nelts (atype);
3451 if (maxindex == NULL_TREE || maxindex == error_mark_node)
3452 return error_mark_node;
3454 if (explicit_value_init_p)
3455 gcc_assert (!init);
3457 inner_elt_type = strip_array_types (type);
3459 /* Look through the TARGET_EXPR around a compound literal. */
3460 if (init && TREE_CODE (init) == TARGET_EXPR
3461 && TREE_CODE (TARGET_EXPR_INITIAL (init)) == CONSTRUCTOR
3462 && from_array != 2)
3463 init = TARGET_EXPR_INITIAL (init);
3465 /* If we have a braced-init-list, make sure that the array
3466 is big enough for all the initializers. */
3467 bool length_check = (init && TREE_CODE (init) == CONSTRUCTOR
3468 && CONSTRUCTOR_NELTS (init) > 0
3469 && !TREE_CONSTANT (maxindex));
3471 if (init
3472 && TREE_CODE (atype) == ARRAY_TYPE
3473 && TREE_CONSTANT (maxindex)
3474 && (from_array == 2
3475 ? vec_copy_assign_is_trivial (inner_elt_type, init)
3476 : !TYPE_NEEDS_CONSTRUCTING (type))
3477 && ((TREE_CODE (init) == CONSTRUCTOR
3478 /* Don't do this if the CONSTRUCTOR might contain something
3479 that might throw and require us to clean up. */
3480 && (vec_safe_is_empty (CONSTRUCTOR_ELTS (init))
3481 || ! TYPE_HAS_NONTRIVIAL_DESTRUCTOR (inner_elt_type)))
3482 || from_array))
3484 /* Do non-default initialization of trivial arrays resulting from
3485 brace-enclosed initializers. In this case, digest_init and
3486 store_constructor will handle the semantics for us. */
3488 if (BRACE_ENCLOSED_INITIALIZER_P (init))
3489 init = digest_init (atype, init, complain);
3490 stmt_expr = build2 (INIT_EXPR, atype, base, init);
3491 return stmt_expr;
3494 maxindex = cp_convert (ptrdiff_type_node, maxindex, complain);
3495 if (TREE_CODE (atype) == ARRAY_TYPE)
3497 ptype = build_pointer_type (type);
3498 base = decay_conversion (base, complain);
3499 if (base == error_mark_node)
3500 return error_mark_node;
3501 base = cp_convert (ptype, base, complain);
3503 else
3504 ptype = atype;
3506 /* The code we are generating looks like:
3508 T* t1 = (T*) base;
3509 T* rval = t1;
3510 ptrdiff_t iterator = maxindex;
3511 try {
3512 for (; iterator != -1; --iterator) {
3513 ... initialize *t1 ...
3514 ++t1;
3516 } catch (...) {
3517 ... destroy elements that were constructed ...
3519 rval;
3522 We can omit the try and catch blocks if we know that the
3523 initialization will never throw an exception, or if the array
3524 elements do not have destructors. We can omit the loop completely if
3525 the elements of the array do not have constructors.
3527 We actually wrap the entire body of the above in a STMT_EXPR, for
3528 tidiness.
3530 When copying from array to another, when the array elements have
3531 only trivial copy constructors, we should use __builtin_memcpy
3532 rather than generating a loop. That way, we could take advantage
3533 of whatever cleverness the back end has for dealing with copies
3534 of blocks of memory. */
3536 is_global = begin_init_stmts (&stmt_expr, &compound_stmt);
3537 destroy_temps = stmts_are_full_exprs_p ();
3538 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
3539 rval = get_temp_regvar (ptype, base);
3540 base = get_temp_regvar (ptype, rval);
3541 iterator = get_temp_regvar (ptrdiff_type_node, maxindex);
3543 /* If initializing one array from another, initialize element by
3544 element. We rely upon the below calls to do the argument
3545 checking. Evaluate the initializer before entering the try block. */
3546 if (from_array && init && TREE_CODE (init) != CONSTRUCTOR)
3548 if (lvalue_kind (init) & clk_rvalueref)
3549 xvalue = true;
3550 base2 = decay_conversion (init, complain);
3551 if (base2 == error_mark_node)
3552 return error_mark_node;
3553 itype = TREE_TYPE (base2);
3554 base2 = get_temp_regvar (itype, base2);
3555 itype = TREE_TYPE (itype);
3558 /* Protect the entire array initialization so that we can destroy
3559 the partially constructed array if an exception is thrown.
3560 But don't do this if we're assigning. */
3561 if (flag_exceptions && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
3562 && from_array != 2)
3564 try_block = begin_try_block ();
3567 /* Should we try to create a constant initializer? */
3568 bool try_const = (TREE_CODE (atype) == ARRAY_TYPE
3569 && TREE_CONSTANT (maxindex)
3570 && (init ? TREE_CODE (init) == CONSTRUCTOR
3571 : (type_has_constexpr_default_constructor
3572 (inner_elt_type)))
3573 && (literal_type_p (inner_elt_type)
3574 || TYPE_HAS_CONSTEXPR_CTOR (inner_elt_type)));
3575 vec<constructor_elt, va_gc> *const_vec = NULL;
3576 bool saw_non_const = false;
3577 /* If we're initializing a static array, we want to do static
3578 initialization of any elements with constant initializers even if
3579 some are non-constant. */
3580 bool do_static_init = (DECL_P (obase) && TREE_STATIC (obase));
3582 bool empty_list = false;
3583 if (init && BRACE_ENCLOSED_INITIALIZER_P (init)
3584 && CONSTRUCTOR_NELTS (init) == 0)
3585 /* Skip over the handling of non-empty init lists. */
3586 empty_list = true;
3588 /* Maybe pull out constant value when from_array? */
3590 else if (init != NULL_TREE && TREE_CODE (init) == CONSTRUCTOR)
3592 /* Do non-default initialization of non-trivial arrays resulting from
3593 brace-enclosed initializers. */
3594 unsigned HOST_WIDE_INT idx;
3595 tree field, elt;
3596 /* If the constructor already has the array type, it's been through
3597 digest_init, so we shouldn't try to do anything more. */
3598 bool digested = same_type_p (atype, TREE_TYPE (init));
3599 from_array = 0;
3601 if (length_check)
3603 tree nelts = size_int (CONSTRUCTOR_NELTS (init) - 1);
3604 if (TREE_CODE (atype) != ARRAY_TYPE)
3606 if (flag_exceptions)
3608 tree c = fold_build2 (LT_EXPR, boolean_type_node, iterator,
3609 nelts);
3610 c = build3 (COND_EXPR, void_type_node, c,
3611 throw_bad_array_new_length (), void_node);
3612 finish_expr_stmt (c);
3614 /* Don't check an array new when -fno-exceptions. */
3616 else if (flag_sanitize & SANITIZE_BOUNDS
3617 && do_ubsan_in_current_function ())
3619 /* Make sure the last element of the initializer is in bounds. */
3620 finish_expr_stmt
3621 (ubsan_instrument_bounds
3622 (input_location, obase, &nelts, /*ignore_off_by_one*/false));
3626 if (try_const)
3627 vec_alloc (const_vec, CONSTRUCTOR_NELTS (init));
3629 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (init), idx, field, elt)
3631 tree baseref = build1 (INDIRECT_REF, type, base);
3632 tree one_init;
3634 num_initialized_elts++;
3636 current_stmt_tree ()->stmts_are_full_exprs_p = 1;
3637 if (digested)
3638 one_init = build2 (INIT_EXPR, type, baseref, elt);
3639 else if (MAYBE_CLASS_TYPE_P (type) || TREE_CODE (type) == ARRAY_TYPE)
3640 one_init = build_aggr_init (baseref, elt, 0, complain);
3641 else
3642 one_init = cp_build_modify_expr (baseref, NOP_EXPR,
3643 elt, complain);
3644 if (one_init == error_mark_node)
3645 errors = true;
3646 if (try_const)
3648 tree e = maybe_constant_init (one_init);
3649 if (reduced_constant_expression_p (e))
3651 CONSTRUCTOR_APPEND_ELT (const_vec, field, e);
3652 if (do_static_init)
3653 one_init = NULL_TREE;
3654 else
3655 one_init = build2 (INIT_EXPR, type, baseref, e);
3657 else
3659 if (do_static_init)
3661 tree value = build_zero_init (TREE_TYPE (e), NULL_TREE,
3662 true);
3663 if (value)
3664 CONSTRUCTOR_APPEND_ELT (const_vec, field, value);
3666 saw_non_const = true;
3670 if (one_init)
3671 finish_expr_stmt (one_init);
3672 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
3674 one_init = cp_build_unary_op (PREINCREMENT_EXPR, base, 0, complain);
3675 if (one_init == error_mark_node)
3676 errors = true;
3677 else
3678 finish_expr_stmt (one_init);
3680 one_init = cp_build_unary_op (PREDECREMENT_EXPR, iterator, 0,
3681 complain);
3682 if (one_init == error_mark_node)
3683 errors = true;
3684 else
3685 finish_expr_stmt (one_init);
3688 /* Any elements without explicit initializers get T{}. */
3689 empty_list = true;
3691 else if (from_array)
3693 if (init)
3694 /* OK, we set base2 above. */;
3695 else if (CLASS_TYPE_P (type)
3696 && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
3698 if (complain & tf_error)
3699 error ("initializer ends prematurely");
3700 errors = true;
3704 /* Now, default-initialize any remaining elements. We don't need to
3705 do that if a) the type does not need constructing, or b) we've
3706 already initialized all the elements.
3708 We do need to keep going if we're copying an array. */
3710 if (try_const && !init)
3711 /* With a constexpr default constructor, which we checked for when
3712 setting try_const above, default-initialization is equivalent to
3713 value-initialization, and build_value_init gives us something more
3714 friendly to maybe_constant_init. */
3715 explicit_value_init_p = true;
3716 if (from_array
3717 || ((type_build_ctor_call (type) || init || explicit_value_init_p)
3718 && ! (tree_fits_shwi_p (maxindex)
3719 && (num_initialized_elts
3720 == tree_to_shwi (maxindex) + 1))))
3722 /* If the ITERATOR is equal to -1, then we don't have to loop;
3723 we've already initialized all the elements. */
3724 tree for_stmt;
3725 tree elt_init;
3726 tree to;
3728 for_stmt = begin_for_stmt (NULL_TREE, NULL_TREE);
3729 finish_for_init_stmt (for_stmt);
3730 finish_for_cond (build2 (NE_EXPR, boolean_type_node, iterator,
3731 build_int_cst (TREE_TYPE (iterator), -1)),
3732 for_stmt, false);
3733 elt_init = cp_build_unary_op (PREDECREMENT_EXPR, iterator, 0,
3734 complain);
3735 if (elt_init == error_mark_node)
3736 errors = true;
3737 finish_for_expr (elt_init, for_stmt);
3739 to = build1 (INDIRECT_REF, type, base);
3741 /* If the initializer is {}, then all elements are initialized from T{}.
3742 But for non-classes, that's the same as value-initialization. */
3743 if (empty_list)
3745 if (cxx_dialect >= cxx11 && AGGREGATE_TYPE_P (type))
3747 init = build_constructor (init_list_type_node, NULL);
3749 else
3751 init = NULL_TREE;
3752 explicit_value_init_p = true;
3756 if (from_array)
3758 tree from;
3760 if (base2)
3762 from = build1 (INDIRECT_REF, itype, base2);
3763 if (xvalue)
3764 from = move (from);
3766 else
3767 from = NULL_TREE;
3769 if (from_array == 2)
3770 elt_init = cp_build_modify_expr (to, NOP_EXPR, from,
3771 complain);
3772 else if (type_build_ctor_call (type))
3773 elt_init = build_aggr_init (to, from, 0, complain);
3774 else if (from)
3775 elt_init = cp_build_modify_expr (to, NOP_EXPR, from,
3776 complain);
3777 else
3778 gcc_unreachable ();
3780 else if (TREE_CODE (type) == ARRAY_TYPE)
3782 if (init && !BRACE_ENCLOSED_INITIALIZER_P (init))
3783 sorry
3784 ("cannot initialize multi-dimensional array with initializer");
3785 elt_init = build_vec_init (build1 (INDIRECT_REF, type, base),
3786 0, init,
3787 explicit_value_init_p,
3788 0, complain);
3790 else if (explicit_value_init_p)
3792 elt_init = build_value_init (type, complain);
3793 if (elt_init != error_mark_node)
3794 elt_init = build2 (INIT_EXPR, type, to, elt_init);
3796 else
3798 gcc_assert (type_build_ctor_call (type) || init);
3799 if (CLASS_TYPE_P (type))
3800 elt_init = build_aggr_init (to, init, 0, complain);
3801 else
3803 if (TREE_CODE (init) == TREE_LIST)
3804 init = build_x_compound_expr_from_list (init, ELK_INIT,
3805 complain);
3806 elt_init = build2 (INIT_EXPR, type, to, init);
3810 if (elt_init == error_mark_node)
3811 errors = true;
3813 if (try_const)
3815 /* FIXME refs to earlier elts */
3816 tree e = maybe_constant_init (elt_init);
3817 if (reduced_constant_expression_p (e))
3819 if (initializer_zerop (e))
3820 /* Don't fill the CONSTRUCTOR with zeros. */
3821 e = NULL_TREE;
3822 if (do_static_init)
3823 elt_init = NULL_TREE;
3825 else
3827 saw_non_const = true;
3828 if (do_static_init)
3829 e = build_zero_init (TREE_TYPE (e), NULL_TREE, true);
3830 else
3831 e = NULL_TREE;
3834 if (e)
3836 int max = tree_to_shwi (maxindex)+1;
3837 for (; num_initialized_elts < max; ++num_initialized_elts)
3839 tree field = size_int (num_initialized_elts);
3840 CONSTRUCTOR_APPEND_ELT (const_vec, field, e);
3845 current_stmt_tree ()->stmts_are_full_exprs_p = 1;
3846 if (elt_init)
3847 finish_expr_stmt (elt_init);
3848 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
3850 finish_expr_stmt (cp_build_unary_op (PREINCREMENT_EXPR, base, 0,
3851 complain));
3852 if (base2)
3853 finish_expr_stmt (cp_build_unary_op (PREINCREMENT_EXPR, base2, 0,
3854 complain));
3856 finish_for_stmt (for_stmt);
3859 /* Make sure to cleanup any partially constructed elements. */
3860 if (flag_exceptions && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
3861 && from_array != 2)
3863 tree e;
3864 tree m = cp_build_binary_op (input_location,
3865 MINUS_EXPR, maxindex, iterator,
3866 complain);
3868 /* Flatten multi-dimensional array since build_vec_delete only
3869 expects one-dimensional array. */
3870 if (TREE_CODE (type) == ARRAY_TYPE)
3871 m = cp_build_binary_op (input_location,
3872 MULT_EXPR, m,
3873 /* Avoid mixing signed and unsigned. */
3874 convert (TREE_TYPE (m),
3875 array_type_nelts_total (type)),
3876 complain);
3878 finish_cleanup_try_block (try_block);
3879 e = build_vec_delete_1 (rval, m,
3880 inner_elt_type, sfk_complete_destructor,
3881 /*use_global_delete=*/0, complain);
3882 if (e == error_mark_node)
3883 errors = true;
3884 finish_cleanup (e, try_block);
3887 /* The value of the array initialization is the array itself, RVAL
3888 is a pointer to the first element. */
3889 finish_stmt_expr_expr (rval, stmt_expr);
3891 stmt_expr = finish_init_stmts (is_global, stmt_expr, compound_stmt);
3893 current_stmt_tree ()->stmts_are_full_exprs_p = destroy_temps;
3895 if (errors)
3896 return error_mark_node;
3898 if (try_const)
3900 if (!saw_non_const)
3902 tree const_init = build_constructor (atype, const_vec);
3903 return build2 (INIT_EXPR, atype, obase, const_init);
3905 else if (do_static_init && !vec_safe_is_empty (const_vec))
3906 DECL_INITIAL (obase) = build_constructor (atype, const_vec);
3907 else
3908 vec_free (const_vec);
3911 /* Now make the result have the correct type. */
3912 if (TREE_CODE (atype) == ARRAY_TYPE)
3914 atype = build_pointer_type (atype);
3915 stmt_expr = build1 (NOP_EXPR, atype, stmt_expr);
3916 stmt_expr = cp_build_indirect_ref (stmt_expr, RO_NULL, complain);
3917 TREE_NO_WARNING (stmt_expr) = 1;
3920 return stmt_expr;
3923 /* Call the DTOR_KIND destructor for EXP. FLAGS are as for
3924 build_delete. */
3926 static tree
3927 build_dtor_call (tree exp, special_function_kind dtor_kind, int flags,
3928 tsubst_flags_t complain)
3930 tree name;
3931 tree fn;
3932 switch (dtor_kind)
3934 case sfk_complete_destructor:
3935 name = complete_dtor_identifier;
3936 break;
3938 case sfk_base_destructor:
3939 name = base_dtor_identifier;
3940 break;
3942 case sfk_deleting_destructor:
3943 name = deleting_dtor_identifier;
3944 break;
3946 default:
3947 gcc_unreachable ();
3949 fn = lookup_fnfields (TREE_TYPE (exp), name, /*protect=*/2);
3950 return build_new_method_call (exp, fn,
3951 /*args=*/NULL,
3952 /*conversion_path=*/NULL_TREE,
3953 flags,
3954 /*fn_p=*/NULL,
3955 complain);
3958 /* Generate a call to a destructor. TYPE is the type to cast ADDR to.
3959 ADDR is an expression which yields the store to be destroyed.
3960 AUTO_DELETE is the name of the destructor to call, i.e., either
3961 sfk_complete_destructor, sfk_base_destructor, or
3962 sfk_deleting_destructor.
3964 FLAGS is the logical disjunction of zero or more LOOKUP_
3965 flags. See cp-tree.h for more info. */
3967 tree
3968 build_delete (tree otype, tree addr, special_function_kind auto_delete,
3969 int flags, int use_global_delete, tsubst_flags_t complain)
3971 tree expr;
3973 if (addr == error_mark_node)
3974 return error_mark_node;
3976 tree type = TYPE_MAIN_VARIANT (otype);
3978 /* Can happen when CURRENT_EXCEPTION_OBJECT gets its type
3979 set to `error_mark_node' before it gets properly cleaned up. */
3980 if (type == error_mark_node)
3981 return error_mark_node;
3983 if (TREE_CODE (type) == POINTER_TYPE)
3984 type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
3986 if (TREE_CODE (type) == ARRAY_TYPE)
3988 if (TYPE_DOMAIN (type) == NULL_TREE)
3990 if (complain & tf_error)
3991 error ("unknown array size in delete");
3992 return error_mark_node;
3994 return build_vec_delete (addr, array_type_nelts (type),
3995 auto_delete, use_global_delete, complain);
3998 if (TYPE_PTR_P (otype))
4000 addr = mark_rvalue_use (addr);
4002 /* We don't want to warn about delete of void*, only other
4003 incomplete types. Deleting other incomplete types
4004 invokes undefined behavior, but it is not ill-formed, so
4005 compile to something that would even do The Right Thing
4006 (TM) should the type have a trivial dtor and no delete
4007 operator. */
4008 if (!VOID_TYPE_P (type))
4010 complete_type (type);
4011 if (!COMPLETE_TYPE_P (type))
4013 if ((complain & tf_warning)
4014 && warning (OPT_Wdelete_incomplete,
4015 "possible problem detected in invocation of "
4016 "delete operator:"))
4018 cxx_incomplete_type_diagnostic (addr, type, DK_WARNING);
4019 inform (input_location,
4020 "neither the destructor nor the class-specific "
4021 "operator delete will be called, even if they are "
4022 "declared when the class is defined");
4025 else if (auto_delete == sfk_deleting_destructor && warn_delnonvdtor
4026 && MAYBE_CLASS_TYPE_P (type) && !CLASSTYPE_FINAL (type)
4027 && TYPE_POLYMORPHIC_P (type))
4029 tree dtor;
4030 dtor = CLASSTYPE_DESTRUCTORS (type);
4031 if (!dtor || !DECL_VINDEX (dtor))
4033 if (CLASSTYPE_PURE_VIRTUALS (type))
4034 warning (OPT_Wdelete_non_virtual_dtor,
4035 "deleting object of abstract class type %qT"
4036 " which has non-virtual destructor"
4037 " will cause undefined behaviour", type);
4038 else
4039 warning (OPT_Wdelete_non_virtual_dtor,
4040 "deleting object of polymorphic class type %qT"
4041 " which has non-virtual destructor"
4042 " might cause undefined behaviour", type);
4046 if (TREE_SIDE_EFFECTS (addr))
4047 addr = save_expr (addr);
4049 /* Throw away const and volatile on target type of addr. */
4050 addr = convert_force (build_pointer_type (type), addr, 0, complain);
4052 else
4054 /* Don't check PROTECT here; leave that decision to the
4055 destructor. If the destructor is accessible, call it,
4056 else report error. */
4057 addr = cp_build_addr_expr (addr, complain);
4058 if (addr == error_mark_node)
4059 return error_mark_node;
4060 if (TREE_SIDE_EFFECTS (addr))
4061 addr = save_expr (addr);
4063 addr = convert_force (build_pointer_type (type), addr, 0, complain);
4066 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
4068 /* Make sure the destructor is callable. */
4069 if (type_build_dtor_call (type))
4071 expr = build_dtor_call (cp_build_indirect_ref (addr, RO_NULL,
4072 complain),
4073 sfk_complete_destructor, flags, complain);
4074 if (expr == error_mark_node)
4075 return error_mark_node;
4078 if (auto_delete != sfk_deleting_destructor)
4079 return void_node;
4081 return build_op_delete_call (DELETE_EXPR, addr,
4082 cxx_sizeof_nowarn (type),
4083 use_global_delete,
4084 /*placement=*/NULL_TREE,
4085 /*alloc_fn=*/NULL_TREE,
4086 complain);
4088 else
4090 tree head = NULL_TREE;
4091 tree do_delete = NULL_TREE;
4092 tree ifexp;
4094 if (CLASSTYPE_LAZY_DESTRUCTOR (type))
4095 lazily_declare_fn (sfk_destructor, type);
4097 /* For `::delete x', we must not use the deleting destructor
4098 since then we would not be sure to get the global `operator
4099 delete'. */
4100 if (use_global_delete && auto_delete == sfk_deleting_destructor)
4102 /* We will use ADDR multiple times so we must save it. */
4103 addr = save_expr (addr);
4104 head = get_target_expr (build_headof (addr));
4105 /* Delete the object. */
4106 do_delete = build_op_delete_call (DELETE_EXPR,
4107 head,
4108 cxx_sizeof_nowarn (type),
4109 /*global_p=*/true,
4110 /*placement=*/NULL_TREE,
4111 /*alloc_fn=*/NULL_TREE,
4112 complain);
4113 /* Otherwise, treat this like a complete object destructor
4114 call. */
4115 auto_delete = sfk_complete_destructor;
4117 /* If the destructor is non-virtual, there is no deleting
4118 variant. Instead, we must explicitly call the appropriate
4119 `operator delete' here. */
4120 else if (!DECL_VIRTUAL_P (CLASSTYPE_DESTRUCTORS (type))
4121 && auto_delete == sfk_deleting_destructor)
4123 /* We will use ADDR multiple times so we must save it. */
4124 addr = save_expr (addr);
4125 /* Build the call. */
4126 do_delete = build_op_delete_call (DELETE_EXPR,
4127 addr,
4128 cxx_sizeof_nowarn (type),
4129 /*global_p=*/false,
4130 /*placement=*/NULL_TREE,
4131 /*alloc_fn=*/NULL_TREE,
4132 complain);
4133 /* Call the complete object destructor. */
4134 auto_delete = sfk_complete_destructor;
4136 else if (auto_delete == sfk_deleting_destructor
4137 && TYPE_GETS_REG_DELETE (type))
4139 /* Make sure we have access to the member op delete, even though
4140 we'll actually be calling it from the destructor. */
4141 build_op_delete_call (DELETE_EXPR, addr, cxx_sizeof_nowarn (type),
4142 /*global_p=*/false,
4143 /*placement=*/NULL_TREE,
4144 /*alloc_fn=*/NULL_TREE,
4145 complain);
4148 expr = build_dtor_call (cp_build_indirect_ref (addr, RO_NULL, complain),
4149 auto_delete, flags, complain);
4150 if (expr == error_mark_node)
4151 return error_mark_node;
4152 if (do_delete)
4153 expr = build2 (COMPOUND_EXPR, void_type_node, expr, do_delete);
4155 /* We need to calculate this before the dtor changes the vptr. */
4156 if (head)
4157 expr = build2 (COMPOUND_EXPR, void_type_node, head, expr);
4159 if (flags & LOOKUP_DESTRUCTOR)
4160 /* Explicit destructor call; don't check for null pointer. */
4161 ifexp = integer_one_node;
4162 else
4164 /* Handle deleting a null pointer. */
4165 ifexp = fold (cp_build_binary_op (input_location,
4166 NE_EXPR, addr, nullptr_node,
4167 complain));
4168 if (ifexp == error_mark_node)
4169 return error_mark_node;
4172 if (ifexp != integer_one_node)
4173 expr = build3 (COND_EXPR, void_type_node, ifexp, expr, void_node);
4175 return expr;
4179 /* At the beginning of a destructor, push cleanups that will call the
4180 destructors for our base classes and members.
4182 Called from begin_destructor_body. */
4184 void
4185 push_base_cleanups (void)
4187 tree binfo, base_binfo;
4188 int i;
4189 tree member;
4190 tree expr;
4191 vec<tree, va_gc> *vbases;
4193 /* Run destructors for all virtual baseclasses. */
4194 if (CLASSTYPE_VBASECLASSES (current_class_type))
4196 tree cond = (condition_conversion
4197 (build2 (BIT_AND_EXPR, integer_type_node,
4198 current_in_charge_parm,
4199 integer_two_node)));
4201 /* The CLASSTYPE_VBASECLASSES vector is in initialization
4202 order, which is also the right order for pushing cleanups. */
4203 for (vbases = CLASSTYPE_VBASECLASSES (current_class_type), i = 0;
4204 vec_safe_iterate (vbases, i, &base_binfo); i++)
4206 if (type_build_dtor_call (BINFO_TYPE (base_binfo)))
4208 expr = build_special_member_call (current_class_ref,
4209 base_dtor_identifier,
4210 NULL,
4211 base_binfo,
4212 (LOOKUP_NORMAL
4213 | LOOKUP_NONVIRTUAL),
4214 tf_warning_or_error);
4215 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo)))
4217 expr = build3 (COND_EXPR, void_type_node, cond,
4218 expr, void_node);
4219 finish_decl_cleanup (NULL_TREE, expr);
4225 /* Take care of the remaining baseclasses. */
4226 for (binfo = TYPE_BINFO (current_class_type), i = 0;
4227 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
4229 if (BINFO_VIRTUAL_P (base_binfo)
4230 || !type_build_dtor_call (BINFO_TYPE (base_binfo)))
4231 continue;
4233 expr = build_special_member_call (current_class_ref,
4234 base_dtor_identifier,
4235 NULL, base_binfo,
4236 LOOKUP_NORMAL | LOOKUP_NONVIRTUAL,
4237 tf_warning_or_error);
4238 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo)))
4239 finish_decl_cleanup (NULL_TREE, expr);
4242 /* Don't automatically destroy union members. */
4243 if (TREE_CODE (current_class_type) == UNION_TYPE)
4244 return;
4246 for (member = TYPE_FIELDS (current_class_type); member;
4247 member = DECL_CHAIN (member))
4249 tree this_type = TREE_TYPE (member);
4250 if (this_type == error_mark_node
4251 || TREE_CODE (member) != FIELD_DECL
4252 || DECL_ARTIFICIAL (member))
4253 continue;
4254 if (ANON_AGGR_TYPE_P (this_type))
4255 continue;
4256 if (type_build_dtor_call (this_type))
4258 tree this_member = (build_class_member_access_expr
4259 (current_class_ref, member,
4260 /*access_path=*/NULL_TREE,
4261 /*preserve_reference=*/false,
4262 tf_warning_or_error));
4263 expr = build_delete (this_type, this_member,
4264 sfk_complete_destructor,
4265 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_NORMAL,
4266 0, tf_warning_or_error);
4267 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (this_type))
4268 finish_decl_cleanup (NULL_TREE, expr);
4273 /* Build a C++ vector delete expression.
4274 MAXINDEX is the number of elements to be deleted.
4275 ELT_SIZE is the nominal size of each element in the vector.
4276 BASE is the expression that should yield the store to be deleted.
4277 This function expands (or synthesizes) these calls itself.
4278 AUTO_DELETE_VEC says whether the container (vector) should be deallocated.
4280 This also calls delete for virtual baseclasses of elements of the vector.
4282 Update: MAXINDEX is no longer needed. The size can be extracted from the
4283 start of the vector for pointers, and from the type for arrays. We still
4284 use MAXINDEX for arrays because it happens to already have one of the
4285 values we'd have to extract. (We could use MAXINDEX with pointers to
4286 confirm the size, and trap if the numbers differ; not clear that it'd
4287 be worth bothering.) */
4289 tree
4290 build_vec_delete (tree base, tree maxindex,
4291 special_function_kind auto_delete_vec,
4292 int use_global_delete, tsubst_flags_t complain)
4294 tree type;
4295 tree rval;
4296 tree base_init = NULL_TREE;
4298 type = TREE_TYPE (base);
4300 if (TYPE_PTR_P (type))
4302 /* Step back one from start of vector, and read dimension. */
4303 tree cookie_addr;
4304 tree size_ptr_type = build_pointer_type (sizetype);
4306 base = mark_rvalue_use (base);
4307 if (TREE_SIDE_EFFECTS (base))
4309 base_init = get_target_expr (base);
4310 base = TARGET_EXPR_SLOT (base_init);
4312 type = strip_array_types (TREE_TYPE (type));
4313 cookie_addr = fold_build1_loc (input_location, NEGATE_EXPR,
4314 sizetype, TYPE_SIZE_UNIT (sizetype));
4315 cookie_addr = fold_build_pointer_plus (fold_convert (size_ptr_type, base),
4316 cookie_addr);
4317 maxindex = cp_build_indirect_ref (cookie_addr, RO_NULL, complain);
4319 else if (TREE_CODE (type) == ARRAY_TYPE)
4321 /* Get the total number of things in the array, maxindex is a
4322 bad name. */
4323 maxindex = array_type_nelts_total (type);
4324 type = strip_array_types (type);
4325 base = decay_conversion (base, complain);
4326 if (base == error_mark_node)
4327 return error_mark_node;
4328 if (TREE_SIDE_EFFECTS (base))
4330 base_init = get_target_expr (base);
4331 base = TARGET_EXPR_SLOT (base_init);
4334 else
4336 if (base != error_mark_node && !(complain & tf_error))
4337 error ("type to vector delete is neither pointer or array type");
4338 return error_mark_node;
4341 rval = build_vec_delete_1 (base, maxindex, type, auto_delete_vec,
4342 use_global_delete, complain);
4343 if (base_init && rval != error_mark_node)
4344 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), base_init, rval);
4346 return rval;