]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cp/init.c
2015-07-07 Andrew MacLeod <amacleod@redhat.com>
[thirdparty/gcc.git] / gcc / cp / init.c
CommitLineData
471086d6 1/* Handle initialization things in C++.
d353bf18 2 Copyright (C) 1987-2015 Free Software Foundation, Inc.
471086d6 3 Contributed by Michael Tiemann (tiemann@cygnus.com)
4
6f0d25a6 5This file is part of GCC.
471086d6 6
6f0d25a6 7GCC is free software; you can redistribute it and/or modify
471086d6 8it under the terms of the GNU General Public License as published by
aa139c3f 9the Free Software Foundation; either version 3, or (at your option)
471086d6 10any later version.
11
6f0d25a6 12GCC is distributed in the hope that it will be useful,
471086d6 13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
aa139c3f 18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
471086d6 20
96624a9e 21/* High-level class interface. */
471086d6 22
23#include "config.h"
b3ef7553 24#include "system.h"
805e22b2 25#include "coretypes.h"
26#include "tm.h"
b20a8bb4 27#include "alias.h"
471086d6 28#include "tree.h"
9ed99284 29#include "stringpool.h"
30#include "varasm.h"
471086d6 31#include "cp-tree.h"
32#include "flags.h"
600f4be7 33#include "target.h"
a8783bee 34#include "gimplify.h"
2b9b77fb 35#include "c-family/c-ubsan.h"
471086d6 36
4bd132ff 37static bool begin_init_stmts (tree *, tree *);
38static tree finish_init_stmts (bool, tree, tree);
6507cda8 39static void construct_virtual_base (tree, tree);
ebd21de4 40static void expand_aggr_init_1 (tree, tree, tree, tree, int, tsubst_flags_t);
41static void expand_default_init (tree, tree, tree, tree, int, tsubst_flags_t);
6507cda8 42static void perform_member_init (tree, tree);
6c5ad428 43static int member_init_ok_or_else (tree, tree, tree);
44static void expand_virtual_init (tree, tree);
6507cda8 45static tree sort_mem_initializers (tree, tree);
6c5ad428 46static tree initializing_context (tree);
47static void expand_cleanup_for_base (tree, tree);
6c5ad428 48static tree dfs_initialize_vtbl_ptrs (tree, void *);
6c5ad428 49static tree build_field_list (tree, tree, int *);
fa60f42b 50static int diagnose_uninitialized_cst_or_ref_member_1 (tree, tree, bool, bool);
471086d6 51
bb855ff9 52/* We are about to generate some complex initialization code.
53 Conceptually, it is all a single expression. However, we may want
54 to include conditionals, loops, and other such statement-level
55 constructs. Therefore, we build the initialization code inside a
56 statement-expression. This function starts such an expression.
57 STMT_EXPR_P and COMPOUND_STMT_P are filled in by this function;
58 pass them back to finish_init_stmts when the expression is
59 complete. */
60
4bd132ff 61static bool
6c5ad428 62begin_init_stmts (tree *stmt_expr_p, tree *compound_stmt_p)
bb855ff9 63{
cacfdc02 64 bool is_global = !building_stmt_list_p ();
9031d10b 65
4bd132ff 66 *stmt_expr_p = begin_stmt_expr ();
2363ef00 67 *compound_stmt_p = begin_compound_stmt (BCS_NO_SCOPE);
4bd132ff 68
69 return is_global;
bb855ff9 70}
71
72/* Finish out the statement-expression begun by the previous call to
73 begin_init_stmts. Returns the statement-expression itself. */
74
4bd132ff 75static tree
76finish_init_stmts (bool is_global, tree stmt_expr, tree compound_stmt)
9031d10b 77{
68f8f8cc 78 finish_compound_stmt (compound_stmt);
9031d10b 79
face0cb7 80 stmt_expr = finish_stmt_expr (stmt_expr, true);
bb855ff9 81
cacfdc02 82 gcc_assert (!building_stmt_list_p () == is_global);
9031d10b 83
bb855ff9 84 return stmt_expr;
85}
86
87/* Constructors */
88
4a2680fc 89/* Called from initialize_vtbl_ptrs via dfs_walk. BINFO is the base
90 which we want to initialize the vtable pointer for, DATA is
91 TREE_LIST whose TREE_VALUE is the this ptr expression. */
b0722fac 92
a3a903ef 93static tree
6c5ad428 94dfs_initialize_vtbl_ptrs (tree binfo, void *data)
a3a903ef 95{
398b91ef 96 if (!TYPE_CONTAINS_VPTR_P (BINFO_TYPE (binfo)))
97 return dfs_skip_bases;
9031d10b 98
398b91ef 99 if (!BINFO_PRIMARY_P (binfo) || BINFO_VIRTUAL_P (binfo))
a3a903ef 100 {
101 tree base_ptr = TREE_VALUE ((tree) data);
b0722fac 102
1e74225a 103 base_ptr = build_base_path (PLUS_EXPR, base_ptr, binfo, /*nonnull=*/1,
104 tf_warning_or_error);
a3a903ef 105
106 expand_virtual_init (binfo, base_ptr);
107 }
b0722fac 108
a3a903ef 109 return NULL_TREE;
110}
111
9e92dee9 112/* Initialize all the vtable pointers in the object pointed to by
113 ADDR. */
96624a9e 114
471086d6 115void
6c5ad428 116initialize_vtbl_ptrs (tree addr)
471086d6 117{
9e92dee9 118 tree list;
119 tree type;
120
121 type = TREE_TYPE (TREE_TYPE (addr));
122 list = build_tree_list (type, addr);
a3a903ef 123
b53fb33d 124 /* Walk through the hierarchy, initializing the vptr in each base
5f1653d2 125 class. We do these in pre-order because we can't find the virtual
5ad590ad 126 bases for a class until we've initialized the vtbl for that
127 class. */
398b91ef 128 dfs_walk_once (TYPE_BINFO (type), dfs_initialize_vtbl_ptrs, NULL, list);
471086d6 129}
a3a903ef 130
23ed74d8 131/* Return an expression for the zero-initialization of an object with
132 type T. This expression will either be a constant (in the case
133 that T is a scalar), or a CONSTRUCTOR (in the case that T is an
e64c07b9 134 aggregate), or NULL (in the case that T does not require
135 initialization). In either case, the value can be used as
136 DECL_INITIAL for a decl of the indicated TYPE; it is a valid static
137 initializer. If NELTS is non-NULL, and TYPE is an ARRAY_TYPE, NELTS
138 is the number of elements in the array. If STATIC_STORAGE_P is
139 TRUE, initializers are only generated for entities for which
5d3c3f21 140 zero-initialization does not simply mean filling the storage with
f283d77f 141 zero bytes. FIELD_SIZE, if non-NULL, is the bit size of the field,
142 subfields with bit positions at or above that bit size shouldn't
a047d546 143 be added. Note that this only works when the result is assigned
144 to a base COMPONENT_REF; if we only have a pointer to the base subobject,
145 expand_assignment will end up clearing the full size of TYPE. */
e63bd8ae 146
f283d77f 147static tree
148build_zero_init_1 (tree type, tree nelts, bool static_storage_p,
149 tree field_size)
e63bd8ae 150{
23ed74d8 151 tree init = NULL_TREE;
152
153 /* [dcl.init]
154
930e8175 155 To zero-initialize an object of type T means:
23ed74d8 156
157 -- if T is a scalar type, the storage is set to the value of zero
653e5405 158 converted to T.
23ed74d8 159
160 -- if T is a non-union class type, the storage for each nonstatic
653e5405 161 data member and each base-class subobject is zero-initialized.
23ed74d8 162
163 -- if T is a union type, the storage for its first data member is
653e5405 164 zero-initialized.
23ed74d8 165
166 -- if T is an array type, the storage for each element is
653e5405 167 zero-initialized.
23ed74d8 168
169 -- if T is a reference type, no initialization is performed. */
e63bd8ae 170
b4df430b 171 gcc_assert (nelts == NULL_TREE || TREE_CODE (nelts) == INTEGER_CST);
6e7144d5 172
23ed74d8 173 if (type == error_mark_node)
174 ;
175 else if (static_storage_p && zero_init_p (type))
176 /* In order to save space, we do not explicitly build initializers
177 for items that do not need them. GCC's semantics are that
178 items with static storage duration that are not otherwise
179 initialized are initialized to zero. */
180 ;
05765a91 181 else if (TYPE_PTR_OR_PTRMEM_P (type))
8fe701f5 182 init = convert (type, nullptr_node);
04791a75 183 else if (SCALAR_TYPE_P (type))
6f905cd1 184 init = convert (type, integer_zero_node);
88e69df1 185 else if (RECORD_OR_UNION_CODE_P (TREE_CODE (type)))
23ed74d8 186 {
187 tree field;
f1f41a6c 188 vec<constructor_elt, va_gc> *v = NULL;
23ed74d8 189
23ed74d8 190 /* Iterate over the fields, building initializations. */
1767a056 191 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
23ed74d8 192 {
193 if (TREE_CODE (field) != FIELD_DECL)
194 continue;
195
2982409c 196 if (TREE_TYPE (field) == error_mark_node)
197 continue;
198
f283d77f 199 /* Don't add virtual bases for base classes if they are beyond
200 the size of the current field, that means it is present
201 somewhere else in the object. */
202 if (field_size)
203 {
204 tree bitpos = bit_position (field);
205 if (TREE_CODE (bitpos) == INTEGER_CST
206 && !tree_int_cst_lt (bitpos, field_size))
207 continue;
208 }
209
23ed74d8 210 /* Note that for class types there will be FIELD_DECLs
211 corresponding to base classes as well. Thus, iterating
212 over TYPE_FIELDs will result in correct initialization of
213 all of the subobjects. */
62116ec3 214 if (!static_storage_p || !zero_init_p (TREE_TYPE (field)))
c75b4594 215 {
f283d77f 216 tree new_field_size
217 = (DECL_FIELD_IS_BASE (field)
218 && DECL_SIZE (field)
219 && TREE_CODE (DECL_SIZE (field)) == INTEGER_CST)
220 ? DECL_SIZE (field) : NULL_TREE;
221 tree value = build_zero_init_1 (TREE_TYPE (field),
222 /*nelts=*/NULL_TREE,
223 static_storage_p,
224 new_field_size);
e64c07b9 225 if (value)
226 CONSTRUCTOR_APPEND_ELT(v, field, value);
c75b4594 227 }
23ed74d8 228
229 /* For unions, only the first field is initialized. */
230 if (TREE_CODE (type) == UNION_TYPE)
231 break;
232 }
c75b4594 233
930e8175 234 /* Build a constructor to contain the initializations. */
235 init = build_constructor (type, v);
23ed74d8 236 }
237 else if (TREE_CODE (type) == ARRAY_TYPE)
e63bd8ae 238 {
23ed74d8 239 tree max_index;
f1f41a6c 240 vec<constructor_elt, va_gc> *v = NULL;
23ed74d8 241
23ed74d8 242 /* Iterate over the array elements, building initializations. */
6ffe4872 243 if (nelts)
389dd41b 244 max_index = fold_build2_loc (input_location,
245 MINUS_EXPR, TREE_TYPE (nelts),
b7837065 246 nelts, integer_one_node);
6ffe4872 247 else
248 max_index = array_type_nelts (type);
5c638ac1 249
250 /* If we have an error_mark here, we should just return error mark
251 as we don't know the size of the array yet. */
252 if (max_index == error_mark_node)
253 return error_mark_node;
b4df430b 254 gcc_assert (TREE_CODE (max_index) == INTEGER_CST);
6e7144d5 255
8f034d15 256 /* A zero-sized array, which is accepted as an extension, will
257 have an upper bound of -1. */
258 if (!tree_int_cst_equal (max_index, integer_minus_one_node))
93af82a0 259 {
e82e4eb5 260 constructor_elt ce;
c75b4594 261
c47f5582 262 /* If this is a one element array, we just use a regular init. */
263 if (tree_int_cst_equal (size_zero_node, max_index))
e82e4eb5 264 ce.index = size_zero_node;
c47f5582 265 else
e82e4eb5 266 ce.index = build2 (RANGE_EXPR, sizetype, size_zero_node,
c75b4594 267 max_index);
9031d10b 268
e82e4eb5 269 ce.value = build_zero_init_1 (TREE_TYPE (type),
f283d77f 270 /*nelts=*/NULL_TREE,
271 static_storage_p, NULL_TREE);
42f98e54 272 if (ce.value)
273 {
274 vec_alloc (v, 1);
275 v->quick_push (ce);
276 }
93af82a0 277 }
9031d10b 278
c75b4594 279 /* Build a constructor to contain the initializations. */
280 init = build_constructor (type, v);
e63bd8ae 281 }
76249021 282 else if (VECTOR_TYPE_P (type))
385f3f36 283 init = build_zero_cst (type);
e63bd8ae 284 else
092b1d6f 285 gcc_assert (TREE_CODE (type) == REFERENCE_TYPE);
e63bd8ae 286
23ed74d8 287 /* In all cases, the initializer is a constant. */
288 if (init)
c7d4e749 289 TREE_CONSTANT (init) = 1;
e63bd8ae 290
291 return init;
292}
293
f283d77f 294/* Return an expression for the zero-initialization of an object with
295 type T. This expression will either be a constant (in the case
296 that T is a scalar), or a CONSTRUCTOR (in the case that T is an
297 aggregate), or NULL (in the case that T does not require
298 initialization). In either case, the value can be used as
299 DECL_INITIAL for a decl of the indicated TYPE; it is a valid static
300 initializer. If NELTS is non-NULL, and TYPE is an ARRAY_TYPE, NELTS
301 is the number of elements in the array. If STATIC_STORAGE_P is
302 TRUE, initializers are only generated for entities for which
303 zero-initialization does not simply mean filling the storage with
304 zero bytes. */
305
306tree
307build_zero_init (tree type, tree nelts, bool static_storage_p)
308{
309 return build_zero_init_1 (type, nelts, static_storage_p, NULL_TREE);
310}
311
930e8175 312/* Return a suitable initializer for value-initializing an object of type
069304e3 313 TYPE, as described in [dcl.init]. */
930e8175 314
069304e3 315tree
a5f2d620 316build_value_init (tree type, tsubst_flags_t complain)
930e8175 317{
318 /* [dcl.init]
319
320 To value-initialize an object of type T means:
321
575852de 322 - if T is a class type (clause 9) with either no default constructor
323 (12.1) or a default constructor that is user-provided or deleted,
324 then then the object is default-initialized;
930e8175 325
575852de 326 - if T is a (possibly cv-qualified) class type without a user-provided
327 or deleted default constructor, then the object is zero-initialized
328 and the semantic constraints for default-initialization are checked,
329 and if T has a non-trivial default constructor, the object is
330 default-initialized;
930e8175 331
332 - if T is an array type, then each element is value-initialized;
333
334 - otherwise, the object is zero-initialized.
335
336 A program that calls for default-initialization or
575852de 337 value-initialization of an entity of reference type is ill-formed. */
930e8175 338
d55772df 339 /* The AGGR_INIT_EXPR tweaking below breaks in templates. */
2037072c 340 gcc_assert (!processing_template_decl
341 || (SCALAR_TYPE_P (type) || TREE_CODE (type) == ARRAY_TYPE));
d55772df 342
4a2cf6ca 343 if (CLASS_TYPE_P (type)
344 && type_build_ctor_call (type))
930e8175 345 {
db1285df 346 tree ctor =
575852de 347 build_special_member_call (NULL_TREE, complete_ctor_identifier,
348 NULL, type, LOOKUP_NORMAL,
db1285df 349 complain);
350 if (ctor == error_mark_node)
351 return ctor;
352 tree fn = NULL_TREE;
353 if (TREE_CODE (ctor) == CALL_EXPR)
354 fn = get_callee_fndecl (ctor);
355 ctor = build_aggr_init_expr (type, ctor);
356 if (fn && user_provided_p (fn))
575852de 357 return ctor;
74b08030 358 else if (TYPE_HAS_COMPLEX_DFLT (type))
069304e3 359 {
360 /* This is a class that needs constructing, but doesn't have
361 a user-provided constructor. So we need to zero-initialize
362 the object and then call the implicitly defined ctor.
a63dcad5 363 This will be handled in simplify_aggr_init_expr. */
575852de 364 AGGR_INIT_ZERO_FIRST (ctor) = 1;
069304e3 365 return ctor;
366 }
daed64ba 367 }
575852de 368
369 /* Discard any access checking during subobject initialization;
370 the checks are implied by the call to the ctor which we have
371 verified is OK (cpp0x/defaulted46.C). */
372 push_deferring_access_checks (dk_deferred);
373 tree r = build_value_init_noctor (type, complain);
374 pop_deferring_access_checks ();
375 return r;
daed64ba 376}
377
378/* Like build_value_init, but don't call the constructor for TYPE. Used
379 for base initializers. */
380
381tree
a5f2d620 382build_value_init_noctor (tree type, tsubst_flags_t complain)
daed64ba 383{
993f6373 384 if (!COMPLETE_TYPE_P (type))
385 {
386 if (complain & tf_error)
387 error ("value-initialization of incomplete type %qT", type);
388 return error_mark_node;
389 }
04725249 390 /* FIXME the class and array cases should just use digest_init once it is
391 SFINAE-enabled. */
daed64ba 392 if (CLASS_TYPE_P (type))
393 {
60508649 394 gcc_assert (!TYPE_HAS_COMPLEX_DFLT (type)
395 || errorcount != 0);
daed64ba 396
397 if (TREE_CODE (type) != UNION_TYPE)
930e8175 398 {
069304e3 399 tree field;
f1f41a6c 400 vec<constructor_elt, va_gc> *v = NULL;
930e8175 401
402 /* Iterate over the fields, building initializations. */
1767a056 403 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
930e8175 404 {
405 tree ftype, value;
406
407 if (TREE_CODE (field) != FIELD_DECL)
408 continue;
409
410 ftype = TREE_TYPE (field);
411
06422b55 412 if (ftype == error_mark_node)
413 continue;
414
930e8175 415 /* We could skip vfields and fields of types with
416 user-defined constructors, but I think that won't improve
417 performance at all; it should be simpler in general just
418 to zero out the entire object than try to only zero the
419 bits that actually need it. */
420
421 /* Note that for class types there will be FIELD_DECLs
422 corresponding to base classes as well. Thus, iterating
423 over TYPE_FIELDs will result in correct initialization of
424 all of the subobjects. */
a5f2d620 425 value = build_value_init (ftype, complain);
39e3cef3 426 value = maybe_constant_init (value);
930e8175 427
74b7a9bc 428 if (value == error_mark_node)
429 return error_mark_node;
430
39e3cef3 431 CONSTRUCTOR_APPEND_ELT(v, field, value);
432
433 /* We shouldn't have gotten here for anything that would need
434 non-trivial initialization, and gimplify_init_ctor_preeval
435 would need to be fixed to allow it. */
436 gcc_assert (TREE_CODE (value) != TARGET_EXPR
437 && TREE_CODE (value) != AGGR_INIT_EXPR);
930e8175 438 }
439
440 /* Build a constructor to contain the zero- initializations. */
069304e3 441 return build_constructor (type, v);
930e8175 442 }
443 }
444 else if (TREE_CODE (type) == ARRAY_TYPE)
445 {
f1f41a6c 446 vec<constructor_elt, va_gc> *v = NULL;
930e8175 447
448 /* Iterate over the array elements, building initializations. */
449 tree max_index = array_type_nelts (type);
450
451 /* If we have an error_mark here, we should just return error mark
452 as we don't know the size of the array yet. */
453 if (max_index == error_mark_node)
76124e58 454 {
57e0023b 455 if (complain & tf_error)
456 error ("cannot value-initialize array of unknown bound %qT",
457 type);
76124e58 458 return error_mark_node;
459 }
930e8175 460 gcc_assert (TREE_CODE (max_index) == INTEGER_CST);
461
462 /* A zero-sized array, which is accepted as an extension, will
463 have an upper bound of -1. */
464 if (!tree_int_cst_equal (max_index, integer_minus_one_node))
465 {
e82e4eb5 466 constructor_elt ce;
930e8175 467
930e8175 468 /* If this is a one element array, we just use a regular init. */
469 if (tree_int_cst_equal (size_zero_node, max_index))
e82e4eb5 470 ce.index = size_zero_node;
930e8175 471 else
e82e4eb5 472 ce.index = build2 (RANGE_EXPR, sizetype, size_zero_node, max_index);
930e8175 473
e82e4eb5 474 ce.value = build_value_init (TREE_TYPE (type), complain);
39e3cef3 475 ce.value = maybe_constant_init (ce.value);
476 if (ce.value == error_mark_node)
477 return error_mark_node;
4404dc82 478
39e3cef3 479 vec_alloc (v, 1);
480 v->quick_push (ce);
74b7a9bc 481
39e3cef3 482 /* We shouldn't have gotten here for anything that would need
483 non-trivial initialization, and gimplify_init_ctor_preeval
484 would need to be fixed to allow it. */
485 gcc_assert (TREE_CODE (ce.value) != TARGET_EXPR
486 && TREE_CODE (ce.value) != AGGR_INIT_EXPR);
930e8175 487 }
488
489 /* Build a constructor to contain the initializations. */
490 return build_constructor (type, v);
491 }
70cac69d 492 else if (TREE_CODE (type) == FUNCTION_TYPE)
493 {
494 if (complain & tf_error)
495 error ("value-initialization of function type %qT", type);
496 return error_mark_node;
497 }
74b7a9bc 498 else if (TREE_CODE (type) == REFERENCE_TYPE)
499 {
500 if (complain & tf_error)
501 error ("value-initialization of reference type %qT", type);
502 return error_mark_node;
503 }
930e8175 504
505 return build_zero_init (type, NULL_TREE, /*static_storage_p=*/false);
506}
507
90510c63 508/* Initialize current class with INIT, a TREE_LIST of
509 arguments for a target constructor. If TREE_LIST is void_type_node,
510 an empty initializer list was given. */
511
512static void
513perform_target_ctor (tree init)
514{
515 tree decl = current_class_ref;
516 tree type = current_class_type;
517
afc1cf36 518 finish_expr_stmt (build_aggr_init (decl, init,
519 LOOKUP_NORMAL|LOOKUP_DELEGATING_CONS,
520 tf_warning_or_error));
575852de 521 if (type_build_dtor_call (type))
90510c63 522 {
523 tree expr = build_delete (type, decl, sfk_complete_destructor,
524 LOOKUP_NORMAL
525 |LOOKUP_NONVIRTUAL
526 |LOOKUP_DESTRUCTOR,
527 0, tf_warning_or_error);
575852de 528 if (expr != error_mark_node
529 && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type))
90510c63 530 finish_eh_cleanup (expr);
531 }
532}
533
f2c1aabc 534/* Return the non-static data initializer for FIELD_DECL MEMBER. */
535
536tree
537get_nsdmi (tree member, bool in_ctor)
538{
539 tree init;
540 tree save_ccp = current_class_ptr;
541 tree save_ccr = current_class_ref;
6e3ecd30 542
f2c1aabc 543 if (!in_ctor)
cf72f34d 544 {
545 /* Use a PLACEHOLDER_EXPR when we don't have a 'this' parameter to
546 refer to; constexpr evaluation knows what to do with it. */
547 current_class_ref = build0 (PLACEHOLDER_EXPR, DECL_CONTEXT (member));
548 current_class_ptr = build_address (current_class_ref);
549 }
6e3ecd30 550
f2c1aabc 551 if (DECL_LANG_SPECIFIC (member) && DECL_TEMPLATE_INFO (member))
089c9c49 552 {
6e3ecd30 553 init = DECL_INITIAL (DECL_TI_TEMPLATE (member));
554 if (TREE_CODE (init) == DEFAULT_ARG)
555 goto unparsed;
556
557 /* Check recursive instantiation. */
558 if (DECL_INSTANTIATING_NSDMI_P (member))
559 {
560 error ("recursive instantiation of non-static data member "
561 "initializer for %qD", member);
562 init = error_mark_node;
563 }
564 else
565 {
566 DECL_INSTANTIATING_NSDMI_P (member) = 1;
567
568 /* Do deferred instantiation of the NSDMI. */
569 init = (tsubst_copy_and_build
570 (init, DECL_TI_ARGS (member),
571 tf_warning_or_error, member, /*function_p=*/false,
572 /*integral_constant_expression_p=*/false));
573 init = digest_nsdmi_init (member, init);
574
575 DECL_INSTANTIATING_NSDMI_P (member) = 0;
576 }
089c9c49 577 }
f2c1aabc 578 else
579 {
580 init = DECL_INITIAL (member);
581 if (init && TREE_CODE (init) == DEFAULT_ARG)
582 {
6e3ecd30 583 unparsed:
f2c1aabc 584 error ("constructor required before non-static data member "
585 "for %qD has been parsed", member);
586 DECL_INITIAL (member) = error_mark_node;
cf72f34d 587 init = error_mark_node;
f2c1aabc 588 }
589 /* Strip redundant TARGET_EXPR so we don't need to remap it, and
590 so the aggregate init code below will see a CONSTRUCTOR. */
591 if (init && TREE_CODE (init) == TARGET_EXPR
592 && !VOID_TYPE_P (TREE_TYPE (TARGET_EXPR_INITIAL (init))))
593 init = TARGET_EXPR_INITIAL (init);
594 init = break_out_target_exprs (init);
595 }
596 current_class_ptr = save_ccp;
597 current_class_ref = save_ccr;
598 return init;
599}
600
6507cda8 601/* Initialize MEMBER, a FIELD_DECL, with INIT, a TREE_LIST of
602 arguments. If TREE_LIST is void_type_node, an empty initializer
603 list was given; if NULL_TREE no initializer was given. */
96624a9e 604
471086d6 605static void
6507cda8 606perform_member_init (tree member, tree init)
471086d6 607{
608 tree decl;
609 tree type = TREE_TYPE (member);
6507cda8 610
d9c249a4 611 /* Use the non-static data member initializer if there was no
612 mem-initializer for this field. */
613 if (init == NULL_TREE)
f2c1aabc 614 init = get_nsdmi (member, /*ctor*/true);
d9c249a4 615
648ae09f 616 if (init == error_mark_node)
617 return;
618
6507cda8 619 /* Effective C++ rule 12 requires that all data members be
620 initialized. */
4404dc82 621 if (warn_ecpp && init == NULL_TREE && TREE_CODE (type) != ARRAY_TYPE)
712d2297 622 warning_at (DECL_SOURCE_LOCATION (current_function_decl), OPT_Weffc__,
623 "%qD should be initialized in the member initialization list",
624 member);
6507cda8 625
6507cda8 626 /* Get an lvalue for the data member. */
4ac852cb 627 decl = build_class_member_access_expr (current_class_ref, member,
628 /*access_path=*/NULL_TREE,
ebd21de4 629 /*preserve_reference=*/true,
630 tf_warning_or_error);
812608b9 631 if (decl == error_mark_node)
632 return;
633
9d0d0b57 634 if (warn_init_self && init && TREE_CODE (init) == TREE_LIST
635 && TREE_CHAIN (init) == NULL_TREE)
636 {
637 tree val = TREE_VALUE (init);
2877d9bf 638 /* Handle references. */
639 if (REFERENCE_REF_P (val))
640 val = TREE_OPERAND (val, 0);
9d0d0b57 641 if (TREE_CODE (val) == COMPONENT_REF && TREE_OPERAND (val, 1) == member
642 && TREE_OPERAND (val, 0) == current_class_ref)
643 warning_at (DECL_SOURCE_LOCATION (current_function_decl),
8eba82c2 644 OPT_Winit_self, "%qD is initialized with itself",
9d0d0b57 645 member);
646 }
647
4404dc82 648 if (init == void_type_node)
649 {
650 /* mem() means value-initialization. */
651 if (TREE_CODE (type) == ARRAY_TYPE)
a3ddabdc 652 {
4db4c657 653 init = build_vec_init_expr (type, init, tf_warning_or_error);
98c0a208 654 init = build2 (INIT_EXPR, type, decl, init);
a3ddabdc 655 finish_expr_stmt (init);
656 }
4404dc82 657 else
658 {
56189347 659 tree value = build_value_init (type, tf_warning_or_error);
660 if (value == error_mark_node)
661 return;
662 init = build2 (INIT_EXPR, type, decl, value);
74b7a9bc 663 finish_expr_stmt (init);
4404dc82 664 }
4404dc82 665 }
128e1d72 666 /* Deal with this here, as we will get confused if we try to call the
667 assignment op for an anonymous union. This can happen in a
668 synthesized copy constructor. */
4404dc82 669 else if (ANON_AGGR_TYPE_P (type))
128e1d72 670 {
c8470848 671 if (init)
672 {
831d52a2 673 init = build2 (INIT_EXPR, type, decl, TREE_VALUE (init));
c8470848 674 finish_expr_stmt (init);
675 }
128e1d72 676 }
5747d366 677 else if (init
678 && (TREE_CODE (type) == REFERENCE_TYPE
679 /* Pre-digested NSDMI. */
680 || (((TREE_CODE (init) == CONSTRUCTOR
681 && TREE_TYPE (init) == type)
682 /* { } mem-initializer. */
683 || (TREE_CODE (init) == TREE_LIST
8e8713cd 684 && DIRECT_LIST_INIT_P (TREE_VALUE (init))))
5747d366 685 && (CP_AGGREGATE_TYPE_P (type)
686 || is_std_init_list (type)))))
687 {
688 /* With references and list-initialization, we need to deal with
689 extending temporary lifetimes. 12.2p5: "A temporary bound to a
690 reference member in a constructor’s ctor-initializer (12.6.2)
691 persists until the constructor exits." */
692 unsigned i; tree t;
f1f41a6c 693 vec<tree, va_gc> *cleanups = make_tree_vector ();
5747d366 694 if (TREE_CODE (init) == TREE_LIST)
695 init = build_x_compound_expr_from_list (init, ELK_MEM_INIT,
696 tf_warning_or_error);
697 if (TREE_TYPE (init) != type)
b6333a5b 698 {
699 if (BRACE_ENCLOSED_INITIALIZER_P (init)
700 && CP_AGGREGATE_TYPE_P (type))
701 init = reshape_init (type, init, tf_warning_or_error);
702 init = digest_init (type, init, tf_warning_or_error);
703 }
5747d366 704 if (init == error_mark_node)
705 return;
5eb5096f 706 /* A FIELD_DECL doesn't really have a suitable lifetime, but
707 make_temporary_var_for_ref_to_temp will treat it as automatic and
708 set_up_extended_ref_temp wants to use the decl in a warning. */
87e008d2 709 init = extend_ref_init_temps (member, init, &cleanups);
5747d366 710 if (TREE_CODE (type) == ARRAY_TYPE
711 && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (type)))
712 init = build_vec_init_expr (type, init, tf_warning_or_error);
713 init = build2 (INIT_EXPR, type, decl, init);
714 finish_expr_stmt (init);
f1f41a6c 715 FOR_EACH_VEC_ELT (*cleanups, i, t)
5747d366 716 push_cleanup (decl, t, false);
717 release_tree_vector (cleanups);
718 }
23cf2a5f 719 else if (type_build_ctor_call (type)
720 || (init && CLASS_TYPE_P (strip_array_types (type))))
471086d6 721 {
da73cc75 722 if (TREE_CODE (type) == ARRAY_TYPE)
471086d6 723 {
da73cc75 724 if (init)
725 {
653992cf 726 if (TREE_CHAIN (init))
727 init = error_mark_node;
728 else
729 init = TREE_VALUE (init);
c4e82f5e 730 if (BRACE_ENCLOSED_INITIALIZER_P (init))
731 init = digest_init (type, init, tf_warning_or_error);
da73cc75 732 }
733 if (init == NULL_TREE
734 || same_type_ignoring_top_level_qualifiers_p (type,
735 TREE_TYPE (init)))
736 {
4db4c657 737 init = build_vec_init_expr (type, init, tf_warning_or_error);
da73cc75 738 init = build2 (INIT_EXPR, type, decl, init);
739 finish_expr_stmt (init);
740 }
741 else
742 error ("invalid initializer for array member %q#D", member);
471086d6 743 }
744 else
2336da2a 745 {
ed2deec6 746 int flags = LOOKUP_NORMAL;
747 if (DECL_DEFAULTED_FN (current_function_decl))
748 flags |= LOOKUP_DEFAULTED;
2336da2a 749 if (CP_TYPE_CONST_P (type)
750 && init == NULL_TREE
df3a1bdc 751 && default_init_uninitialized_part (type))
19e925b4 752 {
753 /* TYPE_NEEDS_CONSTRUCTING can be set just because we have a
754 vtable; still give this diagnostic. */
755 if (permerror (DECL_SOURCE_LOCATION (current_function_decl),
756 "uninitialized const member in %q#T", type))
757 inform (DECL_SOURCE_LOCATION (member),
758 "%q#D should be initialized", member );
759 }
ed2deec6 760 finish_expr_stmt (build_aggr_init (decl, init, flags,
2336da2a 761 tf_warning_or_error));
762 }
471086d6 763 }
764 else
765 {
766 if (init == NULL_TREE)
767 {
a0bbd07d 768 tree core_type;
471086d6 769 /* member traversal: note it leaves init NULL */
4404dc82 770 if (TREE_CODE (type) == REFERENCE_TYPE)
19e925b4 771 {
772 if (permerror (DECL_SOURCE_LOCATION (current_function_decl),
773 "uninitialized reference member in %q#T", type))
774 inform (DECL_SOURCE_LOCATION (member),
775 "%q#D should be initialized", member);
776 }
28bbd27a 777 else if (CP_TYPE_CONST_P (type))
19e925b4 778 {
779 if (permerror (DECL_SOURCE_LOCATION (current_function_decl),
780 "uninitialized const member in %q#T", type))
781 inform (DECL_SOURCE_LOCATION (member),
782 "%q#D should be initialized", member );
783 }
a0bbd07d 784
d438565a 785 core_type = strip_array_types (type);
786
40ab1ef4 787 if (CLASS_TYPE_P (core_type)
788 && (CLASSTYPE_READONLY_FIELDS_NEED_INIT (core_type)
789 || CLASSTYPE_REF_FIELDS_NEED_INIT (core_type)))
790 diagnose_uninitialized_cst_or_ref_member (core_type,
fa60f42b 791 /*using_new=*/false,
792 /*complain=*/true);
471086d6 793 }
794 else if (TREE_CODE (init) == TREE_LIST)
8a4008da 795 /* There was an explicit member initialization. Do some work
796 in that case. */
1f3d2e3f 797 init = build_x_compound_expr_from_list (init, ELK_MEM_INIT,
798 tf_warning_or_error);
471086d6 799
db9d2b2e 800 if (init)
ebd21de4 801 finish_expr_stmt (cp_build_modify_expr (decl, INIT_EXPR, init,
802 tf_warning_or_error));
471086d6 803 }
c76251c1 804
575852de 805 if (type_build_dtor_call (type))
1e66592c 806 {
1adc02a5 807 tree expr;
808
4ac852cb 809 expr = build_class_member_access_expr (current_class_ref, member,
810 /*access_path=*/NULL_TREE,
ebd21de4 811 /*preserve_reference=*/false,
812 tf_warning_or_error);
0ce25b06 813 expr = build_delete (type, expr, sfk_complete_destructor,
9e505437 814 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0,
815 tf_warning_or_error);
1e66592c 816
575852de 817 if (expr != error_mark_node
818 && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type))
a9bc793b 819 finish_eh_cleanup (expr);
1e66592c 820 }
471086d6 821}
822
c8470848 823/* Returns a TREE_LIST containing (as the TREE_PURPOSE of each node) all
824 the FIELD_DECLs on the TYPE_FIELDS list for T, in reverse order. */
825
9031d10b 826static tree
6c5ad428 827build_field_list (tree t, tree list, int *uses_unions_p)
c8470848 828{
829 tree fields;
830
831 /* Note whether or not T is a union. */
832 if (TREE_CODE (t) == UNION_TYPE)
833 *uses_unions_p = 1;
834
1767a056 835 for (fields = TYPE_FIELDS (t); fields; fields = DECL_CHAIN (fields))
c8470848 836 {
b01002fa 837 tree fieldtype;
838
c8470848 839 /* Skip CONST_DECLs for enumeration constants and so forth. */
23ed74d8 840 if (TREE_CODE (fields) != FIELD_DECL || DECL_ARTIFICIAL (fields))
c8470848 841 continue;
9031d10b 842
b01002fa 843 fieldtype = TREE_TYPE (fields);
c8470848 844 /* Keep track of whether or not any fields are unions. */
b01002fa 845 if (TREE_CODE (fieldtype) == UNION_TYPE)
c8470848 846 *uses_unions_p = 1;
847
848 /* For an anonymous struct or union, we must recursively
849 consider the fields of the anonymous type. They can be
850 directly initialized from the constructor. */
b01002fa 851 if (ANON_AGGR_TYPE_P (fieldtype))
c8470848 852 {
853 /* Add this field itself. Synthesized copy constructors
854 initialize the entire aggregate. */
855 list = tree_cons (fields, NULL_TREE, list);
856 /* And now add the fields in the anonymous aggregate. */
b01002fa 857 list = build_field_list (fieldtype, list, uses_unions_p);
c8470848 858 }
859 /* Add this field. */
860 else if (DECL_NAME (fields))
861 list = tree_cons (fields, NULL_TREE, list);
862 }
863
864 return list;
865}
866
6507cda8 867/* The MEM_INITS are a TREE_LIST. The TREE_PURPOSE of each list gives
868 a FIELD_DECL or BINFO in T that needs initialization. The
869 TREE_VALUE gives the initializer, or list of initializer arguments.
870
871 Return a TREE_LIST containing all of the initializations required
872 for T, in the order in which they should be performed. The output
873 list has the same format as the input. */
96624a9e 874
471086d6 875static tree
6507cda8 876sort_mem_initializers (tree t, tree mem_inits)
471086d6 877{
c8470848 878 tree init;
f6cc6a08 879 tree base, binfo, base_binfo;
6507cda8 880 tree sorted_inits;
881 tree next_subobject;
f1f41a6c 882 vec<tree, va_gc> *vbases;
6507cda8 883 int i;
e7830050 884 int uses_unions_p = 0;
c8470848 885
6507cda8 886 /* Build up a list of initializations. The TREE_PURPOSE of entry
887 will be the subobject (a FIELD_DECL or BINFO) to initialize. The
888 TREE_VALUE will be the constructor arguments, or NULL if no
889 explicit initialization was provided. */
890 sorted_inits = NULL_TREE;
9031d10b 891
6507cda8 892 /* Process the virtual bases. */
930bdacf 893 for (vbases = CLASSTYPE_VBASECLASSES (t), i = 0;
f1f41a6c 894 vec_safe_iterate (vbases, i, &base); i++)
97c118b9 895 sorted_inits = tree_cons (base, NULL_TREE, sorted_inits);
9031d10b 896
6507cda8 897 /* Process the direct bases. */
f6cc6a08 898 for (binfo = TYPE_BINFO (t), i = 0;
899 BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i)
900 if (!BINFO_VIRTUAL_P (base_binfo))
901 sorted_inits = tree_cons (base_binfo, NULL_TREE, sorted_inits);
902
6507cda8 903 /* Process the non-static data members. */
904 sorted_inits = build_field_list (t, sorted_inits, &uses_unions_p);
905 /* Reverse the entire list of initializations, so that they are in
906 the order that they will actually be performed. */
907 sorted_inits = nreverse (sorted_inits);
908
909 /* If the user presented the initializers in an order different from
910 that in which they will actually occur, we issue a warning. Keep
911 track of the next subobject which can be explicitly initialized
912 without issuing a warning. */
913 next_subobject = sorted_inits;
914
915 /* Go through the explicit initializers, filling in TREE_PURPOSE in
916 the SORTED_INITS. */
917 for (init = mem_inits; init; init = TREE_CHAIN (init))
918 {
919 tree subobject;
920 tree subobject_init;
921
922 subobject = TREE_PURPOSE (init);
923
924 /* If the explicit initializers are in sorted order, then
9031d10b 925 SUBOBJECT will be NEXT_SUBOBJECT, or something following
6507cda8 926 it. */
9031d10b 927 for (subobject_init = next_subobject;
928 subobject_init;
6507cda8 929 subobject_init = TREE_CHAIN (subobject_init))
930 if (TREE_PURPOSE (subobject_init) == subobject)
c8470848 931 break;
932
6507cda8 933 /* Issue a warning if the explicit initializer order does not
b9dd3954 934 match that which will actually occur.
653e5405 935 ??? Are all these on the correct lines? */
6507cda8 936 if (warn_reorder && !subobject_init)
c8470848 937 {
6507cda8 938 if (TREE_CODE (TREE_PURPOSE (next_subobject)) == FIELD_DECL)
ced7c954 939 warning (OPT_Wreorder, "%q+D will be initialized after",
3cf8b391 940 TREE_PURPOSE (next_subobject));
6507cda8 941 else
ced7c954 942 warning (OPT_Wreorder, "base %qT will be initialized after",
6507cda8 943 TREE_PURPOSE (next_subobject));
944 if (TREE_CODE (subobject) == FIELD_DECL)
ced7c954 945 warning (OPT_Wreorder, " %q+#D", subobject);
6507cda8 946 else
ced7c954 947 warning (OPT_Wreorder, " base %qT", subobject);
712d2297 948 warning_at (DECL_SOURCE_LOCATION (current_function_decl),
949 OPT_Wreorder, " when initialized here");
c8470848 950 }
1e66592c 951
6507cda8 952 /* Look again, from the beginning of the list. */
953 if (!subobject_init)
c8470848 954 {
6507cda8 955 subobject_init = sorted_inits;
956 while (TREE_PURPOSE (subobject_init) != subobject)
957 subobject_init = TREE_CHAIN (subobject_init);
c8470848 958 }
9031d10b 959
6507cda8 960 /* It is invalid to initialize the same subobject more than
961 once. */
962 if (TREE_VALUE (subobject_init))
c8470848 963 {
6507cda8 964 if (TREE_CODE (subobject) == FIELD_DECL)
712d2297 965 error_at (DECL_SOURCE_LOCATION (current_function_decl),
966 "multiple initializations given for %qD",
967 subobject);
6507cda8 968 else
712d2297 969 error_at (DECL_SOURCE_LOCATION (current_function_decl),
970 "multiple initializations given for base %qT",
971 subobject);
c8470848 972 }
973
6507cda8 974 /* Record the initialization. */
975 TREE_VALUE (subobject_init) = TREE_VALUE (init);
976 next_subobject = subobject_init;
c8470848 977 }
978
979 /* [class.base.init]
1e66592c 980
c8470848 981 If a ctor-initializer specifies more than one mem-initializer for
982 multiple members of the same union (including members of
80e54732 983 anonymous unions), the ctor-initializer is ill-formed.
984
985 Here we also splice out uninitialized union members. */
c8470848 986 if (uses_unions_p)
987 {
5d6e94a7 988 tree *last_p = NULL;
80e54732 989 tree *p;
990 for (p = &sorted_inits; *p; )
471086d6 991 {
c8470848 992 tree field;
b01002fa 993 tree ctx;
c8470848 994
80e54732 995 init = *p;
996
997 field = TREE_PURPOSE (init);
998
999 /* Skip base classes. */
1000 if (TREE_CODE (field) != FIELD_DECL)
1001 goto next;
1002
1003 /* If this is an anonymous union with no explicit initializer,
1004 splice it out. */
1005 if (!TREE_VALUE (init) && ANON_UNION_TYPE_P (TREE_TYPE (field)))
1006 goto splice;
1007
c8470848 1008 /* See if this field is a member of a union, or a member of a
1009 structure contained in a union, etc. */
b01002fa 1010 for (ctx = DECL_CONTEXT (field);
1011 !same_type_p (ctx, t);
1012 ctx = TYPE_CONTEXT (ctx))
5d6e94a7 1013 if (TREE_CODE (ctx) == UNION_TYPE
1014 || !ANON_AGGR_TYPE_P (ctx))
c8470848 1015 break;
1016 /* If this field is not a member of a union, skip it. */
b01002fa 1017 if (TREE_CODE (ctx) != UNION_TYPE)
80e54732 1018 goto next;
1019
5d6e94a7 1020 /* If this union member has no explicit initializer and no NSDMI,
1021 splice it out. */
1022 if (TREE_VALUE (init) || DECL_INITIAL (field))
1023 /* OK. */;
1024 else
80e54732 1025 goto splice;
471086d6 1026
c8470848 1027 /* It's only an error if we have two initializers for the same
1028 union type. */
5d6e94a7 1029 if (!last_p)
128e1d72 1030 {
5d6e94a7 1031 last_p = p;
80e54732 1032 goto next;
128e1d72 1033 }
471086d6 1034
c8470848 1035 /* See if LAST_FIELD and the field initialized by INIT are
1036 members of the same union. If so, there's a problem,
1037 unless they're actually members of the same structure
1038 which is itself a member of a union. For example, given:
471086d6 1039
c8470848 1040 union { struct { int i; int j; }; };
1041
1042 initializing both `i' and `j' makes sense. */
5d6e94a7 1043 ctx = common_enclosing_class (DECL_CONTEXT (field),
1044 DECL_CONTEXT (TREE_PURPOSE (*last_p)));
1045
1046 if (ctx && TREE_CODE (ctx) == UNION_TYPE)
471086d6 1047 {
5d6e94a7 1048 /* A mem-initializer hides an NSDMI. */
1049 if (TREE_VALUE (init) && !TREE_VALUE (*last_p))
1050 *last_p = TREE_CHAIN (*last_p);
1051 else if (TREE_VALUE (*last_p) && !TREE_VALUE (init))
1052 goto splice;
1053 else
a0b513fb 1054 {
1055 error_at (DECL_SOURCE_LOCATION (current_function_decl),
1056 "initializations for multiple members of %qT",
1057 ctx);
1058 goto splice;
1059 }
471086d6 1060 }
c8470848 1061
5d6e94a7 1062 last_p = p;
80e54732 1063
1064 next:
1065 p = &TREE_CHAIN (*p);
1066 continue;
1067 splice:
1068 *p = TREE_CHAIN (*p);
1069 continue;
1e66592c 1070 }
1071 }
471086d6 1072
6507cda8 1073 return sorted_inits;
1e66592c 1074}
1075
6507cda8 1076/* Initialize all bases and members of CURRENT_CLASS_TYPE. MEM_INITS
1077 is a TREE_LIST giving the explicit mem-initializer-list for the
1078 constructor. The TREE_PURPOSE of each entry is a subobject (a
1079 FIELD_DECL or a BINFO) of the CURRENT_CLASS_TYPE. The TREE_VALUE
1080 is a TREE_LIST giving the arguments to the constructor or
1081 void_type_node for an empty list of arguments. */
d0622bdf 1082
bb855ff9 1083void
6507cda8 1084emit_mem_initializers (tree mem_inits)
471086d6 1085{
ed2deec6 1086 int flags = LOOKUP_NORMAL;
1087
41dbd8dc 1088 /* We will already have issued an error message about the fact that
1089 the type is incomplete. */
1090 if (!COMPLETE_TYPE_P (current_class_type))
1091 return;
9031d10b 1092
90510c63 1093 if (mem_inits
1094 && TYPE_P (TREE_PURPOSE (mem_inits))
1095 && same_type_p (TREE_PURPOSE (mem_inits), current_class_type))
1096 {
1097 /* Delegating constructor. */
1098 gcc_assert (TREE_CHAIN (mem_inits) == NULL_TREE);
1099 perform_target_ctor (TREE_VALUE (mem_inits));
1100 return;
1101 }
1102
fa6e8832 1103 if (DECL_DEFAULTED_FN (current_function_decl)
1104 && ! DECL_INHERITED_CTOR_BASE (current_function_decl))
ed2deec6 1105 flags |= LOOKUP_DEFAULTED;
1106
6507cda8 1107 /* Sort the mem-initializers into the order in which the
1108 initializations should be performed. */
1109 mem_inits = sort_mem_initializers (current_class_type, mem_inits);
471086d6 1110
5f1653d2 1111 in_base_initializer = 1;
9031d10b 1112
6507cda8 1113 /* Initialize base classes. */
53ab5bcd 1114 for (; (mem_inits
1115 && TREE_CODE (TREE_PURPOSE (mem_inits)) != FIELD_DECL);
1116 mem_inits = TREE_CHAIN (mem_inits))
471086d6 1117 {
6507cda8 1118 tree subobject = TREE_PURPOSE (mem_inits);
1119 tree arguments = TREE_VALUE (mem_inits);
1120
53ab5bcd 1121 /* We already have issued an error message. */
1122 if (arguments == error_mark_node)
1123 continue;
1124
ca63c29a 1125 if (arguments == NULL_TREE)
1126 {
1127 /* If these initializations are taking place in a copy constructor,
1128 the base class should probably be explicitly initialized if there
1129 is a user-defined constructor in the base class (other than the
1130 default constructor, which will be called anyway). */
1131 if (extra_warnings
1132 && DECL_COPY_CONSTRUCTOR_P (current_function_decl)
1133 && type_has_user_nondefault_constructor (BINFO_TYPE (subobject)))
1134 warning_at (DECL_SOURCE_LOCATION (current_function_decl),
1135 OPT_Wextra, "base class %q#T should be explicitly "
1136 "initialized in the copy constructor",
1137 BINFO_TYPE (subobject));
ca63c29a 1138 }
6507cda8 1139
6507cda8 1140 /* Initialize the base. */
57c28194 1141 if (BINFO_VIRTUAL_P (subobject))
6507cda8 1142 construct_virtual_base (subobject, arguments);
1143 else
1e66592c 1144 {
6507cda8 1145 tree base_addr;
9031d10b 1146
6507cda8 1147 base_addr = build_base_path (PLUS_EXPR, current_class_ptr,
1e74225a 1148 subobject, 1, tf_warning_or_error);
6507cda8 1149 expand_aggr_init_1 (subobject, NULL_TREE,
f08923b3 1150 cp_build_indirect_ref (base_addr, RO_NULL,
ebd21de4 1151 tf_warning_or_error),
6507cda8 1152 arguments,
ed2deec6 1153 flags,
ebd21de4 1154 tf_warning_or_error);
6507cda8 1155 expand_cleanup_for_base (subobject, NULL_TREE);
471086d6 1156 }
471086d6 1157 }
5f1653d2 1158 in_base_initializer = 0;
471086d6 1159
6507cda8 1160 /* Initialize the vptrs. */
9e92dee9 1161 initialize_vtbl_ptrs (current_class_ptr);
9031d10b 1162
6507cda8 1163 /* Initialize the data members. */
1164 while (mem_inits)
471086d6 1165 {
6507cda8 1166 perform_member_init (TREE_PURPOSE (mem_inits),
1167 TREE_VALUE (mem_inits));
1168 mem_inits = TREE_CHAIN (mem_inits);
1e66592c 1169 }
471086d6 1170}
1171
0ce25b06 1172/* Returns the address of the vtable (i.e., the value that should be
1173 assigned to the vptr) for BINFO. */
1174
b710ec85 1175tree
6c5ad428 1176build_vtbl_address (tree binfo)
0ce25b06 1177{
f235209b 1178 tree binfo_for = binfo;
0ce25b06 1179 tree vtbl;
1180
eea75c62 1181 if (BINFO_VPTR_INDEX (binfo) && BINFO_VIRTUAL_P (binfo))
f235209b 1182 /* If this is a virtual primary base, then the vtable we want to store
1183 is that for the base this is being used as the primary base of. We
1184 can't simply skip the initialization, because we may be expanding the
1185 inits of a subobject constructor where the virtual base layout
1186 can be different. */
eea75c62 1187 while (BINFO_PRIMARY_P (binfo_for))
1188 binfo_for = BINFO_INHERITANCE_CHAIN (binfo_for);
f235209b 1189
0ce25b06 1190 /* Figure out what vtable BINFO's vtable is based on, and mark it as
1191 used. */
f235209b 1192 vtbl = get_vtbl_decl_for_binfo (binfo_for);
6d579d92 1193 TREE_USED (vtbl) = true;
0ce25b06 1194
1195 /* Now compute the address to use when initializing the vptr. */
4ee9c684 1196 vtbl = unshare_expr (BINFO_VTABLE (binfo_for));
80a58eb0 1197 if (VAR_P (vtbl))
4ee9c684 1198 vtbl = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (vtbl)), vtbl);
0ce25b06 1199
1200 return vtbl;
1201}
1202
471086d6 1203/* This code sets up the virtual function tables appropriate for
1204 the pointer DECL. It is a one-ply initialization.
1205
1206 BINFO is the exact type that DECL is supposed to be. In
1207 multiple inheritance, this might mean "C's A" if C : A, B. */
96624a9e 1208
0543e7a9 1209static void
6c5ad428 1210expand_virtual_init (tree binfo, tree decl)
471086d6 1211{
471086d6 1212 tree vtbl, vtbl_ptr;
0ce25b06 1213 tree vtt_index;
471086d6 1214
0ce25b06 1215 /* Compute the initializer for vptr. */
1216 vtbl = build_vtbl_address (binfo);
1217
5ad590ad 1218 /* We may get this vptr from a VTT, if this is a subobject
1219 constructor or subobject destructor. */
0ce25b06 1220 vtt_index = BINFO_VPTR_INDEX (binfo);
1221 if (vtt_index)
1222 {
1223 tree vtbl2;
1224 tree vtt_parm;
1225
1226 /* Compute the value to use, when there's a VTT. */
dcbeb3ef 1227 vtt_parm = current_vtt_parm;
2cc66f2a 1228 vtbl2 = fold_build_pointer_plus (vtt_parm, vtt_index);
f08923b3 1229 vtbl2 = cp_build_indirect_ref (vtbl2, RO_NULL, tf_warning_or_error);
4ee9c684 1230 vtbl2 = convert (TREE_TYPE (vtbl), vtbl2);
0ce25b06 1231
1232 /* The actual initializer is the VTT value only in the subobject
1233 constructor. In maybe_clone_body we'll substitute NULL for
1234 the vtt_parm in the case of the non-subobject constructor. */
9031d10b 1235 vtbl = build3 (COND_EXPR,
1236 TREE_TYPE (vtbl),
831d52a2 1237 build2 (EQ_EXPR, boolean_type_node,
1238 current_in_charge_parm, integer_zero_node),
9031d10b 1239 vtbl2,
831d52a2 1240 vtbl);
0ce25b06 1241 }
d3cc25c3 1242
1243 /* Compute the location of the vtpr. */
f08923b3 1244 vtbl_ptr = build_vfield_ref (cp_build_indirect_ref (decl, RO_NULL,
ebd21de4 1245 tf_warning_or_error),
4a2680fc 1246 TREE_TYPE (binfo));
b4df430b 1247 gcc_assert (vtbl_ptr != error_mark_node);
471086d6 1248
d3cc25c3 1249 /* Assign the vtable to the vptr. */
c4698a21 1250 vtbl = convert_force (TREE_TYPE (vtbl_ptr), vtbl, 0, tf_warning_or_error);
ebd21de4 1251 finish_expr_stmt (cp_build_modify_expr (vtbl_ptr, NOP_EXPR, vtbl,
1252 tf_warning_or_error));
471086d6 1253}
1254
1fb2fa9c 1255/* If an exception is thrown in a constructor, those base classes already
1256 constructed must be destroyed. This function creates the cleanup
dcd15001 1257 for BINFO, which has just been constructed. If FLAG is non-NULL,
3160db1d 1258 it is a DECL which is nonzero when this base needs to be
dcd15001 1259 destroyed. */
1fb2fa9c 1260
1261static void
6c5ad428 1262expand_cleanup_for_base (tree binfo, tree flag)
1fb2fa9c 1263{
1264 tree expr;
1265
575852de 1266 if (!type_build_dtor_call (BINFO_TYPE (binfo)))
1fb2fa9c 1267 return;
1268
dcd15001 1269 /* Call the destructor. */
9031d10b 1270 expr = build_special_member_call (current_class_ref,
f70cb9e6 1271 base_dtor_identifier,
f352a3fb 1272 NULL,
f70cb9e6 1273 binfo,
ebd21de4 1274 LOOKUP_NORMAL | LOOKUP_NONVIRTUAL,
1275 tf_warning_or_error);
575852de 1276
1277 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (BINFO_TYPE (binfo)))
1278 return;
1279
dcd15001 1280 if (flag)
389dd41b 1281 expr = fold_build3_loc (input_location,
1282 COND_EXPR, void_type_node,
8e70fb09 1283 c_common_truthvalue_conversion (input_location, flag),
b7837065 1284 expr, integer_zero_node);
dcd15001 1285
a9bc793b 1286 finish_eh_cleanup (expr);
1fb2fa9c 1287}
1288
6507cda8 1289/* Construct the virtual base-class VBASE passing the ARGUMENTS to its
1290 constructor. */
96624a9e 1291
471086d6 1292static void
6507cda8 1293construct_virtual_base (tree vbase, tree arguments)
471086d6 1294{
6507cda8 1295 tree inner_if_stmt;
6507cda8 1296 tree exp;
9031d10b 1297 tree flag;
6507cda8 1298
1299 /* If there are virtual base classes with destructors, we need to
1300 emit cleanups to destroy them if an exception is thrown during
1301 the construction process. These exception regions (i.e., the
1302 period during which the cleanups must occur) begin from the time
1303 the construction is complete to the end of the function. If we
1304 create a conditional block in which to initialize the
1305 base-classes, then the cleanup region for the virtual base begins
1306 inside a block, and ends outside of that block. This situation
1307 confuses the sjlj exception-handling code. Therefore, we do not
1308 create a single conditional block, but one for each
1309 initialization. (That way the cleanup regions always begin
a17c2a3a 1310 in the outer block.) We trust the back end to figure out
6507cda8 1311 that the FLAG will not change across initializations, and
1312 avoid doing multiple tests. */
1767a056 1313 flag = DECL_CHAIN (DECL_ARGUMENTS (current_function_decl));
6507cda8 1314 inner_if_stmt = begin_if_stmt ();
1315 finish_if_stmt_cond (flag, inner_if_stmt);
6507cda8 1316
1317 /* Compute the location of the virtual base. If we're
1318 constructing virtual bases, then we must be the most derived
1319 class. Therefore, we don't have to look up the virtual base;
1320 we already know where it is. */
c1c5bfe2 1321 exp = convert_to_base_statically (current_class_ref, vbase);
1322
9031d10b 1323 expand_aggr_init_1 (vbase, current_class_ref, exp, arguments,
c4698a21 1324 0, tf_warning_or_error);
6507cda8 1325 finish_then_clause (inner_if_stmt);
2363ef00 1326 finish_if_stmt (inner_if_stmt);
6507cda8 1327
1328 expand_cleanup_for_base (vbase, flag);
471086d6 1329}
1330
de9554eb 1331/* Find the context in which this FIELD can be initialized. */
96624a9e 1332
de9554eb 1333static tree
6c5ad428 1334initializing_context (tree field)
de9554eb 1335{
1336 tree t = DECL_CONTEXT (field);
1337
1338 /* Anonymous union members can be initialized in the first enclosing
1339 non-anonymous union context. */
128e1d72 1340 while (t && ANON_AGGR_TYPE_P (t))
de9554eb 1341 t = TYPE_CONTEXT (t);
1342 return t;
1343}
1344
471086d6 1345/* Function to give error message if member initialization specification
1346 is erroneous. FIELD is the member we decided to initialize.
1347 TYPE is the type for which the initialization is being performed.
3d4e092a 1348 FIELD must be a member of TYPE.
9031d10b 1349
471086d6 1350 MEMBER_NAME is the name of the member. */
1351
1352static int
6c5ad428 1353member_init_ok_or_else (tree field, tree type, tree member_name)
471086d6 1354{
1355 if (field == error_mark_node)
1356 return 0;
0a3b29ad 1357 if (!field)
471086d6 1358 {
05949fae 1359 error ("class %qT does not have any field named %qD", type,
0a3b29ad 1360 member_name);
471086d6 1361 return 0;
1362 }
80a58eb0 1363 if (VAR_P (field))
1e66592c 1364 {
05949fae 1365 error ("%q#D is a static data member; it can only be "
0a3b29ad 1366 "initialized at its definition",
1367 field);
1368 return 0;
1369 }
1370 if (TREE_CODE (field) != FIELD_DECL)
1371 {
05949fae 1372 error ("%q#D is not a non-static data member of %qT",
0a3b29ad 1373 field, type);
1374 return 0;
1375 }
1376 if (initializing_context (field) != type)
1377 {
05949fae 1378 error ("class %qT does not have any field named %qD", type,
0a3b29ad 1379 member_name);
1e66592c 1380 return 0;
1381 }
1382
471086d6 1383 return 1;
1384}
1385
6507cda8 1386/* NAME is a FIELD_DECL, an IDENTIFIER_NODE which names a field, or it
1387 is a _TYPE node or TYPE_DECL which names a base for that type.
5f1653d2 1388 Check the validity of NAME, and return either the base _TYPE, base
1389 binfo, or the FIELD_DECL of the member. If NAME is invalid, return
6507cda8 1390 NULL_TREE and issue a diagnostic.
471086d6 1391
4e7d3e4d 1392 An old style unnamed direct single base construction is permitted,
1393 where NAME is NULL. */
471086d6 1394
bc577f39 1395tree
5f1653d2 1396expand_member_init (tree name)
471086d6 1397{
6507cda8 1398 tree basetype;
1399 tree field;
471086d6 1400
6507cda8 1401 if (!current_class_ref)
bc577f39 1402 return NULL_TREE;
471086d6 1403
4e7d3e4d 1404 if (!name)
8b1e0315 1405 {
4e7d3e4d 1406 /* This is an obsolete unnamed base class initializer. The
1407 parser will already have warned about its use. */
2cfde4f3 1408 switch (BINFO_N_BASE_BINFOS (TYPE_BINFO (current_class_type)))
4e7d3e4d 1409 {
1410 case 0:
05949fae 1411 error ("unnamed initializer for %qT, which has no base classes",
6507cda8 1412 current_class_type);
4e7d3e4d 1413 return NULL_TREE;
1414 case 1:
2cfde4f3 1415 basetype = BINFO_TYPE
1416 (BINFO_BASE_BINFO (TYPE_BINFO (current_class_type), 0));
4e7d3e4d 1417 break;
1418 default:
05949fae 1419 error ("unnamed initializer for %qT, which uses multiple inheritance",
6507cda8 1420 current_class_type);
4e7d3e4d 1421 return NULL_TREE;
1422 }
8b1e0315 1423 }
4e7d3e4d 1424 else if (TYPE_P (name))
652e1a2d 1425 {
d085a847 1426 basetype = TYPE_MAIN_VARIANT (name);
4e7d3e4d 1427 name = TYPE_NAME (name);
652e1a2d 1428 }
4e7d3e4d 1429 else if (TREE_CODE (name) == TYPE_DECL)
1430 basetype = TYPE_MAIN_VARIANT (TREE_TYPE (name));
6507cda8 1431 else
1432 basetype = NULL_TREE;
471086d6 1433
4e7d3e4d 1434 if (basetype)
bf356568 1435 {
f7a7eabc 1436 tree class_binfo;
1437 tree direct_binfo;
1438 tree virtual_binfo;
1439 int i;
6507cda8 1440
9b57de8d 1441 if (current_template_parms
1442 || same_type_p (basetype, current_class_type))
90510c63 1443 return basetype;
6507cda8 1444
f7a7eabc 1445 class_binfo = TYPE_BINFO (current_class_type);
1446 direct_binfo = NULL_TREE;
1447 virtual_binfo = NULL_TREE;
1448
1449 /* Look for a direct base. */
f6cc6a08 1450 for (i = 0; BINFO_BASE_ITERATE (class_binfo, i, direct_binfo); ++i)
5e8d5ca1 1451 if (SAME_BINFO_TYPE_P (BINFO_TYPE (direct_binfo), basetype))
f6cc6a08 1452 break;
1453
f7a7eabc 1454 /* Look for a virtual base -- unless the direct base is itself
1455 virtual. */
57c28194 1456 if (!direct_binfo || !BINFO_VIRTUAL_P (direct_binfo))
97c118b9 1457 virtual_binfo = binfo_for_vbase (basetype, current_class_type);
f7a7eabc 1458
1459 /* [class.base.init]
9031d10b 1460
653e5405 1461 If a mem-initializer-id is ambiguous because it designates
f7a7eabc 1462 both a direct non-virtual base class and an inherited virtual
1463 base class, the mem-initializer is ill-formed. */
1464 if (direct_binfo && virtual_binfo)
1465 {
05949fae 1466 error ("%qD is both a direct base and an indirect virtual base",
f7a7eabc 1467 basetype);
1468 return NULL_TREE;
1469 }
1470
1471 if (!direct_binfo && !virtual_binfo)
471086d6 1472 {
1f0b839e 1473 if (CLASSTYPE_VBASECLASSES (current_class_type))
6c3d4e0b 1474 error ("type %qT is not a direct or virtual base of %qT",
1475 basetype, current_class_type);
bf356568 1476 else
6c3d4e0b 1477 error ("type %qT is not a direct base of %qT",
1478 basetype, current_class_type);
bc577f39 1479 return NULL_TREE;
bf356568 1480 }
f7a7eabc 1481
1482 return direct_binfo ? direct_binfo : virtual_binfo;
bf356568 1483 }
1484 else
1485 {
694683bb 1486 if (identifier_p (name))
b330805e 1487 field = lookup_field (current_class_type, name, 1, false);
6507cda8 1488 else
1489 field = name;
471086d6 1490
6507cda8 1491 if (member_init_ok_or_else (field, current_class_type, name))
5f1653d2 1492 return field;
bf356568 1493 }
bc577f39 1494
6507cda8 1495 return NULL_TREE;
471086d6 1496}
1497
1498/* This is like `expand_member_init', only it stores one aggregate
1499 value into another.
1500
1501 INIT comes in two flavors: it is either a value which
1502 is to be stored in EXP, or it is a parameter list
1503 to go to a constructor, which will operate on EXP.
ce28ee2e 1504 If INIT is not a parameter list for a constructor, then set
1505 LOOKUP_ONLYCONVERTING.
a74e8896 1506 If FLAGS is LOOKUP_ONLYCONVERTING then it is the = init form of
1507 the initializer, if FLAGS is 0, then it is the (init) form.
471086d6 1508 If `init' is a CONSTRUCTOR, then we emit a warning message,
3748625f 1509 explaining that such initializations are invalid.
471086d6 1510
471086d6 1511 If INIT resolves to a CALL_EXPR which happens to return
1512 something of the type we are looking for, then we know
1513 that we can safely use that call to perform the
1514 initialization.
1515
1516 The virtual function table pointer cannot be set up here, because
1517 we do not really know its type.
1518
471086d6 1519 This never calls operator=().
1520
1521 When initializing, nothing is CONST.
1522
1523 A default copy constructor may have to be used to perform the
1524 initialization.
1525
1526 A constructor or a conversion operator may have to be used to
96624a9e 1527 perform the initialization, but not both, as it would be ambiguous. */
471086d6 1528
b48733fd 1529tree
ebd21de4 1530build_aggr_init (tree exp, tree init, int flags, tsubst_flags_t complain)
471086d6 1531{
b48733fd 1532 tree stmt_expr;
1533 tree compound_stmt;
1534 int destroy_temps;
471086d6 1535 tree type = TREE_TYPE (exp);
1536 int was_const = TREE_READONLY (exp);
ce28ee2e 1537 int was_volatile = TREE_THIS_VOLATILE (exp);
4bd132ff 1538 int is_global;
471086d6 1539
1540 if (init == error_mark_node)
b48733fd 1541 return error_mark_node;
471086d6 1542
1543 TREE_READONLY (exp) = 0;
ce28ee2e 1544 TREE_THIS_VOLATILE (exp) = 0;
1545
294db8f9 1546 if (init && init != void_type_node
1547 && TREE_CODE (init) != TREE_LIST
d57ad610 1548 && !(TREE_CODE (init) == TARGET_EXPR
1549 && TARGET_EXPR_DIRECT_INIT_P (init))
8e8713cd 1550 && !DIRECT_LIST_INIT_P (init))
ce28ee2e 1551 flags |= LOOKUP_ONLYCONVERTING;
471086d6 1552
1553 if (TREE_CODE (type) == ARRAY_TYPE)
1554 {
edbb6c80 1555 tree itype;
1556
e6517de8 1557 /* An array may not be initialized use the parenthesized
1558 initialization form -- unless the initializer is "()". */
1559 if (init && TREE_CODE (init) == TREE_LIST)
471086d6 1560 {
ebd21de4 1561 if (complain & tf_error)
1562 error ("bad array initializer");
b48733fd 1563 return error_mark_node;
471086d6 1564 }
e6517de8 1565 /* Must arrange to initialize each element of EXP
1566 from elements of INIT. */
edbb6c80 1567 itype = init ? TREE_TYPE (init) : NULL_TREE;
f3943982 1568 if (cv_qualified_p (type))
1569 TREE_TYPE (exp) = cv_unqualified (type);
1570 if (itype && cv_qualified_p (itype))
1571 TREE_TYPE (init) = cv_unqualified (itype);
0473b1af 1572 stmt_expr = build_vec_init (exp, NULL_TREE, init,
0152e879 1573 /*explicit_value_init_p=*/false,
f3943982 1574 itype && same_type_p (TREE_TYPE (init),
ebd21de4 1575 TREE_TYPE (exp)),
1576 complain);
471086d6 1577 TREE_READONLY (exp) = was_const;
ce28ee2e 1578 TREE_THIS_VOLATILE (exp) = was_volatile;
471086d6 1579 TREE_TYPE (exp) = type;
80945b46 1580 /* Restore the type of init unless it was used directly. */
1581 if (init && TREE_CODE (stmt_expr) != INIT_EXPR)
c38086bd 1582 TREE_TYPE (init) = itype;
b48733fd 1583 return stmt_expr;
471086d6 1584 }
1585
a96c3cc1 1586 if ((VAR_P (exp) || TREE_CODE (exp) == PARM_DECL)
1587 && !lookup_attribute ("warn_unused", TYPE_ATTRIBUTES (type)))
331bc0ad 1588 /* Just know that we've seen something for this node. */
471086d6 1589 TREE_USED (exp) = 1;
1590
4bd132ff 1591 is_global = begin_init_stmts (&stmt_expr, &compound_stmt);
5c3247a9 1592 destroy_temps = stmts_are_full_exprs_p ();
a08e60ae 1593 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
471086d6 1594 expand_aggr_init_1 (TYPE_BINFO (type), exp, exp,
ebd21de4 1595 init, LOOKUP_NORMAL|flags, complain);
4bd132ff 1596 stmt_expr = finish_init_stmts (is_global, stmt_expr, compound_stmt);
a08e60ae 1597 current_stmt_tree ()->stmts_are_full_exprs_p = destroy_temps;
471086d6 1598 TREE_READONLY (exp) = was_const;
ce28ee2e 1599 TREE_THIS_VOLATILE (exp) = was_volatile;
b48733fd 1600
1601 return stmt_expr;
471086d6 1602}
1603
1604static void
ebd21de4 1605expand_default_init (tree binfo, tree true_exp, tree exp, tree init, int flags,
1606 tsubst_flags_t complain)
471086d6 1607{
d2a15a12 1608 tree type = TREE_TYPE (exp);
cfb46e1f 1609 tree ctor_name;
d2a15a12 1610
471086d6 1611 /* It fails because there may not be a constructor which takes
1612 its own type as the first (or only parameter), but which does
1613 take other types via a conversion. So, if the thing initializing
1614 the expression is a unit element of type X, first try X(X&),
1615 followed by initialization by X. If neither of these work
1616 out, then look hard. */
1617 tree rval;
f1f41a6c 1618 vec<tree, va_gc> *parms;
471086d6 1619
90ca6a25 1620 /* If we have direct-initialization from an initializer list, pull
1621 it out of the TREE_LIST so the code below can see it. */
1622 if (init && TREE_CODE (init) == TREE_LIST
8e8713cd 1623 && DIRECT_LIST_INIT_P (TREE_VALUE (init)))
90ca6a25 1624 {
1625 gcc_checking_assert ((flags & LOOKUP_ONLYCONVERTING) == 0
1626 && TREE_CHAIN (init) == NULL_TREE);
1627 init = TREE_VALUE (init);
1628 }
1629
dbfcf378 1630 if (init && BRACE_ENCLOSED_INITIALIZER_P (init)
1631 && CP_AGGREGATE_TYPE_P (type))
d57ad610 1632 /* A brace-enclosed initializer for an aggregate. In C++0x this can
1633 happen for direct-initialization, too. */
34569785 1634 {
1635 init = reshape_init (type, init, complain);
1636 init = digest_init (type, init, complain);
1637 }
d57ad610 1638
1639 /* A CONSTRUCTOR of the target's type is a previously digested
1640 initializer, whether that happened just above or in
1641 cp_parser_late_parsing_nsdmi.
1642
1643 A TARGET_EXPR with TARGET_EXPR_DIRECT_INIT_P or TARGET_EXPR_LIST_INIT_P
1644 set represents the whole initialization, so we shouldn't build up
1645 another ctor call. */
1646 if (init
1647 && (TREE_CODE (init) == CONSTRUCTOR
1648 || (TREE_CODE (init) == TARGET_EXPR
1649 && (TARGET_EXPR_DIRECT_INIT_P (init)
1650 || TARGET_EXPR_LIST_INIT_P (init))))
1651 && same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (init), type))
dbfcf378 1652 {
d57ad610 1653 /* Early initialization via a TARGET_EXPR only works for
1654 complete objects. */
1655 gcc_assert (TREE_CODE (init) == CONSTRUCTOR || true_exp == exp);
1656
dbfcf378 1657 init = build2 (INIT_EXPR, TREE_TYPE (exp), exp, init);
1658 TREE_SIDE_EFFECTS (init) = 1;
1659 finish_expr_stmt (init);
1660 return;
1661 }
1662
0a4be248 1663 if (init && TREE_CODE (init) != TREE_LIST
860740a7 1664 && (flags & LOOKUP_ONLYCONVERTING))
1665 {
1666 /* Base subobjects should only get direct-initialization. */
092b1d6f 1667 gcc_assert (true_exp == exp);
860740a7 1668
011310f7 1669 if (flags & DIRECT_BIND)
1670 /* Do nothing. We hit this in two cases: Reference initialization,
1671 where we aren't initializing a real variable, so we don't want
1672 to run a new constructor; and catching an exception, where we
1673 have already built up the constructor call so we could wrap it
1674 in an exception region. */;
1675 else
c4698a21 1676 init = ocp_convert (type, init, CONV_IMPLICIT|CONV_FORCE_TEMP,
1677 flags, complain);
860740a7 1678
bdb2219e 1679 if (TREE_CODE (init) == MUST_NOT_THROW_EXPR)
1680 /* We need to protect the initialization of a catch parm with a
1681 call to terminate(), which shows up as a MUST_NOT_THROW_EXPR
edf8c644 1682 around the TARGET_EXPR for the copy constructor. See
bdb2219e 1683 initialize_handler_parm. */
1684 {
831d52a2 1685 TREE_OPERAND (init, 0) = build2 (INIT_EXPR, TREE_TYPE (exp), exp,
1686 TREE_OPERAND (init, 0));
bdb2219e 1687 TREE_TYPE (init) = void_type_node;
1688 }
edf8c644 1689 else
831d52a2 1690 init = build2 (INIT_EXPR, TREE_TYPE (exp), exp, init);
edf8c644 1691 TREE_SIDE_EFFECTS (init) = 1;
b48733fd 1692 finish_expr_stmt (init);
860740a7 1693 return;
1694 }
1695
f352a3fb 1696 if (init == NULL_TREE)
1697 parms = NULL;
1698 else if (TREE_CODE (init) == TREE_LIST && !TREE_TYPE (init))
471086d6 1699 {
f352a3fb 1700 parms = make_tree_vector ();
1701 for (; init != NULL_TREE; init = TREE_CHAIN (init))
f1f41a6c 1702 vec_safe_push (parms, TREE_VALUE (init));
471086d6 1703 }
471086d6 1704 else
f352a3fb 1705 parms = make_tree_vector_single (init);
471086d6 1706
90510c63 1707 if (exp == current_class_ref && current_function_decl
1708 && DECL_HAS_IN_CHARGE_PARM_P (current_function_decl))
1709 {
1710 /* Delegating constructor. */
1711 tree complete;
1712 tree base;
50ca8af4 1713 tree elt; unsigned i;
1714
1715 /* Unshare the arguments for the second call. */
f1f41a6c 1716 vec<tree, va_gc> *parms2 = make_tree_vector ();
1717 FOR_EACH_VEC_SAFE_ELT (parms, i, elt)
50ca8af4 1718 {
1719 elt = break_out_target_exprs (elt);
f1f41a6c 1720 vec_safe_push (parms2, elt);
50ca8af4 1721 }
90510c63 1722 complete = build_special_member_call (exp, complete_ctor_identifier,
50ca8af4 1723 &parms2, binfo, flags,
1724 complain);
1725 complete = fold_build_cleanup_point_expr (void_type_node, complete);
1726 release_tree_vector (parms2);
1727
90510c63 1728 base = build_special_member_call (exp, base_ctor_identifier,
1729 &parms, binfo, flags,
1730 complain);
50ca8af4 1731 base = fold_build_cleanup_point_expr (void_type_node, base);
1732 rval = build3 (COND_EXPR, void_type_node,
1733 build2 (EQ_EXPR, boolean_type_node,
1734 current_in_charge_parm, integer_zero_node),
1735 base,
1736 complete);
90510c63 1737 }
1738 else
1739 {
1740 if (true_exp == exp)
1741 ctor_name = complete_ctor_identifier;
1742 else
1743 ctor_name = base_ctor_identifier;
1744 rval = build_special_member_call (exp, ctor_name, &parms, binfo, flags,
1745 complain);
1746 }
f352a3fb 1747
1748 if (parms != NULL)
1749 release_tree_vector (parms);
1750
ce984e5e 1751 if (exp == true_exp && TREE_CODE (rval) == CALL_EXPR)
1752 {
1753 tree fn = get_callee_fndecl (rval);
9e2e1c78 1754 if (fn && DECL_DECLARED_CONSTEXPR_P (fn))
ce984e5e 1755 {
cf72f34d 1756 tree e = maybe_constant_init (rval, exp);
ce984e5e 1757 if (TREE_CONSTANT (e))
1758 rval = build2 (INIT_EXPR, type, exp, e);
1759 }
1760 }
1761
1762 /* FIXME put back convert_to_void? */
3aa622aa 1763 if (TREE_SIDE_EFFECTS (rval))
ce984e5e 1764 finish_expr_stmt (rval);
471086d6 1765}
1766
1767/* This function is responsible for initializing EXP with INIT
1768 (if any).
1769
1770 BINFO is the binfo of the type for who we are performing the
1771 initialization. For example, if W is a virtual base class of A and B,
1772 and C : A, B.
1773 If we are initializing B, then W must contain B's W vtable, whereas
1774 were we initializing C, W must contain C's W vtable.
1775
1776 TRUE_EXP is nonzero if it is the true expression being initialized.
1777 In this case, it may be EXP, or may just contain EXP. The reason we
1778 need this is because if EXP is a base element of TRUE_EXP, we
1779 don't necessarily know by looking at EXP where its virtual
1780 baseclass fields should really be pointing. But we do know
1781 from TRUE_EXP. In constructors, we don't know anything about
1782 the value being initialized.
1783
3c33f9f3 1784 FLAGS is just passed to `build_new_method_call'. See that function
1785 for its description. */
471086d6 1786
1787static void
ebd21de4 1788expand_aggr_init_1 (tree binfo, tree true_exp, tree exp, tree init, int flags,
1789 tsubst_flags_t complain)
471086d6 1790{
1791 tree type = TREE_TYPE (exp);
471086d6 1792
b4df430b 1793 gcc_assert (init != error_mark_node && type != error_mark_node);
cacfdc02 1794 gcc_assert (building_stmt_list_p ());
471086d6 1795
1796 /* Use a function returning the desired type to initialize EXP for us.
1797 If the function is a constructor, and its first argument is
1798 NULL_TREE, know that it was meant for us--just slide exp on
1799 in and expand the constructor. Constructors now come
1800 as TARGET_EXPRs. */
860740a7 1801
80a58eb0 1802 if (init && VAR_P (exp)
79b01846 1803 && COMPOUND_LITERAL_P (init))
860740a7 1804 {
f1f41a6c 1805 vec<tree, va_gc> *cleanups = NULL;
b48733fd 1806 /* If store_init_value returns NULL_TREE, the INIT has been
79b01846 1807 recorded as the DECL_INITIAL for EXP. That means there's
b48733fd 1808 nothing more we have to do. */
c7b89256 1809 init = store_init_value (exp, init, &cleanups, flags);
3afe9b43 1810 if (init)
1811 finish_expr_stmt (init);
c7b89256 1812 gcc_assert (!cleanups);
860740a7 1813 return;
1814 }
1815
daed64ba 1816 /* If an explicit -- but empty -- initializer list was present,
1817 that's value-initialization. */
1818 if (init == void_type_node)
1819 {
17d06bda 1820 /* If the type has data but no user-provided ctor, we need to zero
1821 out the object. */
1822 if (!type_has_user_provided_constructor (type)
1823 && !is_really_empty_class (type))
daed64ba 1824 {
66fa5717 1825 tree field_size = NULL_TREE;
1826 if (exp != true_exp && CLASSTYPE_AS_BASE (type) != type)
1827 /* Don't clobber already initialized virtual bases. */
1828 field_size = TYPE_SIZE (CLASSTYPE_AS_BASE (type));
1829 init = build_zero_init_1 (type, NULL_TREE, /*static_storage_p=*/false,
1830 field_size);
daed64ba 1831 init = build2 (INIT_EXPR, type, exp, init);
1832 finish_expr_stmt (init);
daed64ba 1833 }
66fa5717 1834
daed64ba 1835 /* If we don't need to mess with the constructor at all,
66fa5717 1836 then we're done. */
1837 if (! type_build_ctor_call (type))
1838 return;
1839
1840 /* Otherwise fall through and call the constructor. */
daed64ba 1841 init = NULL_TREE;
1842 }
1843
63b1d638 1844 /* We know that expand_default_init can handle everything we want
1845 at this point. */
ebd21de4 1846 expand_default_init (binfo, true_exp, exp, init, flags, complain);
471086d6 1847}
1848
95397ff9 1849/* Report an error if TYPE is not a user-defined, class type. If
652e1a2d 1850 OR_ELSE is nonzero, give an error message. */
96624a9e 1851
652e1a2d 1852int
95397ff9 1853is_class_type (tree type, int or_else)
652e1a2d 1854{
1855 if (type == error_mark_node)
1856 return 0;
1857
95397ff9 1858 if (! CLASS_TYPE_P (type))
652e1a2d 1859 {
1860 if (or_else)
95397ff9 1861 error ("%qT is not a class type", type);
652e1a2d 1862 return 0;
1863 }
1864 return 1;
1865}
1866
471086d6 1867tree
6c5ad428 1868get_type_value (tree name)
471086d6 1869{
471086d6 1870 if (name == error_mark_node)
1871 return NULL_TREE;
1872
1873 if (IDENTIFIER_HAS_TYPE_VALUE (name))
1874 return IDENTIFIER_TYPE_VALUE (name);
471086d6 1875 else
1876 return NULL_TREE;
1877}
d0d8836b 1878
1bc16cab 1879/* Build a reference to a member of an aggregate. This is not a C++
1880 `&', but really something which can have its address taken, and
1881 then act as a pointer to member, for example TYPE :: FIELD can have
1882 its address taken by saying & TYPE :: FIELD. ADDRESS_P is true if
1883 this expression is the operand of "&".
471086d6 1884
1885 @@ Prints out lousy diagnostics for operator <typename>
1886 @@ fields.
1887
ac9386a0 1888 @@ This function should be rewritten and placed in search.c. */
96624a9e 1889
471086d6 1890tree
20ce13a9 1891build_offset_ref (tree type, tree member, bool address_p,
1892 tsubst_flags_t complain)
471086d6 1893{
120c0017 1894 tree decl;
d2a15a12 1895 tree basebinfo = NULL_TREE;
471086d6 1896
7a623747 1897 /* class templates can come in as TEMPLATE_DECLs here. */
528638c9 1898 if (TREE_CODE (member) == TEMPLATE_DECL)
1899 return member;
1ac9b32b 1900
7d19d445 1901 if (dependent_scope_p (type) || type_dependent_expression_p (member))
1902 return build_qualified_name (NULL_TREE, type, member,
e67b8324 1903 /*template_p=*/false);
e857e9c7 1904
528638c9 1905 gcc_assert (TYPE_P (type));
95397ff9 1906 if (! is_class_type (type, 1))
feb98619 1907 return error_mark_node;
1908
528638c9 1909 gcc_assert (DECL_P (member) || BASELINK_P (member));
1910 /* Callers should call mark_used before this point. */
411978d2 1911 gcc_assert (!DECL_P (member) || TREE_USED (member));
652e1a2d 1912
7d19d445 1913 type = TYPE_MAIN_VARIANT (type);
869dcfe4 1914 if (!COMPLETE_OR_OPEN_TYPE_P (complete_type (type)))
471086d6 1915 {
20ce13a9 1916 if (complain & tf_error)
1917 error ("incomplete type %qT does not have member %qD", type, member);
1bc16cab 1918 return error_mark_node;
1919 }
1920
528638c9 1921 /* Entities other than non-static members need no further
074ab442 1922 processing. */
1bc16cab 1923 if (TREE_CODE (member) == TYPE_DECL)
528638c9 1924 return member;
80a58eb0 1925 if (VAR_P (member) || TREE_CODE (member) == CONST_DECL)
528638c9 1926 return convert_from_reference (member);
1bc16cab 1927
1928 if (TREE_CODE (member) == FIELD_DECL && DECL_C_BIT_FIELD (member))
1929 {
20ce13a9 1930 if (complain & tf_error)
1931 error ("invalid pointer to bit-field %qD", member);
1bc16cab 1932 return error_mark_node;
1933 }
1934
528638c9 1935 /* Set up BASEBINFO for member lookup. */
1936 decl = maybe_dummy_object (type, &basebinfo);
1937
c161288a 1938 /* A lot of this logic is now handled in lookup_member. */
1bc16cab 1939 if (BASELINK_P (member))
471086d6 1940 {
471086d6 1941 /* Go from the TREE_BASELINK to the member function info. */
55acdbb2 1942 tree t = BASELINK_FUNCTIONS (member);
471086d6 1943
4ac852cb 1944 if (TREE_CODE (t) != TEMPLATE_ID_EXPR && !really_overloaded_fn (t))
471086d6 1945 {
331bc0ad 1946 /* Get rid of a potential OVERLOAD around it. */
8417823c 1947 t = OVL_CURRENT (t);
1948
3d5bde25 1949 /* Unique functions are handled easily. */
1950
1951 /* For non-static member of base class, we need a special rule
1952 for access checking [class.protected]:
1953
1954 If the access is to form a pointer to member, the
1955 nested-name-specifier shall name the derived class
1956 (or any class derived from that class). */
1957 if (address_p && DECL_P (t)
1958 && DECL_NONSTATIC_MEMBER_P (t))
eb833cbe 1959 perform_or_defer_access_check (TYPE_BINFO (type), t, t,
20ce13a9 1960 complain);
3d5bde25 1961 else
eb833cbe 1962 perform_or_defer_access_check (basebinfo, t, t,
20ce13a9 1963 complain);
3d5bde25 1964
95b2ac55 1965 if (DECL_STATIC_FUNCTION_P (t))
1966 return t;
1bc16cab 1967 member = t;
1968 }
1969 else
55acdbb2 1970 TREE_TYPE (member) = unknown_type_node;
471086d6 1971 }
3d5bde25 1972 else if (address_p && TREE_CODE (member) == FIELD_DECL)
1973 /* We need additional test besides the one in
1974 check_accessibility_of_qualified_id in case it is
1975 a pointer to non-static member. */
eb833cbe 1976 perform_or_defer_access_check (TYPE_BINFO (type), member, member,
20ce13a9 1977 complain);
471086d6 1978
1bc16cab 1979 if (!address_p)
471086d6 1980 {
1bc16cab 1981 /* If MEMBER is non-static, then the program has fallen afoul of
1982 [expr.prim]:
471086d6 1983
1bc16cab 1984 An id-expression that denotes a nonstatic data member or
1985 nonstatic member function of a class can only be used:
471086d6 1986
1bc16cab 1987 -- as part of a class member access (_expr.ref_) in which the
1988 object-expression refers to the member's class or a class
1989 derived from that class, or
1e66592c 1990
1bc16cab 1991 -- to form a pointer to member (_expr.unary.op_), or
1992
1993 -- in the body of a nonstatic member function of that class or
1994 of a class derived from that class (_class.mfct.nonstatic_), or
1995
1996 -- in a mem-initializer for a constructor for that class or for
1997 a class derived from that class (_class.base.init_). */
1998 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (member))
1999 {
08cc44e7 2000 /* Build a representation of the qualified name suitable
b3beaf30 2001 for use as the operand to "&" -- even though the "&" is
2002 not actually present. */
831d52a2 2003 member = build2 (OFFSET_REF, TREE_TYPE (member), decl, member);
1bc16cab 2004 /* In Microsoft mode, treat a non-static member function as if
2005 it were a pointer-to-member. */
2006 if (flag_ms_extensions)
2007 {
1bc16cab 2008 PTRMEM_OK_P (member) = 1;
20ce13a9 2009 return cp_build_addr_expr (member, complain);
1bc16cab 2010 }
20ce13a9 2011 if (complain & tf_error)
2012 error ("invalid use of non-static member function %qD",
2013 TREE_OPERAND (member, 1));
c9e1b8d8 2014 return error_mark_node;
1bc16cab 2015 }
2016 else if (TREE_CODE (member) == FIELD_DECL)
2017 {
20ce13a9 2018 if (complain & tf_error)
2019 error ("invalid use of non-static data member %qD", member);
1bc16cab 2020 return error_mark_node;
2021 }
2022 return member;
2023 }
471086d6 2024
831d52a2 2025 member = build2 (OFFSET_REF, TREE_TYPE (member), decl, member);
120c0017 2026 PTRMEM_OK_P (member) = 1;
2027 return member;
471086d6 2028}
2029
409afdd4 2030/* If DECL is a scalar enumeration constant or variable with a
2031 constant initializer, return the initializer (or, its initializers,
2055d27a 2032 recursively); otherwise, return DECL. If STRICT_P, the
2033 initializer is only returned if DECL is a
e3ac4e18 2034 constant-expression. If RETURN_AGGREGATE_CST_OK_P, it is ok to
2035 return an aggregate constant. */
471086d6 2036
409afdd4 2037static tree
2055d27a 2038constant_value_1 (tree decl, bool strict_p, bool return_aggregate_cst_ok_p)
471086d6 2039{
4cd9e88b 2040 while (TREE_CODE (decl) == CONST_DECL
2055d27a 2041 || (strict_p
ce984e5e 2042 ? decl_constant_var_p (decl)
80a58eb0 2043 : (VAR_P (decl)
409afdd4 2044 && CP_TYPE_CONST_NON_VOLATILE_P (TREE_TYPE (decl)))))
e6ef0e42 2045 {
2046 tree init;
ce984e5e 2047 /* If DECL is a static data member in a template
2048 specialization, we must instantiate it here. The
2049 initializer for the static data member is not processed
2050 until needed; we need it now. */
5a4c69dd 2051 mark_used (decl, tf_none);
ce984e5e 2052 mark_rvalue_use (decl);
2053 init = DECL_INITIAL (decl);
d91303a6 2054 if (init == error_mark_node)
7a00f939 2055 {
2056 if (DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl))
2057 /* Treat the error as a constant to avoid cascading errors on
2058 excessively recursive template instantiation (c++/9335). */
2059 return init;
2060 else
2061 return decl;
2062 }
d6832042 2063 /* Initializers in templates are generally expanded during
2064 instantiation, so before that for const int i(2)
2065 INIT is a TREE_LIST with the actual initializer as
2066 TREE_VALUE. */
2067 if (processing_template_decl
2068 && init
2069 && TREE_CODE (init) == TREE_LIST
2070 && TREE_CHAIN (init) == NULL_TREE)
2071 init = TREE_VALUE (init);
d91303a6 2072 if (!init
e6ef0e42 2073 || !TREE_TYPE (init)
eed3fb17 2074 || !TREE_CONSTANT (init)
2055d27a 2075 || (!return_aggregate_cst_ok_p
e3ac4e18 2076 /* Unless RETURN_AGGREGATE_CST_OK_P is true, do not
2077 return an aggregate constant (of which string
2078 literals are a special case), as we do not want
2079 to make inadvertent copies of such entities, and
2080 we must be sure that their addresses are the
2081 same everywhere. */
eed3fb17 2082 && (TREE_CODE (init) == CONSTRUCTOR
2083 || TREE_CODE (init) == STRING_CST)))
e6ef0e42 2084 break;
07801057 2085 decl = unshare_expr (init);
e6ef0e42 2086 }
13f0eb20 2087 return decl;
2088}
338c7b53 2089
2055d27a 2090/* If DECL is a CONST_DECL, or a constant VAR_DECL initialized by constant
2091 of integral or enumeration type, or a constexpr variable of scalar type,
2092 then return that value. These are those variables permitted in constant
2093 expressions by [5.19/1]. */
338c7b53 2094
13f0eb20 2095tree
2055d27a 2096scalar_constant_value (tree decl)
13f0eb20 2097{
2055d27a 2098 return constant_value_1 (decl, /*strict_p=*/true,
e3ac4e18 2099 /*return_aggregate_cst_ok_p=*/false);
409afdd4 2100}
9031d10b 2101
2055d27a 2102/* Like scalar_constant_value, but can also return aggregate initializers. */
409afdd4 2103
2104tree
2055d27a 2105decl_really_constant_value (tree decl)
409afdd4 2106{
2055d27a 2107 return constant_value_1 (decl, /*strict_p=*/true,
e3ac4e18 2108 /*return_aggregate_cst_ok_p=*/true);
2109}
2110
2055d27a 2111/* A more relaxed version of scalar_constant_value, used by the
2112 common C/C++ code. */
e3ac4e18 2113
2114tree
2055d27a 2115decl_constant_value (tree decl)
e3ac4e18 2116{
2055d27a 2117 return constant_value_1 (decl, /*strict_p=*/processing_template_decl,
2118 /*return_aggregate_cst_ok_p=*/true);
471086d6 2119}
2120\f
471086d6 2121/* Common subroutines of build_new and build_vec_delete. */
471086d6 2122\f
393f878f 2123/* Build and return a NEW_EXPR. If NELTS is non-NULL, TYPE[NELTS] is
2124 the type of the object being allocated; otherwise, it's just TYPE.
2125 INIT is the initializer, if any. USE_GLOBAL_NEW is true if the
2126 user explicitly wrote "::operator new". PLACEMENT, if non-NULL, is
f352a3fb 2127 a vector of arguments to be provided as arguments to a placement
2128 new operator. This routine performs no semantic checks; it just
2129 creates and returns a NEW_EXPR. */
d383a10c 2130
393f878f 2131static tree
f1f41a6c 2132build_raw_new_expr (vec<tree, va_gc> *placement, tree type, tree nelts,
2133 vec<tree, va_gc> *init, int use_global_new)
bb6e087e 2134{
f352a3fb 2135 tree init_list;
393f878f 2136 tree new_expr;
074ab442 2137
f352a3fb 2138 /* If INIT is NULL, the we want to store NULL_TREE in the NEW_EXPR.
2139 If INIT is not NULL, then we want to store VOID_ZERO_NODE. This
2140 permits us to distinguish the case of a missing initializer "new
2141 int" from an empty initializer "new int()". */
2142 if (init == NULL)
2143 init_list = NULL_TREE;
f1f41a6c 2144 else if (init->is_empty ())
3ab4693e 2145 init_list = void_node;
f352a3fb 2146 else
2147 init_list = build_tree_list_vec (init);
2148
2149 new_expr = build4 (NEW_EXPR, build_pointer_type (type),
2150 build_tree_list_vec (placement), type, nelts,
2151 init_list);
393f878f 2152 NEW_EXPR_USE_GLOBAL (new_expr) = use_global_new;
2153 TREE_SIDE_EFFECTS (new_expr) = 1;
2154
2155 return new_expr;
bb6e087e 2156}
2157
2bc64004 2158/* Diagnose uninitialized const members or reference members of type
2159 TYPE. USING_NEW is used to disambiguate the diagnostic between a
fa60f42b 2160 new expression without a new-initializer and a declaration. Returns
2161 the error count. */
2bc64004 2162
fa60f42b 2163static int
2bc64004 2164diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin,
fa60f42b 2165 bool using_new, bool complain)
2bc64004 2166{
2167 tree field;
fa60f42b 2168 int error_count = 0;
2bc64004 2169
f65ee287 2170 if (type_has_user_provided_constructor (type))
fa60f42b 2171 return 0;
f65ee287 2172
1767a056 2173 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
2bc64004 2174 {
2175 tree field_type;
2176
2177 if (TREE_CODE (field) != FIELD_DECL)
2178 continue;
2179
2180 field_type = strip_array_types (TREE_TYPE (field));
2181
c62b7952 2182 if (type_has_user_provided_constructor (field_type))
2183 continue;
2184
2bc64004 2185 if (TREE_CODE (field_type) == REFERENCE_TYPE)
2186 {
fa60f42b 2187 ++ error_count;
2188 if (complain)
2189 {
77448b2f 2190 if (DECL_CONTEXT (field) == origin)
2191 {
2192 if (using_new)
2193 error ("uninitialized reference member in %q#T "
2194 "using %<new%> without new-initializer", origin);
2195 else
2196 error ("uninitialized reference member in %q#T", origin);
2197 }
fa60f42b 2198 else
77448b2f 2199 {
2200 if (using_new)
2201 error ("uninitialized reference member in base %q#T "
2202 "of %q#T using %<new%> without new-initializer",
2203 DECL_CONTEXT (field), origin);
2204 else
2205 error ("uninitialized reference member in base %q#T "
2206 "of %q#T", DECL_CONTEXT (field), origin);
2207 }
fa60f42b 2208 inform (DECL_SOURCE_LOCATION (field),
bebb2c46 2209 "%q#D should be initialized", field);
fa60f42b 2210 }
2bc64004 2211 }
2212
2213 if (CP_TYPE_CONST_P (field_type))
2214 {
fa60f42b 2215 ++ error_count;
2216 if (complain)
2217 {
77448b2f 2218 if (DECL_CONTEXT (field) == origin)
2219 {
2220 if (using_new)
2221 error ("uninitialized const member in %q#T "
2222 "using %<new%> without new-initializer", origin);
2223 else
2224 error ("uninitialized const member in %q#T", origin);
2225 }
fa60f42b 2226 else
77448b2f 2227 {
2228 if (using_new)
2229 error ("uninitialized const member in base %q#T "
2230 "of %q#T using %<new%> without new-initializer",
2231 DECL_CONTEXT (field), origin);
2232 else
2233 error ("uninitialized const member in base %q#T "
2234 "of %q#T", DECL_CONTEXT (field), origin);
2235 }
fa60f42b 2236 inform (DECL_SOURCE_LOCATION (field),
bebb2c46 2237 "%q#D should be initialized", field);
fa60f42b 2238 }
2bc64004 2239 }
2240
2241 if (CLASS_TYPE_P (field_type))
fa60f42b 2242 error_count
2243 += diagnose_uninitialized_cst_or_ref_member_1 (field_type, origin,
2244 using_new, complain);
2bc64004 2245 }
fa60f42b 2246 return error_count;
2bc64004 2247}
2248
fa60f42b 2249int
2250diagnose_uninitialized_cst_or_ref_member (tree type, bool using_new, bool complain)
2bc64004 2251{
fa60f42b 2252 return diagnose_uninitialized_cst_or_ref_member_1 (type, type, using_new, complain);
2bc64004 2253}
2254
bcb3170c 2255/* Call __cxa_bad_array_new_length to indicate that the size calculation
2256 overflowed. Pretend it returns sizetype so that it plays nicely in the
2257 COND_EXPR. */
2258
2259tree
2260throw_bad_array_new_length (void)
2261{
2262 tree fn = get_identifier ("__cxa_throw_bad_array_new_length");
2263 if (!get_global_value_if_present (fn, &fn))
2264 fn = push_throw_library_fn (fn, build_function_type_list (sizetype,
2265 NULL_TREE));
2266
2267 return build_cxx_call (fn, 0, NULL, tf_warning_or_error);
2268}
2269
393f878f 2270/* Generate code for a new-expression, including calling the "operator
2271 new" function, initializing the object, and, if an exception occurs
2272 during construction, cleaning up. The arguments are as for
f352a3fb 2273 build_raw_new_expr. This may change PLACEMENT and INIT. */
d383a10c 2274
89e923d8 2275static tree
f1f41a6c 2276build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
2277 vec<tree, va_gc> **init, bool globally_qualified_p,
f352a3fb 2278 tsubst_flags_t complain)
d383a10c 2279{
40156ad1 2280 tree size, rval;
2281 /* True iff this is a call to "operator new[]" instead of just
9031d10b 2282 "operator new". */
40156ad1 2283 bool array_p = false;
79b458ae 2284 /* If ARRAY_P is true, the element type of the array. This is never
2285 an ARRAY_TYPE; for something like "new int[3][4]", the
40156ad1 2286 ELT_TYPE is "int". If ARRAY_P is false, this is the same type as
79b458ae 2287 TYPE. */
40156ad1 2288 tree elt_type;
e1a63cdb 2289 /* The type of the new-expression. (This type is always a pointer
2290 type.) */
2291 tree pointer_type;
a8fe6bf4 2292 tree non_const_pointer_type;
0473b1af 2293 tree outer_nelts = NULL_TREE;
77284979 2294 /* For arrays, a bounds checks on the NELTS parameter. */
2295 tree outer_nelts_check = NULL_TREE;
653d8b92 2296 bool outer_nelts_from_type = false;
5de9d3ed 2297 offset_int inner_nelts_count = 1;
e1a63cdb 2298 tree alloc_call, alloc_expr;
35dd1f6b 2299 /* Size of the inner array elements. */
5de9d3ed 2300 offset_int inner_size;
e1a63cdb 2301 /* The address returned by the call to "operator new". This node is
2302 a VAR_DECL and is therefore reusable. */
2303 tree alloc_node;
f3e7610e 2304 tree alloc_fn;
4ef49933 2305 tree cookie_expr, init_expr;
98060e63 2306 int nothrow, check_new;
bb6e087e 2307 int use_java_new = 0;
89e923d8 2308 /* If non-NULL, the number of extra bytes to allocate at the
2309 beginning of the storage allocated for an array-new expression in
2310 order to store the number of elements. */
2311 tree cookie_size = NULL_TREE;
f352a3fb 2312 tree placement_first;
d4600b3e 2313 tree placement_expr = NULL_TREE;
49603c0f 2314 /* True if the function we are calling is a placement allocation
2315 function. */
2316 bool placement_allocation_fn_p;
e1a63cdb 2317 /* True if the storage must be initialized, either by a constructor
755edffd 2318 or due to an explicit new-initializer. */
e1a63cdb 2319 bool is_initialized;
2320 /* The address of the thing allocated, not including any cookie. In
2321 particular, if an array cookie is in use, DATA_ADDR is the
2322 address of the first array element. This node is a VAR_DECL, and
2323 is therefore reusable. */
2324 tree data_addr;
4ee9c684 2325 tree init_preeval_expr = NULL_TREE;
4f50e8b3 2326 tree orig_type = type;
d383a10c 2327
3046c0a3 2328 if (nelts)
d383a10c 2329 {
3046c0a3 2330 outer_nelts = nelts;
40156ad1 2331 array_p = true;
d383a10c 2332 }
79b458ae 2333 else if (TREE_CODE (type) == ARRAY_TYPE)
40156ad1 2334 {
653d8b92 2335 /* Transforms new (T[N]) to new T[N]. The former is a GNU
2336 extension for variable N. (This also covers new T where T is
2337 a VLA typedef.) */
79b458ae 2338 array_p = true;
2339 nelts = array_type_nelts_top (type);
2340 outer_nelts = nelts;
2341 type = TREE_TYPE (type);
653d8b92 2342 outer_nelts_from_type = true;
40156ad1 2343 }
89e923d8 2344
471086d6 2345 /* If our base type is an array, then make sure we know how many elements
2346 it has. */
40156ad1 2347 for (elt_type = type;
2348 TREE_CODE (elt_type) == ARRAY_TYPE;
2349 elt_type = TREE_TYPE (elt_type))
653d8b92 2350 {
2351 tree inner_nelts = array_type_nelts_top (elt_type);
2352 tree inner_nelts_cst = maybe_constant_value (inner_nelts);
88ab95c3 2353 if (TREE_CODE (inner_nelts_cst) == INTEGER_CST)
77284979 2354 {
d67b7119 2355 bool overflow;
5de9d3ed 2356 offset_int result = wi::mul (wi::to_offset (inner_nelts_cst),
2357 inner_nelts_count, SIGNED, &overflow);
d67b7119 2358 if (overflow)
77284979 2359 {
2360 if (complain & tf_error)
2361 error ("integer overflow in array size");
2362 nelts = error_mark_node;
2363 }
2364 inner_nelts_count = result;
2365 }
2366 else
653d8b92 2367 {
2368 if (complain & tf_error)
2369 {
3df42822 2370 error_at (EXPR_LOC_OR_LOC (inner_nelts, input_location),
4f50e8b3 2371 "array size in new-expression must be constant");
653d8b92 2372 cxx_constant_value(inner_nelts);
2373 }
2374 nelts = error_mark_node;
2375 }
2376 if (nelts != error_mark_node)
2377 nelts = cp_build_binary_op (input_location,
2378 MULT_EXPR, nelts,
2379 inner_nelts_cst,
2380 complain);
2381 }
2382
2383 if (variably_modified_type_p (elt_type, NULL_TREE) && (complain & tf_error))
2384 {
4f50e8b3 2385 error ("variably modified type not allowed in new-expression");
653d8b92 2386 return error_mark_node;
2387 }
2388
2389 if (nelts == error_mark_node)
2390 return error_mark_node;
2391
2392 /* Warn if we performed the (T[N]) to T[N] transformation and N is
2393 variable. */
2394 if (outer_nelts_from_type
2395 && !TREE_CONSTANT (maybe_constant_value (outer_nelts)))
2396 {
2397 if (complain & tf_warning_or_error)
4f50e8b3 2398 {
2399 const char *msg;
2400 if (typedef_variant_p (orig_type))
2401 msg = ("non-constant array new length must be specified "
2402 "directly, not by typedef");
2403 else
2404 msg = ("non-constant array new length must be specified "
2405 "without parentheses around the type-id");
2406 pedwarn (EXPR_LOC_OR_LOC (outer_nelts, input_location),
2407 OPT_Wvla, msg);
2408 }
653d8b92 2409 else
2410 return error_mark_node;
2411 }
e857e9c7 2412
c21c015b 2413 if (VOID_TYPE_P (elt_type))
bcf789d7 2414 {
ebd21de4 2415 if (complain & tf_error)
2416 error ("invalid type %<void%> for new");
bcf789d7 2417 return error_mark_node;
2418 }
2419
d28993f1 2420 if (abstract_virtuals_error_sfinae (ACU_NEW, elt_type, complain))
8c18e707 2421 return error_mark_node;
0543e7a9 2422
883e1020 2423 is_initialized = (type_build_ctor_call (elt_type) || *init != NULL);
2336da2a 2424
575852de 2425 if (*init == NULL && cxx_dialect < cxx11)
2bc64004 2426 {
fa60f42b 2427 bool maybe_uninitialized_error = false;
2bc64004 2428 /* A program that calls for default-initialization [...] of an
2429 entity of reference type is ill-formed. */
2430 if (CLASSTYPE_REF_FIELDS_NEED_INIT (elt_type))
fa60f42b 2431 maybe_uninitialized_error = true;
2bc64004 2432
2433 /* A new-expression that creates an object of type T initializes
2434 that object as follows:
2435 - If the new-initializer is omitted:
2436 -- If T is a (possibly cv-qualified) non-POD class type
2437 (or array thereof), the object is default-initialized (8.5).
2438 [...]
2439 -- Otherwise, the object created has indeterminate
2440 value. If T is a const-qualified type, or a (possibly
2441 cv-qualified) POD class type (or array thereof)
2442 containing (directly or indirectly) a member of
2443 const-qualified type, the program is ill-formed; */
2444
2445 if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (elt_type))
fa60f42b 2446 maybe_uninitialized_error = true;
2bc64004 2447
fa60f42b 2448 if (maybe_uninitialized_error
2449 && diagnose_uninitialized_cst_or_ref_member (elt_type,
2450 /*using_new=*/true,
2451 complain & tf_error))
2452 return error_mark_node;
2bc64004 2453 }
2454
f352a3fb 2455 if (CP_TYPE_CONST_P (elt_type) && *init == NULL
df3a1bdc 2456 && default_init_uninitialized_part (elt_type))
e1a63cdb 2457 {
ebd21de4 2458 if (complain & tf_error)
2459 error ("uninitialized const in %<new%> of %q#T", elt_type);
e1a63cdb 2460 return error_mark_node;
2461 }
2462
40156ad1 2463 size = size_in_bytes (elt_type);
2464 if (array_p)
77284979 2465 {
2466 /* Maximum available size in bytes. Half of the address space
2467 minus the cookie size. */
5de9d3ed 2468 offset_int max_size
2469 = wi::set_bit_in_zero <offset_int> (TYPE_PRECISION (sizetype) - 1);
77284979 2470 /* Maximum number of outer elements which can be allocated. */
5de9d3ed 2471 offset_int max_outer_nelts;
77284979 2472 tree max_outer_nelts_tree;
2473
2474 gcc_assert (TREE_CODE (size) == INTEGER_CST);
2475 cookie_size = targetm.cxx.get_cookie_size (elt_type);
2476 gcc_assert (TREE_CODE (cookie_size) == INTEGER_CST);
cd9b5516 2477 gcc_checking_assert (wi::ltu_p (wi::to_offset (cookie_size), max_size));
88aa6d3e 2478 /* Unconditionally subtract the cookie size. This decreases the
77284979 2479 maximum object size and is safe even if we choose not to use
2480 a cookie after all. */
5de9d3ed 2481 max_size -= wi::to_offset (cookie_size);
d67b7119 2482 bool overflow;
5de9d3ed 2483 inner_size = wi::mul (wi::to_offset (size), inner_nelts_count, SIGNED,
796b6678 2484 &overflow);
2485 if (overflow || wi::gtu_p (inner_size, max_size))
77284979 2486 {
2487 if (complain & tf_error)
2488 error ("size of array is too large");
2489 return error_mark_node;
2490 }
e913b5cd 2491
796b6678 2492 max_outer_nelts = wi::udiv_trunc (max_size, inner_size);
77284979 2493 /* Only keep the top-most seven bits, to simplify encoding the
2494 constant in the instruction stream. */
2495 {
e913b5cd 2496 unsigned shift = (max_outer_nelts.get_precision ()) - 7
796b6678 2497 - wi::clz (max_outer_nelts);
2498 max_outer_nelts = wi::lshift (wi::lrshift (max_outer_nelts, shift),
2499 shift);
77284979 2500 }
e913b5cd 2501 max_outer_nelts_tree = wide_int_to_tree (sizetype, max_outer_nelts);
77284979 2502
2503 size = size_binop (MULT_EXPR, size, convert (sizetype, nelts));
2504 outer_nelts_check = fold_build2 (LE_EXPR, boolean_type_node,
2505 outer_nelts,
2506 max_outer_nelts_tree);
2507 }
e581f478 2508
393f878f 2509 alloc_fn = NULL_TREE;
2510
f352a3fb 2511 /* If PLACEMENT is a single simple pointer type not passed by
2512 reference, prepare to capture it in a temporary variable. Do
2513 this now, since PLACEMENT will change in the calls below. */
f352a3fb 2514 placement_first = NULL_TREE;
f1f41a6c 2515 if (vec_safe_length (*placement) == 1
c21c015b 2516 && (TYPE_PTR_P (TREE_TYPE ((**placement)[0]))))
f1f41a6c 2517 placement_first = (**placement)[0];
f352a3fb 2518
96624a9e 2519 /* Allocate the object. */
f1f41a6c 2520 if (vec_safe_is_empty (*placement) && TYPE_FOR_JAVA (elt_type))
bb6e087e 2521 {
393f878f 2522 tree class_addr;
4d0aec87 2523 tree class_decl;
e99c3a1d 2524 static const char alloc_name[] = "_Jv_AllocObject";
4ee9c684 2525
4d0aec87 2526 if (!MAYBE_CLASS_TYPE_P (elt_type))
2527 {
2528 error ("%qT isn%'t a valid Java class type", elt_type);
2529 return error_mark_node;
2530 }
2531
2532 class_decl = build_java_class_ref (elt_type);
457556f8 2533 if (class_decl == error_mark_node)
2534 return error_mark_node;
2535
bb6e087e 2536 use_java_new = 1;
9031d10b 2537 if (!get_global_value_if_present (get_identifier (alloc_name),
393f878f 2538 &alloc_fn))
8a0fd506 2539 {
ebd21de4 2540 if (complain & tf_error)
2541 error ("call to Java constructor with %qs undefined", alloc_name);
2fab99a6 2542 return error_mark_node;
2543 }
393f878f 2544 else if (really_overloaded_fn (alloc_fn))
8a0fd506 2545 {
ebd21de4 2546 if (complain & tf_error)
2547 error ("%qD should never be overloaded", alloc_fn);
2fab99a6 2548 return error_mark_node;
2549 }
393f878f 2550 alloc_fn = OVL_CURRENT (alloc_fn);
bb6e087e 2551 class_addr = build1 (ADDR_EXPR, jclass_node, class_decl);
49a7740d 2552 alloc_call = cp_build_function_call_nary (alloc_fn, complain,
2553 class_addr, NULL_TREE);
bb6e087e 2554 }
95397ff9 2555 else if (TYPE_FOR_JAVA (elt_type) && MAYBE_CLASS_TYPE_P (elt_type))
faf19a81 2556 {
2557 error ("Java class %q#T object allocated using placement new", elt_type);
2558 return error_mark_node;
2559 }
471086d6 2560 else
2561 {
89e923d8 2562 tree fnname;
3c33f9f3 2563 tree fns;
89e923d8 2564
40156ad1 2565 fnname = ansi_opname (array_p ? VEC_NEW_EXPR : NEW_EXPR);
89e923d8 2566
9031d10b 2567 if (!globally_qualified_p
40156ad1 2568 && CLASS_TYPE_P (elt_type)
2569 && (array_p
2570 ? TYPE_HAS_ARRAY_NEW_OPERATOR (elt_type)
2571 : TYPE_HAS_NEW_OPERATOR (elt_type)))
98060e63 2572 {
2573 /* Use a class-specific operator new. */
2574 /* If a cookie is required, add some extra space. */
40156ad1 2575 if (array_p && TYPE_VEC_NEW_USES_COOKIE (elt_type))
77284979 2576 size = size_binop (PLUS_EXPR, size, cookie_size);
2577 else
35dd1f6b 2578 {
2579 cookie_size = NULL_TREE;
2580 /* No size arithmetic necessary, so the size check is
2581 not needed. */
796b6678 2582 if (outer_nelts_check != NULL && inner_size == 1)
35dd1f6b 2583 outer_nelts_check = NULL_TREE;
2584 }
77284979 2585 /* Perform the overflow check. */
bcb3170c 2586 tree errval = TYPE_MAX_VALUE (sizetype);
0c4def58 2587 if (cxx_dialect >= cxx11 && flag_exceptions)
bcb3170c 2588 errval = throw_bad_array_new_length ();
77284979 2589 if (outer_nelts_check != NULL_TREE)
2590 size = fold_build3 (COND_EXPR, sizetype, outer_nelts_check,
bcb3170c 2591 size, errval);
98060e63 2592 /* Create the argument list. */
f1f41a6c 2593 vec_safe_insert (*placement, 0, size);
3c33f9f3 2594 /* Do name-lookup to find the appropriate operator. */
40156ad1 2595 fns = lookup_fnfields (elt_type, fnname, /*protect=*/2);
db6ec059 2596 if (fns == NULL_TREE)
2597 {
ebd21de4 2598 if (complain & tf_error)
2599 error ("no suitable %qD found in class %qT", fnname, elt_type);
db6ec059 2600 return error_mark_node;
2601 }
3c33f9f3 2602 if (TREE_CODE (fns) == TREE_LIST)
2603 {
ebd21de4 2604 if (complain & tf_error)
2605 {
2606 error ("request for member %qD is ambiguous", fnname);
2607 print_candidates (fns);
2608 }
3c33f9f3 2609 return error_mark_node;
2610 }
40156ad1 2611 alloc_call = build_new_method_call (build_dummy_object (elt_type),
f352a3fb 2612 fns, placement,
3c33f9f3 2613 /*conversion_path=*/NULL_TREE,
393f878f 2614 LOOKUP_NORMAL,
ebd21de4 2615 &alloc_fn,
2616 complain);
98060e63 2617 }
89e923d8 2618 else
98060e63 2619 {
2620 /* Use a global operator new. */
c6a06e1f 2621 /* See if a cookie might be required. */
77284979 2622 if (!(array_p && TYPE_VEC_NEW_USES_COOKIE (elt_type)))
35dd1f6b 2623 {
2624 cookie_size = NULL_TREE;
2625 /* No size arithmetic necessary, so the size check is
2626 not needed. */
796b6678 2627 if (outer_nelts_check != NULL && inner_size == 1)
35dd1f6b 2628 outer_nelts_check = NULL_TREE;
2629 }
c6a06e1f 2630
9031d10b 2631 alloc_call = build_operator_new_call (fnname, placement,
393f878f 2632 &size, &cookie_size,
77284979 2633 outer_nelts_check,
66bbeb85 2634 &alloc_fn, complain);
98060e63 2635 }
471086d6 2636 }
2637
4d7e6f4c 2638 if (alloc_call == error_mark_node)
f9b9bf39 2639 return error_mark_node;
2640
393f878f 2641 gcc_assert (alloc_fn != NULL_TREE);
2642
f352a3fb 2643 /* If we found a simple case of PLACEMENT_EXPR above, then copy it
2644 into a temporary variable. */
d4600b3e 2645 if (!processing_template_decl
f352a3fb 2646 && placement_first != NULL_TREE
d4600b3e 2647 && TREE_CODE (alloc_call) == CALL_EXPR
2648 && call_expr_nargs (alloc_call) == 2
2649 && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (alloc_call, 0))) == INTEGER_TYPE
c21c015b 2650 && TYPE_PTR_P (TREE_TYPE (CALL_EXPR_ARG (alloc_call, 1))))
d4600b3e 2651 {
2652 tree placement_arg = CALL_EXPR_ARG (alloc_call, 1);
2653
b3353c23 2654 if (INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (TREE_TYPE (placement_arg)))
d4600b3e 2655 || VOID_TYPE_P (TREE_TYPE (TREE_TYPE (placement_arg))))
2656 {
f352a3fb 2657 placement_expr = get_target_expr (placement_first);
d4600b3e 2658 CALL_EXPR_ARG (alloc_call, 1)
2659 = convert (TREE_TYPE (placement_arg), placement_expr);
2660 }
2661 }
2662
9aa757df 2663 /* In the simple case, we can stop now. */
2664 pointer_type = build_pointer_type (type);
2665 if (!cookie_size && !is_initialized)
2a3ebafa 2666 return build_nop (pointer_type, alloc_call);
9aa757df 2667
0da58a6f 2668 /* Store the result of the allocation call in a variable so that we can
2669 use it more than once. */
2670 alloc_expr = get_target_expr (alloc_call);
9aa757df 2671 alloc_node = TARGET_EXPR_SLOT (alloc_expr);
2672
2673 /* Strip any COMPOUND_EXPRs from ALLOC_CALL. */
9031d10b 2674 while (TREE_CODE (alloc_call) == COMPOUND_EXPR)
9aa757df 2675 alloc_call = TREE_OPERAND (alloc_call, 1);
98060e63 2676
49603c0f 2677 /* Now, check to see if this function is actually a placement
2678 allocation function. This can happen even when PLACEMENT is NULL
2679 because we might have something like:
2680
2681 struct S { void* operator new (size_t, int i = 0); };
2682
2683 A call to `new S' will get this allocation function, even though
2684 there is no explicit placement argument. If there is more than
2685 one argument, or there are variable arguments, then this is a
2686 placement allocation function. */
9031d10b 2687 placement_allocation_fn_p
2688 = (type_num_arguments (TREE_TYPE (alloc_fn)) > 1
f3e7610e 2689 || varargs_function_p (alloc_fn));
4d7e6f4c 2690
9aa757df 2691 /* Preevaluate the placement args so that we don't reevaluate them for a
2692 placement delete. */
2693 if (placement_allocation_fn_p)
2694 {
4ee9c684 2695 tree inits;
2696 stabilize_call (alloc_call, &inits);
9aa757df 2697 if (inits)
831d52a2 2698 alloc_expr = build2 (COMPOUND_EXPR, TREE_TYPE (alloc_expr), inits,
2699 alloc_expr);
9aa757df 2700 }
2701
c0918dd5 2702 /* unless an allocation function is declared with an empty excep-
2703 tion-specification (_except.spec_), throw(), it indicates failure to
2704 allocate storage by throwing a bad_alloc exception (clause _except_,
2705 _lib.bad.alloc_); it returns a non-null pointer otherwise If the allo-
2706 cation function is declared with an empty exception-specification,
2707 throw(), it returns null to indicate failure to allocate storage and a
2708 non-null pointer otherwise.
2709
2710 So check for a null exception spec on the op new we just called. */
2711
f3e7610e 2712 nothrow = TYPE_NOTHROW_P (TREE_TYPE (alloc_fn));
bb6e087e 2713 check_new = (flag_check_new || nothrow) && ! use_java_new;
c0918dd5 2714
98060e63 2715 if (cookie_size)
471086d6 2716 {
4d7e6f4c 2717 tree cookie;
600f4be7 2718 tree cookie_ptr;
69db191c 2719 tree size_ptr_type;
e1a63cdb 2720
2721 /* Adjust so we're pointing to the start of the object. */
2cc66f2a 2722 data_addr = fold_build_pointer_plus (alloc_node, cookie_size);
4d7e6f4c 2723
89e923d8 2724 /* Store the number of bytes allocated so that we can know how
5ad590ad 2725 many elements to destroy later. We use the last sizeof
2726 (size_t) bytes to store the number of elements. */
0da58a6f 2727 cookie_ptr = size_binop (MINUS_EXPR, cookie_size, size_in_bytes (sizetype));
2cc66f2a 2728 cookie_ptr = fold_build_pointer_plus_loc (input_location,
2729 alloc_node, cookie_ptr);
69db191c 2730 size_ptr_type = build_pointer_type (sizetype);
0da58a6f 2731 cookie_ptr = fold_convert (size_ptr_type, cookie_ptr);
f08923b3 2732 cookie = cp_build_indirect_ref (cookie_ptr, RO_NULL, complain);
606b494c 2733
831d52a2 2734 cookie_expr = build2 (MODIFY_EXPR, sizetype, cookie, nelts);
600f4be7 2735
2736 if (targetm.cxx.cookie_has_size ())
2737 {
2738 /* Also store the element size. */
2cc66f2a 2739 cookie_ptr = fold_build_pointer_plus (cookie_ptr,
389dd41b 2740 fold_build1_loc (input_location,
2cc66f2a 2741 NEGATE_EXPR, sizetype,
2742 size_in_bytes (sizetype)));
3db039d8 2743
f08923b3 2744 cookie = cp_build_indirect_ref (cookie_ptr, RO_NULL, complain);
831d52a2 2745 cookie = build2 (MODIFY_EXPR, sizetype, cookie,
0da58a6f 2746 size_in_bytes (elt_type));
831d52a2 2747 cookie_expr = build2 (COMPOUND_EXPR, TREE_TYPE (cookie_expr),
2748 cookie, cookie_expr);
600f4be7 2749 }
471086d6 2750 }
4d7e6f4c 2751 else
4ef49933 2752 {
2753 cookie_expr = NULL_TREE;
2754 data_addr = alloc_node;
2755 }
471086d6 2756
0da58a6f 2757 /* Now use a pointer to the type we've actually allocated. */
a8fe6bf4 2758
2759 /* But we want to operate on a non-const version to start with,
2760 since we'll be modifying the elements. */
2761 non_const_pointer_type = build_pointer_type
ce494fcf 2762 (cp_build_qualified_type (type, cp_type_quals (type) & ~TYPE_QUAL_CONST));
a8fe6bf4 2763
2764 data_addr = fold_convert (non_const_pointer_type, data_addr);
79b458ae 2765 /* Any further uses of alloc_node will want this type, too. */
a8fe6bf4 2766 alloc_node = fold_convert (non_const_pointer_type, alloc_node);
0da58a6f 2767
4ee9c684 2768 /* Now initialize the allocated object. Note that we preevaluate the
2769 initialization expression, apart from the actual constructor call or
2770 assignment--we do this because we want to delay the allocation as long
2771 as possible in order to minimize the size of the exception region for
2772 placement delete. */
e1a63cdb 2773 if (is_initialized)
471086d6 2774 {
4ee9c684 2775 bool stable;
0152e879 2776 bool explicit_value_init_p = false;
4ee9c684 2777
f1f41a6c 2778 if (*init != NULL && (*init)->is_empty ())
4ee9c684 2779 {
f352a3fb 2780 *init = NULL;
0152e879 2781 explicit_value_init_p = true;
2782 }
687a1c50 2783
140b70da 2784 if (processing_template_decl && explicit_value_init_p)
2785 {
2786 /* build_value_init doesn't work in templates, and we don't need
2787 the initializer anyway since we're going to throw it away and
2788 rebuild it at instantiation time, so just build up a single
2789 constructor call to get any appropriate diagnostics. */
2790 init_expr = cp_build_indirect_ref (data_addr, RO_NULL, complain);
883e1020 2791 if (type_build_ctor_call (elt_type))
140b70da 2792 init_expr = build_special_member_call (init_expr,
2793 complete_ctor_identifier,
2794 init, elt_type,
2795 LOOKUP_NORMAL,
2796 complain);
2797 stable = stabilize_init (init_expr, &init_preeval_expr);
2798 }
2799 else if (array_p)
0152e879 2800 {
a8fe6bf4 2801 tree vecinit = NULL_TREE;
f1f41a6c 2802 if (vec_safe_length (*init) == 1
8e8713cd 2803 && DIRECT_LIST_INIT_P ((**init)[0]))
a8fe6bf4 2804 {
f1f41a6c 2805 vecinit = (**init)[0];
c8769bdd 2806 if (CONSTRUCTOR_NELTS (vecinit) == 0)
2807 /* List-value-initialization, leave it alone. */;
a8fe6bf4 2808 else
2809 {
c8769bdd 2810 tree arraytype, domain;
2811 if (TREE_CONSTANT (nelts))
2812 domain = compute_array_index_type (NULL_TREE, nelts,
2813 complain);
2814 else
bcb3170c 2815 /* We'll check the length at runtime. */
2816 domain = NULL_TREE;
c8769bdd 2817 arraytype = build_cplus_array_type (type, domain);
2818 vecinit = digest_init (arraytype, vecinit, complain);
a8fe6bf4 2819 }
a8fe6bf4 2820 }
2821 else if (*init)
ebd21de4 2822 {
2823 if (complain & tf_error)
c8769bdd 2824 permerror (input_location,
2825 "parenthesized initializer in array new");
ebd21de4 2826 else
2827 return error_mark_node;
a8fe6bf4 2828 vecinit = build_tree_list_vec (*init);
ebd21de4 2829 }
4ee9c684 2830 init_expr
f66fb566 2831 = build_vec_init (data_addr,
2832 cp_build_binary_op (input_location,
2833 MINUS_EXPR, outer_nelts,
2834 integer_one_node,
2835 complain),
2836 vecinit,
2837 explicit_value_init_p,
2838 /*from_array=*/0,
2839 complain);
4ee9c684 2840
2841 /* An array initialization is stable because the initialization
2842 of each element is a full-expression, so the temporaries don't
2843 leak out. */
2844 stable = true;
2845 }
a3691386 2846 else
471086d6 2847 {
f08923b3 2848 init_expr = cp_build_indirect_ref (data_addr, RO_NULL, complain);
79b458ae 2849
883e1020 2850 if (type_build_ctor_call (type) && !explicit_value_init_p)
687a1c50 2851 {
2852 init_expr = build_special_member_call (init_expr,
2853 complete_ctor_identifier,
2854 init, elt_type,
ebd21de4 2855 LOOKUP_NORMAL,
2856 complain);
0152e879 2857 }
2858 else if (explicit_value_init_p)
2859 {
140b70da 2860 /* Something like `new int()'. */
2861 tree val = build_value_init (type, complain);
2862 if (val == error_mark_node)
2863 return error_mark_node;
2864 init_expr = build2 (INIT_EXPR, type, init_expr, val);
687a1c50 2865 }
092b1d6f 2866 else
687a1c50 2867 {
f352a3fb 2868 tree ie;
2869
687a1c50 2870 /* We are processing something like `new int (10)', which
2871 means allocate an int, and initialize it with 10. */
074ab442 2872
14376b10 2873 ie = build_x_compound_expr_from_vec (*init, "new initializer",
2874 complain);
f352a3fb 2875 init_expr = cp_build_modify_expr (init_expr, INIT_EXPR, ie,
ebd21de4 2876 complain);
687a1c50 2877 }
0152e879 2878 stable = stabilize_init (init_expr, &init_preeval_expr);
4d7e6f4c 2879 }
2880
2881 if (init_expr == error_mark_node)
2882 return error_mark_node;
c8559ab6 2883
c961c636 2884 /* If any part of the object initialization terminates by throwing an
2885 exception and a suitable deallocation function can be found, the
2886 deallocation function is called to free the memory in which the
2887 object was being constructed, after which the exception continues
2888 to propagate in the context of the new-expression. If no
2889 unambiguous matching deallocation function can be found,
2890 propagating the exception does not cause the object's memory to be
2891 freed. */
4d7e6f4c 2892 if (flag_exceptions && ! use_java_new)
c8559ab6 2893 {
40156ad1 2894 enum tree_code dcode = array_p ? VEC_DELETE_EXPR : DELETE_EXPR;
4d7e6f4c 2895 tree cleanup;
db173e97 2896
01665f3a 2897 /* The Standard is unclear here, but the right thing to do
e1a63cdb 2898 is to use the same method for finding deallocation
2899 functions that we use for finding allocation functions. */
0da58a6f 2900 cleanup = (build_op_delete_call
2901 (dcode,
79b458ae 2902 alloc_node,
0da58a6f 2903 size,
2904 globally_qualified_p,
2905 placement_allocation_fn_p ? alloc_call : NULL_TREE,
c4698a21 2906 alloc_fn,
2907 complain));
d70beda9 2908
4ee9c684 2909 if (!cleanup)
2910 /* We're done. */;
2911 else if (stable)
2912 /* This is much simpler if we were able to preevaluate all of
2913 the arguments to the constructor call. */
e627cda1 2914 {
2915 /* CLEANUP is compiler-generated, so no diagnostics. */
2916 TREE_NO_WARNING (cleanup) = true;
2917 init_expr = build2 (TRY_CATCH_EXPR, void_type_node,
2918 init_expr, cleanup);
2919 /* Likewise, this try-catch is compiler-generated. */
2920 TREE_NO_WARNING (init_expr) = true;
2921 }
4ee9c684 2922 else
2923 /* Ack! First we allocate the memory. Then we set our sentry
2924 variable to true, and expand a cleanup that deletes the
2925 memory if sentry is true. Then we run the constructor, and
2926 finally clear the sentry.
2927
2928 We need to do this because we allocate the space first, so
2929 if there are any temporaries with cleanups in the
2930 constructor args and we weren't able to preevaluate them, we
2931 need this EH region to extend until end of full-expression
2932 to preserve nesting. */
fa000d3a 2933 {
4d7e6f4c 2934 tree end, sentry, begin;
692f5aa7 2935
2936 begin = get_target_expr (boolean_true_node);
a9bc793b 2937 CLEANUP_EH_ONLY (begin) = 1;
692f5aa7 2938
a9bc793b 2939 sentry = TARGET_EXPR_SLOT (begin);
2940
e627cda1 2941 /* CLEANUP is compiler-generated, so no diagnostics. */
2942 TREE_NO_WARNING (cleanup) = true;
2943
a9bc793b 2944 TARGET_EXPR_CLEANUP (begin)
831d52a2 2945 = build3 (COND_EXPR, void_type_node, sentry,
3ab4693e 2946 cleanup, void_node);
692f5aa7 2947
831d52a2 2948 end = build2 (MODIFY_EXPR, TREE_TYPE (sentry),
2949 sentry, boolean_false_node);
692f5aa7 2950
4d7e6f4c 2951 init_expr
831d52a2 2952 = build2 (COMPOUND_EXPR, void_type_node, begin,
2953 build2 (COMPOUND_EXPR, void_type_node, init_expr,
2954 end));
e627cda1 2955 /* Likewise, this is compiler-generated. */
2956 TREE_NO_WARNING (init_expr) = true;
fa000d3a 2957 }
c8559ab6 2958 }
e1a63cdb 2959 }
4ef49933 2960 else
2961 init_expr = NULL_TREE;
2962
2963 /* Now build up the return value in reverse order. */
4d7e6f4c 2964
4ef49933 2965 rval = data_addr;
692f5aa7 2966
4ef49933 2967 if (init_expr)
831d52a2 2968 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), init_expr, rval);
4ef49933 2969 if (cookie_expr)
831d52a2 2970 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), cookie_expr, rval);
4ef49933 2971
0da58a6f 2972 if (rval == data_addr)
4ef49933 2973 /* If we don't have an initializer or a cookie, strip the TARGET_EXPR
2974 and return the call (which doesn't need to be adjusted). */
2975 rval = TARGET_EXPR_INITIAL (alloc_expr);
2976 else
42f3e1b9 2977 {
4ef49933 2978 if (check_new)
2979 {
8e70fb09 2980 tree ifexp = cp_build_binary_op (input_location,
2981 NE_EXPR, alloc_node,
f8d621db 2982 nullptr_node,
ebd21de4 2983 complain);
1273a0b4 2984 rval = build_conditional_expr (input_location, ifexp, rval,
2985 alloc_node, complain);
4ef49933 2986 }
42f3e1b9 2987
4ef49933 2988 /* Perform the allocation before anything else, so that ALLOC_NODE
2989 has been initialized before we start using it. */
831d52a2 2990 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), alloc_expr, rval);
4ef49933 2991 }
ac9386a0 2992
4ee9c684 2993 if (init_preeval_expr)
831d52a2 2994 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), init_preeval_expr, rval);
4ee9c684 2995
6d84574d 2996 /* A new-expression is never an lvalue. */
a4a591f9 2997 gcc_assert (!lvalue_p (rval));
66723563 2998
a8fe6bf4 2999 return convert (pointer_type, rval);
471086d6 3000}
393f878f 3001
f352a3fb 3002/* Generate a representation for a C++ "new" expression. *PLACEMENT
3003 is a vector of placement-new arguments (or NULL if none). If NELTS
3004 is NULL, TYPE is the type of the storage to be allocated. If NELTS
3005 is not NULL, then this is an array-new allocation; TYPE is the type
3006 of the elements in the array and NELTS is the number of elements in
3007 the array. *INIT, if non-NULL, is the initializer for the new
3008 object, or an empty vector to indicate an initializer of "()". If
3009 USE_GLOBAL_NEW is true, then the user explicitly wrote "::new"
3010 rather than just "new". This may change PLACEMENT and INIT. */
393f878f 3011
3012tree
f1f41a6c 3013build_new (vec<tree, va_gc> **placement, tree type, tree nelts,
3014 vec<tree, va_gc> **init, int use_global_new, tsubst_flags_t complain)
393f878f 3015{
3016 tree rval;
f1f41a6c 3017 vec<tree, va_gc> *orig_placement = NULL;
f352a3fb 3018 tree orig_nelts = NULL_TREE;
f1f41a6c 3019 vec<tree, va_gc> *orig_init = NULL;
393f878f 3020
f352a3fb 3021 if (type == error_mark_node)
393f878f 3022 return error_mark_node;
3023
f1f41a6c 3024 if (nelts == NULL_TREE && vec_safe_length (*init) == 1
1610993e 3025 /* Don't do auto deduction where it might affect mangling. */
3026 && (!processing_template_decl || at_function_scope_p ()))
46f4817e 3027 {
3028 tree auto_node = type_uses_auto (type);
b25ee589 3029 if (auto_node)
3030 {
f1f41a6c 3031 tree d_init = (**init)[0];
b25ee589 3032 d_init = resolve_nondeduced_context (d_init);
cb542a2d 3033 type = do_auto_deduction (type, d_init, auto_node);
b25ee589 3034 }
46f4817e 3035 }
3036
393f878f 3037 if (processing_template_decl)
3038 {
3039 if (dependent_type_p (type)
f352a3fb 3040 || any_type_dependent_arguments_p (*placement)
393f878f 3041 || (nelts && type_dependent_expression_p (nelts))
74ca083e 3042 || (nelts && *init)
f352a3fb 3043 || any_type_dependent_arguments_p (*init))
3044 return build_raw_new_expr (*placement, type, nelts, *init,
393f878f 3045 use_global_new);
f352a3fb 3046
3047 orig_placement = make_tree_vector_copy (*placement);
3048 orig_nelts = nelts;
9e085e11 3049 if (*init)
3050 orig_init = make_tree_vector_copy (*init);
f352a3fb 3051
3052 make_args_non_dependent (*placement);
393f878f 3053 if (nelts)
3054 nelts = build_non_dependent_expr (nelts);
f352a3fb 3055 make_args_non_dependent (*init);
393f878f 3056 }
3057
3058 if (nelts)
3059 {
3060 if (!build_expr_type_conversion (WANT_INT | WANT_ENUM, nelts, false))
ebd21de4 3061 {
3062 if (complain & tf_error)
2b9e3597 3063 permerror (input_location, "size in array new must have integral type");
ebd21de4 3064 else
3065 return error_mark_node;
3066 }
fbb73d9b 3067 nelts = mark_rvalue_use (nelts);
c4698a21 3068 nelts = cp_save_expr (cp_convert (sizetype, nelts, complain));
393f878f 3069 }
3070
3071 /* ``A reference cannot be created by the new operator. A reference
3072 is not an object (8.2.2, 8.4.3), so a pointer to it could not be
3073 returned by new.'' ARM 5.3.3 */
3074 if (TREE_CODE (type) == REFERENCE_TYPE)
3075 {
ebd21de4 3076 if (complain & tf_error)
3077 error ("new cannot be applied to a reference type");
3078 else
3079 return error_mark_node;
393f878f 3080 type = TREE_TYPE (type);
3081 }
3082
3083 if (TREE_CODE (type) == FUNCTION_TYPE)
3084 {
ebd21de4 3085 if (complain & tf_error)
3086 error ("new cannot be applied to a function type");
393f878f 3087 return error_mark_node;
3088 }
3089
644253d1 3090 /* The type allocated must be complete. If the new-type-id was
3091 "T[N]" then we are just checking that "T" is complete here, but
3092 that is equivalent, since the value of "N" doesn't matter. */
a5f2d620 3093 if (!complete_type_or_maybe_complain (type, NULL_TREE, complain))
dcf091d4 3094 return error_mark_node;
3095
ebd21de4 3096 rval = build_new_1 (placement, type, nelts, init, use_global_new, complain);
393f878f 3097 if (rval == error_mark_node)
3098 return error_mark_node;
3099
3100 if (processing_template_decl)
f352a3fb 3101 {
3102 tree ret = build_raw_new_expr (orig_placement, type, orig_nelts,
3103 orig_init, use_global_new);
3104 release_tree_vector (orig_placement);
3105 release_tree_vector (orig_init);
3106 return ret;
3107 }
393f878f 3108
3109 /* Wrap it in a NOP_EXPR so warn_if_unused_value doesn't complain. */
3110 rval = build1 (NOP_EXPR, TREE_TYPE (rval), rval);
3111 TREE_NO_WARNING (rval) = 1;
3112
3113 return rval;
3114}
3115
3116/* Given a Java class, return a decl for the corresponding java.lang.Class. */
3117
3118tree
3119build_java_class_ref (tree type)
3120{
3121 tree name = NULL_TREE, class_decl;
3122 static tree CL_suffix = NULL_TREE;
3123 if (CL_suffix == NULL_TREE)
3124 CL_suffix = get_identifier("class$");
3125 if (jclass_node == NULL_TREE)
3126 {
3127 jclass_node = IDENTIFIER_GLOBAL_VALUE (get_identifier ("jclass"));
3128 if (jclass_node == NULL_TREE)
457556f8 3129 {
3130 error ("call to Java constructor, while %<jclass%> undefined");
3131 return error_mark_node;
3132 }
393f878f 3133 jclass_node = TREE_TYPE (jclass_node);
3134 }
3135
3136 /* Mangle the class$ field. */
3137 {
3138 tree field;
1767a056 3139 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
393f878f 3140 if (DECL_NAME (field) == CL_suffix)
3141 {
3142 mangle_decl (field);
3143 name = DECL_ASSEMBLER_NAME (field);
3144 break;
3145 }
3146 if (!field)
457556f8 3147 {
bf776685 3148 error ("can%'t find %<class$%> in %qT", type);
457556f8 3149 return error_mark_node;
3150 }
3151 }
393f878f 3152
3153 class_decl = IDENTIFIER_GLOBAL_VALUE (name);
3154 if (class_decl == NULL_TREE)
3155 {
e60a6f7b 3156 class_decl = build_decl (input_location,
3157 VAR_DECL, name, TREE_TYPE (jclass_node));
393f878f 3158 TREE_STATIC (class_decl) = 1;
3159 DECL_EXTERNAL (class_decl) = 1;
3160 TREE_PUBLIC (class_decl) = 1;
3161 DECL_ARTIFICIAL (class_decl) = 1;
3162 DECL_IGNORED_P (class_decl) = 1;
3163 pushdecl_top_level (class_decl);
3164 make_decl_rtl (class_decl);
3165 }
3166 return class_decl;
3167}
471086d6 3168\f
ce28ee2e 3169static tree
6c5ad428 3170build_vec_delete_1 (tree base, tree maxindex, tree type,
9e505437 3171 special_function_kind auto_delete_vec,
3172 int use_global_delete, tsubst_flags_t complain)
ce28ee2e 3173{
3174 tree virtual_size;
96624a9e 3175 tree ptype = build_pointer_type (type = complete_type (type));
ba2f764e 3176 tree size_exp;
ce28ee2e 3177
3178 /* Temporary variables used by the loop. */
3179 tree tbase, tbase_init;
3180
3181 /* This is the body of the loop that implements the deletion of a
3182 single element, and moves temp variables to next elements. */
3183 tree body;
3184
3185 /* This is the LOOP_EXPR that governs the deletion of the elements. */
8a4008da 3186 tree loop = 0;
ce28ee2e 3187
3188 /* This is the thing that governs what to do after the loop has run. */
3189 tree deallocate_expr = 0;
3190
3191 /* This is the BIND_EXPR which holds the outermost iterator of the
3192 loop. It is convenient to set this variable up and test it before
3193 executing any other code in the loop.
3194 This is also the containing expression returned by this function. */
3195 tree controller = NULL_TREE;
0de36bdb 3196 tree tmp;
ce28ee2e 3197
34b1bc3b 3198 /* We should only have 1-D arrays here. */
092b1d6f 3199 gcc_assert (TREE_CODE (type) != ARRAY_TYPE);
34b1bc3b 3200
9e505437 3201 if (base == error_mark_node || maxindex == error_mark_node)
3202 return error_mark_node;
3203
ba2f764e 3204 if (!COMPLETE_TYPE_P (type))
3205 {
3206 if ((complain & tf_warning)
3207 && warning (OPT_Wdelete_incomplete,
3208 "possible problem detected in invocation of "
3209 "delete [] operator:"))
3210 {
3211 cxx_incomplete_type_diagnostic (base, type, DK_WARNING);
3212 inform (input_location, "neither the destructor nor the "
3213 "class-specific operator delete [] will be called, "
3214 "even if they are declared when the class is defined");
3215 }
d1856d2c 3216 /* This size won't actually be used. */
3217 size_exp = size_one_node;
3218 goto no_destructor;
ba2f764e 3219 }
3220
3221 size_exp = size_in_bytes (type);
3222
575852de 3223 if (! MAYBE_CLASS_TYPE_P (type))
8a4008da 3224 goto no_destructor;
575852de 3225 else if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
3226 {
3227 /* Make sure the destructor is callable. */
3228 if (type_build_dtor_call (type))
3229 {
3230 tmp = build_delete (ptype, base, sfk_complete_destructor,
3231 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1,
3232 complain);
3233 if (tmp == error_mark_node)
3234 return error_mark_node;
3235 }
3236 goto no_destructor;
3237 }
ce28ee2e 3238
30de7d91 3239 /* The below is short by the cookie size. */
902de8ed 3240 virtual_size = size_binop (MULT_EXPR, size_exp,
3241 convert (sizetype, maxindex));
ce28ee2e 3242
31236dcd 3243 tbase = create_temporary_var (ptype);
2cc66f2a 3244 tbase_init
3245 = cp_build_modify_expr (tbase, NOP_EXPR,
3246 fold_build_pointer_plus_loc (input_location,
3247 fold_convert (ptype,
3248 base),
3249 virtual_size),
3250 complain);
9e505437 3251 if (tbase_init == error_mark_node)
3252 return error_mark_node;
831d52a2 3253 controller = build3 (BIND_EXPR, void_type_node, tbase,
3254 NULL_TREE, NULL_TREE);
ce28ee2e 3255 TREE_SIDE_EFFECTS (controller) = 1;
ce28ee2e 3256
831d52a2 3257 body = build1 (EXIT_EXPR, void_type_node,
eb5b85b5 3258 build2 (EQ_EXPR, boolean_type_node, tbase,
3259 fold_convert (ptype, base)));
389dd41b 3260 tmp = fold_build1_loc (input_location, NEGATE_EXPR, sizetype, size_exp);
2cc66f2a 3261 tmp = fold_build_pointer_plus (tbase, tmp);
9e505437 3262 tmp = cp_build_modify_expr (tbase, NOP_EXPR, tmp, complain);
3263 if (tmp == error_mark_node)
3264 return error_mark_node;
3265 body = build_compound_expr (input_location, body, tmp);
3266 tmp = build_delete (ptype, tbase, sfk_complete_destructor,
3267 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1,
3268 complain);
3269 if (tmp == error_mark_node)
3270 return error_mark_node;
3271 body = build_compound_expr (input_location, body, tmp);
ce28ee2e 3272
831d52a2 3273 loop = build1 (LOOP_EXPR, void_type_node, body);
e60a6f7b 3274 loop = build_compound_expr (input_location, tbase_init, loop);
ce28ee2e 3275
3276 no_destructor:
060afa30 3277 /* Delete the storage if appropriate. */
3278 if (auto_delete_vec == sfk_deleting_destructor)
ce28ee2e 3279 {
3280 tree base_tbd;
3281
30de7d91 3282 /* The below is short by the cookie size. */
902de8ed 3283 virtual_size = size_binop (MULT_EXPR, size_exp,
3284 convert (sizetype, maxindex));
ce28ee2e 3285
3286 if (! TYPE_VEC_NEW_USES_COOKIE (type))
3287 /* no header */
3288 base_tbd = base;
3289 else
3290 {
89e923d8 3291 tree cookie_size;
3292
600f4be7 3293 cookie_size = targetm.cxx.get_cookie_size (type);
9e505437 3294 base_tbd = cp_build_binary_op (input_location,
3295 MINUS_EXPR,
3296 cp_convert (string_type_node,
c4698a21 3297 base, complain),
9e505437 3298 cookie_size,
3299 complain);
3300 if (base_tbd == error_mark_node)
3301 return error_mark_node;
c4698a21 3302 base_tbd = cp_convert (ptype, base_tbd, complain);
96624a9e 3303 /* True size with header. */
89e923d8 3304 virtual_size = size_binop (PLUS_EXPR, virtual_size, cookie_size);
ce28ee2e 3305 }
675996d9 3306
060afa30 3307 deallocate_expr = build_op_delete_call (VEC_DELETE_EXPR,
3308 base_tbd, virtual_size,
3309 use_global_delete & 1,
3310 /*placement=*/NULL_TREE,
c4698a21 3311 /*alloc_fn=*/NULL_TREE,
3312 complain);
ce28ee2e 3313 }
3314
8a4008da 3315 body = loop;
3316 if (!deallocate_expr)
3317 ;
3318 else if (!body)
3319 body = deallocate_expr;
ce28ee2e 3320 else
e60a6f7b 3321 body = build_compound_expr (input_location, body, deallocate_expr);
9031d10b 3322
8a4008da 3323 if (!body)
3324 body = integer_zero_node;
9031d10b 3325
ce28ee2e 3326 /* Outermost wrapper: If pointer is null, punt. */
389dd41b 3327 body = fold_build3_loc (input_location, COND_EXPR, void_type_node,
3328 fold_build2_loc (input_location,
3329 NE_EXPR, boolean_type_node, base,
b7837065 3330 convert (TREE_TYPE (base),
f8d621db 3331 nullptr_node)),
b7837065 3332 body, integer_zero_node);
ce28ee2e 3333 body = build1 (NOP_EXPR, void_type_node, body);
3334
3335 if (controller)
3336 {
3337 TREE_OPERAND (controller, 1) = body;
bdb2219e 3338 body = controller;
ce28ee2e 3339 }
bdb2219e 3340
3341 if (TREE_CODE (base) == SAVE_EXPR)
3342 /* Pre-evaluate the SAVE_EXPR outside of the BIND_EXPR. */
831d52a2 3343 body = build2 (COMPOUND_EXPR, void_type_node, base, body);
bdb2219e 3344
9e505437 3345 return convert_to_void (body, ICV_CAST, complain);
ce28ee2e 3346}
3347
9031d10b 3348/* Create an unnamed variable of the indicated TYPE. */
4eb32e62 3349
b48733fd 3350tree
6c5ad428 3351create_temporary_var (tree type)
8d89508b 3352{
b48733fd 3353 tree decl;
9031d10b 3354
e60a6f7b 3355 decl = build_decl (input_location,
3356 VAR_DECL, NULL_TREE, type);
b48733fd 3357 TREE_USED (decl) = 1;
3358 DECL_ARTIFICIAL (decl) = 1;
b48733fd 3359 DECL_IGNORED_P (decl) = 1;
e0e489c4 3360 DECL_CONTEXT (decl) = current_function_decl;
b48733fd 3361
b48733fd 3362 return decl;
8d89508b 3363}
3364
b48733fd 3365/* Create a new temporary variable of the indicated TYPE, initialized
3366 to INIT.
8d89508b 3367
b48733fd 3368 It is not entered into current_binding_level, because that breaks
3369 things when it comes time to do final cleanups (which take place
3370 "outside" the binding contour of the function). */
3371
0162f152 3372tree
6c5ad428 3373get_temp_regvar (tree type, tree init)
ce28ee2e 3374{
b48733fd 3375 tree decl;
8d89508b 3376
b48733fd 3377 decl = create_temporary_var (type);
7dd37241 3378 add_decl_expr (decl);
9031d10b 3379
ebd21de4 3380 finish_expr_stmt (cp_build_modify_expr (decl, INIT_EXPR, init,
3381 tf_warning_or_error));
8d89508b 3382
b48733fd 3383 return decl;
ce28ee2e 3384}
3385
374fac5d 3386/* Subroutine of build_vec_init. Returns true if assigning to an array of
3387 INNER_ELT_TYPE from INIT is trivial. */
3388
3389static bool
3390vec_copy_assign_is_trivial (tree inner_elt_type, tree init)
3391{
3392 tree fromtype = inner_elt_type;
3393 if (real_lvalue_p (init))
3394 fromtype = cp_build_reference_type (fromtype, /*rval*/false);
3395 return is_trivially_xible (MODIFY_EXPR, inner_elt_type, fromtype);
3396}
3397
b48733fd 3398/* `build_vec_init' returns tree structure that performs
3399 initialization of a vector of aggregate types.
471086d6 3400
79b458ae 3401 BASE is a reference to the vector, of ARRAY_TYPE, or a pointer
3402 to the first element, of POINTER_TYPE.
0473b1af 3403 MAXINDEX is the maximum index of the array (one less than the
79b458ae 3404 number of elements). It is only used if BASE is a pointer or
0473b1af 3405 TYPE_DOMAIN (TREE_TYPE (BASE)) == NULL_TREE.
687a1c50 3406
471086d6 3407 INIT is the (possibly NULL) initializer.
3408
0152e879 3409 If EXPLICIT_VALUE_INIT_P is true, then INIT must be NULL. All
3410 elements in the array are value-initialized.
687a1c50 3411
471086d6 3412 FROM_ARRAY is 0 if we should init everything with INIT
3413 (i.e., every element initialized from INIT).
3414 FROM_ARRAY is 1 if we should index into INIT in parallel
3415 with initialization of DECL.
3416 FROM_ARRAY is 2 if we should index into INIT in parallel,
3417 but use assignment instead of initialization. */
3418
3419tree
074ab442 3420build_vec_init (tree base, tree maxindex, tree init,
0152e879 3421 bool explicit_value_init_p,
ebd21de4 3422 int from_array, tsubst_flags_t complain)
471086d6 3423{
3424 tree rval;
8d89508b 3425 tree base2 = NULL_TREE;
f0eaeecd 3426 tree itype = NULL_TREE;
8d89508b 3427 tree iterator;
79b458ae 3428 /* The type of BASE. */
a3691386 3429 tree atype = TREE_TYPE (base);
b48733fd 3430 /* The type of an element in the array. */
a3691386 3431 tree type = TREE_TYPE (atype);
9031d10b 3432 /* The element type reached after removing all outer array
36145d1d 3433 types. */
3434 tree inner_elt_type;
b48733fd 3435 /* The type of a pointer to an element in the array. */
3436 tree ptype;
3437 tree stmt_expr;
3438 tree compound_stmt;
3439 int destroy_temps;
b144fd49 3440 tree try_block = NULL_TREE;
8d89508b 3441 int num_initialized_elts = 0;
4bd132ff 3442 bool is_global;
ce984e5e 3443 tree obase = base;
f71c8090 3444 bool xvalue = false;
9e505437 3445 bool errors = false;
9031d10b 3446
79b458ae 3447 if (TREE_CODE (atype) == ARRAY_TYPE && TYPE_DOMAIN (atype))
0473b1af 3448 maxindex = array_type_nelts (atype);
3449
187f1591 3450 if (maxindex == NULL_TREE || maxindex == error_mark_node)
471086d6 3451 return error_mark_node;
3452
0152e879 3453 if (explicit_value_init_p)
687a1c50 3454 gcc_assert (!init);
3455
79b458ae 3456 inner_elt_type = strip_array_types (type);
1ba56394 3457
3458 /* Look through the TARGET_EXPR around a compound literal. */
3459 if (init && TREE_CODE (init) == TARGET_EXPR
d748d5cd 3460 && TREE_CODE (TARGET_EXPR_INITIAL (init)) == CONSTRUCTOR
3461 && from_array != 2)
1ba56394 3462 init = TARGET_EXPR_INITIAL (init);
3463
bcb3170c 3464 /* If we have a braced-init-list, make sure that the array
3465 is big enough for all the initializers. */
2b9b77fb 3466 bool length_check = (init && TREE_CODE (init) == CONSTRUCTOR
3467 && CONSTRUCTOR_NELTS (init) > 0
3468 && !TREE_CONSTANT (maxindex));
bcb3170c 3469
2b4d70c6 3470 if (init
a8fe6bf4 3471 && TREE_CODE (atype) == ARRAY_TYPE
8451e2c0 3472 && TREE_CONSTANT (maxindex)
2b4d70c6 3473 && (from_array == 2
374fac5d 3474 ? vec_copy_assign_is_trivial (inner_elt_type, init)
2b4d70c6 3475 : !TYPE_NEEDS_CONSTRUCTING (type))
a3691386 3476 && ((TREE_CODE (init) == CONSTRUCTOR
3477 /* Don't do this if the CONSTRUCTOR might contain something
3478 that might throw and require us to clean up. */
f1f41a6c 3479 && (vec_safe_is_empty (CONSTRUCTOR_ELTS (init))
36145d1d 3480 || ! TYPE_HAS_NONTRIVIAL_DESTRUCTOR (inner_elt_type)))
a3691386 3481 || from_array))
3482 {
c1c67b4f 3483 /* Do non-default initialization of trivial arrays resulting from
a3691386 3484 brace-enclosed initializers. In this case, digest_init and
3485 store_constructor will handle the semantics for us. */
3486
80945b46 3487 if (BRACE_ENCLOSED_INITIALIZER_P (init))
3488 init = digest_init (atype, init, complain);
831d52a2 3489 stmt_expr = build2 (INIT_EXPR, atype, base, init);
a3691386 3490 return stmt_expr;
3491 }
3492
c4698a21 3493 maxindex = cp_convert (ptrdiff_type_node, maxindex, complain);
79b458ae 3494 if (TREE_CODE (atype) == ARRAY_TYPE)
3495 {
3496 ptype = build_pointer_type (type);
4405c1ad 3497 base = decay_conversion (base, complain);
3498 if (base == error_mark_node)
3499 return error_mark_node;
c4698a21 3500 base = cp_convert (ptype, base, complain);
79b458ae 3501 }
3502 else
3503 ptype = atype;
471086d6 3504
b48733fd 3505 /* The code we are generating looks like:
face0cb7 3506 ({
b48733fd 3507 T* t1 = (T*) base;
a3691386 3508 T* rval = t1;
b48733fd 3509 ptrdiff_t iterator = maxindex;
3510 try {
805e22b2 3511 for (; iterator != -1; --iterator) {
a3691386 3512 ... initialize *t1 ...
3513 ++t1;
805e22b2 3514 }
b48733fd 3515 } catch (...) {
653e5405 3516 ... destroy elements that were constructed ...
b48733fd 3517 }
face0cb7 3518 rval;
3519 })
9031d10b 3520
b48733fd 3521 We can omit the try and catch blocks if we know that the
3522 initialization will never throw an exception, or if the array
a3691386 3523 elements do not have destructors. We can omit the loop completely if
9031d10b 3524 the elements of the array do not have constructors.
b48733fd 3525
3526 We actually wrap the entire body of the above in a STMT_EXPR, for
9031d10b 3527 tidiness.
b48733fd 3528
3529 When copying from array to another, when the array elements have
3530 only trivial copy constructors, we should use __builtin_memcpy
3531 rather than generating a loop. That way, we could take advantage
a17c2a3a 3532 of whatever cleverness the back end has for dealing with copies
b48733fd 3533 of blocks of memory. */
3534
4bd132ff 3535 is_global = begin_init_stmts (&stmt_expr, &compound_stmt);
5c3247a9 3536 destroy_temps = stmts_are_full_exprs_p ();
a08e60ae 3537 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
a3691386 3538 rval = get_temp_regvar (ptype, base);
b48733fd 3539 base = get_temp_regvar (ptype, rval);
8d89508b 3540 iterator = get_temp_regvar (ptrdiff_type_node, maxindex);
471086d6 3541
d748d5cd 3542 /* If initializing one array from another, initialize element by
3543 element. We rely upon the below calls to do the argument
3544 checking. Evaluate the initializer before entering the try block. */
3545 if (from_array && init && TREE_CODE (init) != CONSTRUCTOR)
3546 {
f71c8090 3547 if (lvalue_kind (init) & clk_rvalueref)
3548 xvalue = true;
4405c1ad 3549 base2 = decay_conversion (init, complain);
3550 if (base2 == error_mark_node)
3551 return error_mark_node;
d748d5cd 3552 itype = TREE_TYPE (base2);
3553 base2 = get_temp_regvar (itype, base2);
3554 itype = TREE_TYPE (itype);
3555 }
3556
8d89508b 3557 /* Protect the entire array initialization so that we can destroy
a3691386 3558 the partially constructed array if an exception is thrown.
3559 But don't do this if we're assigning. */
3560 if (flag_exceptions && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
3561 && from_array != 2)
18a4cb16 3562 {
3563 try_block = begin_try_block ();
18a4cb16 3564 }
8d89508b 3565
39e3cef3 3566 /* Should we try to create a constant initializer? */
3567 bool try_const = (TREE_CODE (atype) == ARRAY_TYPE
3568 && TREE_CONSTANT (maxindex)
b627b020 3569 && (init ? TREE_CODE (init) == CONSTRUCTOR
3570 : (type_has_constexpr_default_constructor
3571 (inner_elt_type)))
39e3cef3 3572 && (literal_type_p (inner_elt_type)
3573 || TYPE_HAS_CONSTEXPR_CTOR (inner_elt_type)));
3574 vec<constructor_elt, va_gc> *const_vec = NULL;
3575 bool saw_non_const = false;
3576 /* If we're initializing a static array, we want to do static
3577 initialization of any elements with constant initializers even if
3578 some are non-constant. */
3579 bool do_static_init = (DECL_P (obase) && TREE_STATIC (obase));
3580
79f1f232 3581 bool empty_list = false;
c8769bdd 3582 if (init && BRACE_ENCLOSED_INITIALIZER_P (init)
3583 && CONSTRUCTOR_NELTS (init) == 0)
79f1f232 3584 /* Skip over the handling of non-empty init lists. */
3585 empty_list = true;
c8769bdd 3586
ce984e5e 3587 /* Maybe pull out constant value when from_array? */
3588
c8769bdd 3589 else if (init != NULL_TREE && TREE_CODE (init) == CONSTRUCTOR)
471086d6 3590 {
c1c67b4f 3591 /* Do non-default initialization of non-trivial arrays resulting from
a3691386 3592 brace-enclosed initializers. */
c75b4594 3593 unsigned HOST_WIDE_INT idx;
ce984e5e 3594 tree field, elt;
c7b89256 3595 /* If the constructor already has the array type, it's been through
3596 digest_init, so we shouldn't try to do anything more. */
3597 bool digested = same_type_p (atype, TREE_TYPE (init));
435a15bf 3598 from_array = 0;
3599
bcb3170c 3600 if (length_check)
3601 {
2b9b77fb 3602 tree nelts = size_int (CONSTRUCTOR_NELTS (init) - 1);
3603 if (TREE_CODE (atype) != ARRAY_TYPE)
3604 {
3605 if (flag_exceptions)
3606 {
3607 tree c = fold_build2 (LT_EXPR, boolean_type_node, iterator,
3608 nelts);
3609 c = build3 (COND_EXPR, void_type_node, c,
3610 throw_bad_array_new_length (), void_node);
3611 finish_expr_stmt (c);
3612 }
3613 /* Don't check an array new when -fno-exceptions. */
3614 }
3615 else if (flag_sanitize & SANITIZE_BOUNDS
411b7663 3616 && do_ubsan_in_current_function ())
2b9b77fb 3617 {
3618 /* Make sure the last element of the initializer is in bounds. */
3619 finish_expr_stmt
3620 (ubsan_instrument_bounds
3621 (input_location, obase, &nelts, /*ignore_off_by_one*/false));
3622 }
bcb3170c 3623 }
3624
ce984e5e 3625 if (try_const)
39e3cef3 3626 vec_alloc (const_vec, CONSTRUCTOR_NELTS (init));
ce984e5e 3627
3628 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (init), idx, field, elt)
471086d6 3629 {
b48733fd 3630 tree baseref = build1 (INDIRECT_REF, type, base);
ce984e5e 3631 tree one_init;
471086d6 3632
8d89508b 3633 num_initialized_elts++;
471086d6 3634
f47c1747 3635 current_stmt_tree ()->stmts_are_full_exprs_p = 1;
c7b89256 3636 if (digested)
3637 one_init = build2 (INIT_EXPR, type, baseref, elt);
3638 else if (MAYBE_CLASS_TYPE_P (type) || TREE_CODE (type) == ARRAY_TYPE)
ce984e5e 3639 one_init = build_aggr_init (baseref, elt, 0, complain);
8d89508b 3640 else
ce984e5e 3641 one_init = cp_build_modify_expr (baseref, NOP_EXPR,
3642 elt, complain);
9e505437 3643 if (one_init == error_mark_node)
3644 errors = true;
ce984e5e 3645 if (try_const)
3646 {
39e3cef3 3647 tree e = maybe_constant_init (one_init);
ce984e5e 3648 if (reduced_constant_expression_p (e))
3649 {
39e3cef3 3650 CONSTRUCTOR_APPEND_ELT (const_vec, field, e);
ce984e5e 3651 if (do_static_init)
3652 one_init = NULL_TREE;
3653 else
3654 one_init = build2 (INIT_EXPR, type, baseref, e);
ce984e5e 3655 }
3656 else
3657 {
3658 if (do_static_init)
42f98e54 3659 {
3660 tree value = build_zero_init (TREE_TYPE (e), NULL_TREE,
3661 true);
3662 if (value)
39e3cef3 3663 CONSTRUCTOR_APPEND_ELT (const_vec, field, value);
42f98e54 3664 }
ce984e5e 3665 saw_non_const = true;
3666 }
3667 }
3668
3669 if (one_init)
3670 finish_expr_stmt (one_init);
f47c1747 3671 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
8d89508b 3672
9e505437 3673 one_init = cp_build_unary_op (PREINCREMENT_EXPR, base, 0, complain);
3674 if (one_init == error_mark_node)
3675 errors = true;
3676 else
3677 finish_expr_stmt (one_init);
3678
3679 one_init = cp_build_unary_op (PREDECREMENT_EXPR, iterator, 0,
3680 complain);
3681 if (one_init == error_mark_node)
3682 errors = true;
3683 else
3684 finish_expr_stmt (one_init);
471086d6 3685 }
471086d6 3686
79f1f232 3687 /* Any elements without explicit initializers get T{}. */
3688 empty_list = true;
471086d6 3689 }
8d89508b 3690 else if (from_array)
471086d6 3691 {
8d89508b 3692 if (init)
d748d5cd 3693 /* OK, we set base2 above. */;
883e1020 3694 else if (CLASS_TYPE_P (type)
8d89508b 3695 && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
3696 {
ebd21de4 3697 if (complain & tf_error)
3698 error ("initializer ends prematurely");
9e505437 3699 errors = true;
8d89508b 3700 }
3701 }
471086d6 3702
8d89508b 3703 /* Now, default-initialize any remaining elements. We don't need to
3704 do that if a) the type does not need constructing, or b) we've
435a15bf 3705 already initialized all the elements.
3706
3707 We do need to keep going if we're copying an array. */
3708
b627b020 3709 if (try_const && !init)
3710 /* With a constexpr default constructor, which we checked for when
3711 setting try_const above, default-initialization is equivalent to
3712 value-initialization, and build_value_init gives us something more
3713 friendly to maybe_constant_init. */
3714 explicit_value_init_p = true;
435a15bf 3715 if (from_array
c8769bdd 3716 || ((type_build_ctor_call (type) || init || explicit_value_init_p)
e913b5cd 3717 && ! (tree_fits_shwi_p (maxindex)
a0c2c45b 3718 && (num_initialized_elts
e913b5cd 3719 == tree_to_shwi (maxindex) + 1))))
8d89508b 3720 {
e2a136cd 3721 /* If the ITERATOR is equal to -1, then we don't have to loop;
8d89508b 3722 we've already initialized all the elements. */
805e22b2 3723 tree for_stmt;
b48733fd 3724 tree elt_init;
687a1c50 3725 tree to;
b48733fd 3726
fa7d5870 3727 for_stmt = begin_for_stmt (NULL_TREE, NULL_TREE);
805e22b2 3728 finish_for_init_stmt (for_stmt);
dffc85a4 3729 finish_for_cond (build2 (NE_EXPR, boolean_type_node, iterator,
3730 build_int_cst (TREE_TYPE (iterator), -1)),
bb7b305c 3731 for_stmt, false);
9e505437 3732 elt_init = cp_build_unary_op (PREDECREMENT_EXPR, iterator, 0,
3733 complain);
3734 if (elt_init == error_mark_node)
3735 errors = true;
3736 finish_for_expr (elt_init, for_stmt);
471086d6 3737
687a1c50 3738 to = build1 (INDIRECT_REF, type, base);
3739
2cc4f948 3740 /* If the initializer is {}, then all elements are initialized from T{}.
3741 But for non-classes, that's the same as value-initialization. */
3742 if (empty_list)
3743 {
3744 if (cxx_dialect >= cxx11 && AGGREGATE_TYPE_P (type))
3745 {
4102f617 3746 init = build_constructor (init_list_type_node, NULL);
2cc4f948 3747 }
3748 else
3749 {
3750 init = NULL_TREE;
3751 explicit_value_init_p = true;
3752 }
3753 }
3754
471086d6 3755 if (from_array)
3756 {
471086d6 3757 tree from;
3758
3759 if (base2)
f71c8090 3760 {
3761 from = build1 (INDIRECT_REF, itype, base2);
3762 if (xvalue)
3763 from = move (from);
3764 }
471086d6 3765 else
3766 from = NULL_TREE;
3767
3768 if (from_array == 2)
ebd21de4 3769 elt_init = cp_build_modify_expr (to, NOP_EXPR, from,
3770 complain);
883e1020 3771 else if (type_build_ctor_call (type))
ebd21de4 3772 elt_init = build_aggr_init (to, from, 0, complain);
471086d6 3773 else if (from)
ebd21de4 3774 elt_init = cp_build_modify_expr (to, NOP_EXPR, from,
3775 complain);
471086d6 3776 else
092b1d6f 3777 gcc_unreachable ();
471086d6 3778 }
3779 else if (TREE_CODE (type) == ARRAY_TYPE)
3780 {
452fc47a 3781 if (init && !BRACE_ENCLOSED_INITIALIZER_P (init))
a3691386 3782 sorry
3783 ("cannot initialize multi-dimensional array with initializer");
3784 elt_init = build_vec_init (build1 (INDIRECT_REF, type, base),
452fc47a 3785 0, init,
0152e879 3786 explicit_value_init_p,
ebd21de4 3787 0, complain);
b48733fd 3788 }
0152e879 3789 else if (explicit_value_init_p)
a5f2d620 3790 {
3791 elt_init = build_value_init (type, complain);
9e505437 3792 if (elt_init != error_mark_node)
a5f2d620 3793 elt_init = build2 (INIT_EXPR, type, to, elt_init);
3794 }
b48733fd 3795 else
0152e879 3796 {
c8769bdd 3797 gcc_assert (type_build_ctor_call (type) || init);
3798 if (CLASS_TYPE_P (type))
3799 elt_init = build_aggr_init (to, init, 0, complain);
3800 else
3801 {
3802 if (TREE_CODE (init) == TREE_LIST)
3803 init = build_x_compound_expr_from_list (init, ELK_INIT,
3804 complain);
3805 elt_init = build2 (INIT_EXPR, type, to, init);
3806 }
0152e879 3807 }
9031d10b 3808
9e505437 3809 if (elt_init == error_mark_node)
3810 errors = true;
3811
39e3cef3 3812 if (try_const)
3813 {
b627b020 3814 /* FIXME refs to earlier elts */
39e3cef3 3815 tree e = maybe_constant_init (elt_init);
3816 if (reduced_constant_expression_p (e))
3817 {
3818 if (initializer_zerop (e))
3819 /* Don't fill the CONSTRUCTOR with zeros. */
3820 e = NULL_TREE;
3821 if (do_static_init)
3822 elt_init = NULL_TREE;
3823 }
3824 else
3825 {
3826 saw_non_const = true;
3827 if (do_static_init)
3828 e = build_zero_init (TREE_TYPE (e), NULL_TREE, true);
b627b020 3829 else
3830 e = NULL_TREE;
39e3cef3 3831 }
3832
3833 if (e)
3834 {
3835 int max = tree_to_shwi (maxindex)+1;
3836 for (; num_initialized_elts < max; ++num_initialized_elts)
3837 {
3838 tree field = size_int (num_initialized_elts);
3839 CONSTRUCTOR_APPEND_ELT (const_vec, field, e);
3840 }
3841 }
3842 }
3843
4bd132ff 3844 current_stmt_tree ()->stmts_are_full_exprs_p = 1;
39e3cef3 3845 if (elt_init)
3846 finish_expr_stmt (elt_init);
4bd132ff 3847 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
471086d6 3848
ebd21de4 3849 finish_expr_stmt (cp_build_unary_op (PREINCREMENT_EXPR, base, 0,
3850 complain));
471086d6 3851 if (base2)
ebd21de4 3852 finish_expr_stmt (cp_build_unary_op (PREINCREMENT_EXPR, base2, 0,
3853 complain));
ede3024b 3854
805e22b2 3855 finish_for_stmt (for_stmt);
471086d6 3856 }
8d89508b 3857
3858 /* Make sure to cleanup any partially constructed elements. */
a3691386 3859 if (flag_exceptions && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
3860 && from_array != 2)
b48733fd 3861 {
3862 tree e;
8e70fb09 3863 tree m = cp_build_binary_op (input_location,
3864 MINUS_EXPR, maxindex, iterator,
ebd21de4 3865 complain);
34b1bc3b 3866
3867 /* Flatten multi-dimensional array since build_vec_delete only
3868 expects one-dimensional array. */
3869 if (TREE_CODE (type) == ARRAY_TYPE)
8e70fb09 3870 m = cp_build_binary_op (input_location,
3871 MULT_EXPR, m,
68fca41d 3872 /* Avoid mixing signed and unsigned. */
3873 convert (TREE_TYPE (m),
3874 array_type_nelts_total (type)),
ebd21de4 3875 complain);
471086d6 3876
18a4cb16 3877 finish_cleanup_try_block (try_block);
9031d10b 3878 e = build_vec_delete_1 (rval, m,
060afa30 3879 inner_elt_type, sfk_complete_destructor,
9e505437 3880 /*use_global_delete=*/0, complain);
3881 if (e == error_mark_node)
3882 errors = true;
b48733fd 3883 finish_cleanup (e, try_block);
3884 }
3885
face0cb7 3886 /* The value of the array initialization is the array itself, RVAL
3887 is a pointer to the first element. */
2363ef00 3888 finish_stmt_expr_expr (rval, stmt_expr);
b48733fd 3889
4bd132ff 3890 stmt_expr = finish_init_stmts (is_global, stmt_expr, compound_stmt);
face0cb7 3891
01259852 3892 current_stmt_tree ()->stmts_are_full_exprs_p = destroy_temps;
3893
3894 if (errors)
3895 return error_mark_node;
39e3cef3 3896
3897 if (try_const)
3898 {
3899 if (!saw_non_const)
3900 {
3901 tree const_init = build_constructor (atype, const_vec);
3902 return build2 (INIT_EXPR, atype, obase, const_init);
3903 }
3904 else if (do_static_init && !vec_safe_is_empty (const_vec))
3905 DECL_INITIAL (obase) = build_constructor (atype, const_vec);
3906 else
3907 vec_free (const_vec);
3908 }
01259852 3909
79b458ae 3910 /* Now make the result have the correct type. */
3911 if (TREE_CODE (atype) == ARRAY_TYPE)
3912 {
3913 atype = build_pointer_type (atype);
3914 stmt_expr = build1 (NOP_EXPR, atype, stmt_expr);
f08923b3 3915 stmt_expr = cp_build_indirect_ref (stmt_expr, RO_NULL, complain);
b6879aae 3916 TREE_NO_WARNING (stmt_expr) = 1;
79b458ae 3917 }
9031d10b 3918
b48733fd 3919 return stmt_expr;
471086d6 3920}
3921
675996d9 3922/* Call the DTOR_KIND destructor for EXP. FLAGS are as for
3923 build_delete. */
f04596da 3924
3925static tree
9e505437 3926build_dtor_call (tree exp, special_function_kind dtor_kind, int flags,
3927 tsubst_flags_t complain)
f04596da 3928{
675996d9 3929 tree name;
ef4534a3 3930 tree fn;
675996d9 3931 switch (dtor_kind)
3932 {
3933 case sfk_complete_destructor:
3934 name = complete_dtor_identifier;
3935 break;
3936
3937 case sfk_base_destructor:
3938 name = base_dtor_identifier;
3939 break;
3940
3941 case sfk_deleting_destructor:
3942 name = deleting_dtor_identifier;
3943 break;
3944
3945 default:
092b1d6f 3946 gcc_unreachable ();
675996d9 3947 }
ef4534a3 3948 fn = lookup_fnfields (TREE_TYPE (exp), name, /*protect=*/2);
9031d10b 3949 return build_new_method_call (exp, fn,
f352a3fb 3950 /*args=*/NULL,
ef4534a3 3951 /*conversion_path=*/NULL_TREE,
393f878f 3952 flags,
ebd21de4 3953 /*fn_p=*/NULL,
9e505437 3954 complain);
f04596da 3955}
3956
471086d6 3957/* Generate a call to a destructor. TYPE is the type to cast ADDR to.
3958 ADDR is an expression which yields the store to be destroyed.
675996d9 3959 AUTO_DELETE is the name of the destructor to call, i.e., either
3960 sfk_complete_destructor, sfk_base_destructor, or
3961 sfk_deleting_destructor.
471086d6 3962
3963 FLAGS is the logical disjunction of zero or more LOOKUP_
52616263 3964 flags. See cp-tree.h for more info. */
96624a9e 3965
471086d6 3966tree
575852de 3967build_delete (tree otype, tree addr, special_function_kind auto_delete,
9e505437 3968 int flags, int use_global_delete, tsubst_flags_t complain)
471086d6 3969{
471086d6 3970 tree expr;
471086d6 3971
3972 if (addr == error_mark_node)
3973 return error_mark_node;
3974
575852de 3975 tree type = TYPE_MAIN_VARIANT (otype);
3976
471086d6 3977 /* Can happen when CURRENT_EXCEPTION_OBJECT gets its type
3978 set to `error_mark_node' before it gets properly cleaned up. */
3979 if (type == error_mark_node)
3980 return error_mark_node;
3981
575852de 3982 if (TREE_CODE (type) == POINTER_TYPE)
3983 type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
471086d6 3984
575852de 3985 if (TREE_CODE (type) == ARRAY_TYPE)
3986 {
3987 if (TYPE_DOMAIN (type) == NULL_TREE)
3988 {
3989 if (complain & tf_error)
3990 error ("unknown array size in delete");
3991 return error_mark_node;
3992 }
3993 return build_vec_delete (addr, array_type_nelts (type),
3994 auto_delete, use_global_delete, complain);
3995 }
fbb73d9b 3996
575852de 3997 if (TYPE_PTR_P (otype))
471086d6 3998 {
575852de 3999 addr = mark_rvalue_use (addr);
e097fb33 4000
8a0fd506 4001 /* We don't want to warn about delete of void*, only other
4002 incomplete types. Deleting other incomplete types
4003 invokes undefined behavior, but it is not ill-formed, so
4004 compile to something that would even do The Right Thing
4005 (TM) should the type have a trivial dtor and no delete
4006 operator. */
4007 if (!VOID_TYPE_P (type))
471086d6 4008 {
8a0fd506 4009 complete_type (type);
4010 if (!COMPLETE_TYPE_P (type))
4011 {
9e505437 4012 if ((complain & tf_warning)
ba2f764e 4013 && warning (OPT_Wdelete_incomplete,
4014 "possible problem detected in invocation of "
9e505437 4015 "delete operator:"))
a52d5726 4016 {
4017 cxx_incomplete_type_diagnostic (addr, type, DK_WARNING);
ba2f764e 4018 inform (input_location,
4019 "neither the destructor nor the class-specific "
a52d5726 4020 "operator delete will be called, even if they are "
bf776685 4021 "declared when the class is defined");
a52d5726 4022 }
8a0fd506 4023 }
3c22998f 4024 else if (auto_delete == sfk_deleting_destructor && warn_delnonvdtor
4025 && MAYBE_CLASS_TYPE_P (type) && !CLASSTYPE_FINAL (type)
4026 && TYPE_POLYMORPHIC_P (type))
90b40725 4027 {
4028 tree dtor;
4029 dtor = CLASSTYPE_DESTRUCTORS (type);
4030 if (!dtor || !DECL_VINDEX (dtor))
4031 {
4032 if (CLASSTYPE_PURE_VIRTUALS (type))
4033 warning (OPT_Wdelete_non_virtual_dtor,
4034 "deleting object of abstract class type %qT"
4035 " which has non-virtual destructor"
4036 " will cause undefined behaviour", type);
4037 else
4038 warning (OPT_Wdelete_non_virtual_dtor,
4039 "deleting object of polymorphic class type %qT"
4040 " which has non-virtual destructor"
4041 " might cause undefined behaviour", type);
4042 }
4043 }
471086d6 4044 }
4045 if (TREE_SIDE_EFFECTS (addr))
4046 addr = save_expr (addr);
bb0726a1 4047
331bc0ad 4048 /* Throw away const and volatile on target type of addr. */
c4698a21 4049 addr = convert_force (build_pointer_type (type), addr, 0, complain);
471086d6 4050 }
471086d6 4051 else
4052 {
4053 /* Don't check PROTECT here; leave that decision to the
4054 destructor. If the destructor is accessible, call it,
4055 else report error. */
9e505437 4056 addr = cp_build_addr_expr (addr, complain);
4057 if (addr == error_mark_node)
4058 return error_mark_node;
471086d6 4059 if (TREE_SIDE_EFFECTS (addr))
4060 addr = save_expr (addr);
4061
c4698a21 4062 addr = convert_force (build_pointer_type (type), addr, 0, complain);
471086d6 4063 }
4064
89e923d8 4065 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
471086d6 4066 {
575852de 4067 /* Make sure the destructor is callable. */
4068 if (type_build_dtor_call (type))
4069 {
4070 expr = build_dtor_call (cp_build_indirect_ref (addr, RO_NULL,
4071 complain),
4072 sfk_complete_destructor, flags, complain);
4073 if (expr == error_mark_node)
4074 return error_mark_node;
4075 }
4076
06382f61 4077 if (auto_delete != sfk_deleting_destructor)
3ab4693e 4078 return void_node;
471086d6 4079
074ab442 4080 return build_op_delete_call (DELETE_EXPR, addr,
4081 cxx_sizeof_nowarn (type),
393f878f 4082 use_global_delete,
4083 /*placement=*/NULL_TREE,
c4698a21 4084 /*alloc_fn=*/NULL_TREE,
4085 complain);
471086d6 4086 }
52616263 4087 else
471086d6 4088 {
56a58a8c 4089 tree head = NULL_TREE;
94f3b32d 4090 tree do_delete = NULL_TREE;
b465397d 4091 tree ifexp;
94f3b32d 4092
ed36f1cf 4093 if (CLASSTYPE_LAZY_DESTRUCTOR (type))
4094 lazily_declare_fn (sfk_destructor, type);
52616263 4095
b429d3ee 4096 /* For `::delete x', we must not use the deleting destructor
4097 since then we would not be sure to get the global `operator
4098 delete'. */
675996d9 4099 if (use_global_delete && auto_delete == sfk_deleting_destructor)
94f3b32d 4100 {
2aabb069 4101 /* We will use ADDR multiple times so we must save it. */
4102 addr = save_expr (addr);
56a58a8c 4103 head = get_target_expr (build_headof (addr));
47cd6605 4104 /* Delete the object. */
d1856d2c 4105 do_delete = build_op_delete_call (DELETE_EXPR,
4106 head,
4107 cxx_sizeof_nowarn (type),
4108 /*global_p=*/true,
4109 /*placement=*/NULL_TREE,
4110 /*alloc_fn=*/NULL_TREE,
4111 complain);
675996d9 4112 /* Otherwise, treat this like a complete object destructor
4113 call. */
4114 auto_delete = sfk_complete_destructor;
94f3b32d 4115 }
b429d3ee 4116 /* If the destructor is non-virtual, there is no deleting
4117 variant. Instead, we must explicitly call the appropriate
4118 `operator delete' here. */
4119 else if (!DECL_VIRTUAL_P (CLASSTYPE_DESTRUCTORS (type))
4120 && auto_delete == sfk_deleting_destructor)
4121 {
2aabb069 4122 /* We will use ADDR multiple times so we must save it. */
4123 addr = save_expr (addr);
4124 /* Build the call. */
b429d3ee 4125 do_delete = build_op_delete_call (DELETE_EXPR,
4126 addr,
d3a4d008 4127 cxx_sizeof_nowarn (type),
1611df57 4128 /*global_p=*/false,
393f878f 4129 /*placement=*/NULL_TREE,
c4698a21 4130 /*alloc_fn=*/NULL_TREE,
4131 complain);
b429d3ee 4132 /* Call the complete object destructor. */
4133 auto_delete = sfk_complete_destructor;
4134 }
7203b0e1 4135 else if (auto_delete == sfk_deleting_destructor
4136 && TYPE_GETS_REG_DELETE (type))
4137 {
4138 /* Make sure we have access to the member op delete, even though
4139 we'll actually be calling it from the destructor. */
d3a4d008 4140 build_op_delete_call (DELETE_EXPR, addr, cxx_sizeof_nowarn (type),
074ab442 4141 /*global_p=*/false,
393f878f 4142 /*placement=*/NULL_TREE,
c4698a21 4143 /*alloc_fn=*/NULL_TREE,
4144 complain);
7203b0e1 4145 }
471086d6 4146
9e505437 4147 expr = build_dtor_call (cp_build_indirect_ref (addr, RO_NULL, complain),
4148 auto_delete, flags, complain);
4149 if (expr == error_mark_node)
4150 return error_mark_node;
b465397d 4151 if (do_delete)
831d52a2 4152 expr = build2 (COMPOUND_EXPR, void_type_node, expr, do_delete);
63b1d638 4153
56a58a8c 4154 /* We need to calculate this before the dtor changes the vptr. */
4155 if (head)
4156 expr = build2 (COMPOUND_EXPR, void_type_node, head, expr);
4157
b465397d 4158 if (flags & LOOKUP_DESTRUCTOR)
4159 /* Explicit destructor call; don't check for null pointer. */
4160 ifexp = integer_one_node;
471086d6 4161 else
9e505437 4162 {
4163 /* Handle deleting a null pointer. */
4164 ifexp = fold (cp_build_binary_op (input_location,
f8d621db 4165 NE_EXPR, addr, nullptr_node,
9e505437 4166 complain));
4167 if (ifexp == error_mark_node)
4168 return error_mark_node;
4169 }
471086d6 4170
b465397d 4171 if (ifexp != integer_one_node)
3ab4693e 4172 expr = build3 (COND_EXPR, void_type_node, ifexp, expr, void_node);
471086d6 4173
471086d6 4174 return expr;
4175 }
52616263 4176}
471086d6 4177
52616263 4178/* At the beginning of a destructor, push cleanups that will call the
4179 destructors for our base classes and members.
6d55e442 4180
8ef5085e 4181 Called from begin_destructor_body. */
471086d6 4182
52616263 4183void
eb32e911 4184push_base_cleanups (void)
52616263 4185{
f6cc6a08 4186 tree binfo, base_binfo;
4187 int i;
52616263 4188 tree member;
4189 tree expr;
f1f41a6c 4190 vec<tree, va_gc> *vbases;
471086d6 4191
52616263 4192 /* Run destructors for all virtual baseclasses. */
1f0b839e 4193 if (CLASSTYPE_VBASECLASSES (current_class_type))
52616263 4194 {
52616263 4195 tree cond = (condition_conversion
831d52a2 4196 (build2 (BIT_AND_EXPR, integer_type_node,
4197 current_in_charge_parm,
4198 integer_two_node)));
471086d6 4199
97c118b9 4200 /* The CLASSTYPE_VBASECLASSES vector is in initialization
52616263 4201 order, which is also the right order for pushing cleanups. */
930bdacf 4202 for (vbases = CLASSTYPE_VBASECLASSES (current_class_type), i = 0;
f1f41a6c 4203 vec_safe_iterate (vbases, i, &base_binfo); i++)
471086d6 4204 {
575852de 4205 if (type_build_dtor_call (BINFO_TYPE (base_binfo)))
471086d6 4206 {
9031d10b 4207 expr = build_special_member_call (current_class_ref,
f70cb9e6 4208 base_dtor_identifier,
f352a3fb 4209 NULL,
930bdacf 4210 base_binfo,
9031d10b 4211 (LOOKUP_NORMAL
ebd21de4 4212 | LOOKUP_NONVIRTUAL),
575852de 4213 tf_warning_or_error);
4214 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo)))
4215 {
4216 expr = build3 (COND_EXPR, void_type_node, cond,
3ab4693e 4217 expr, void_node);
575852de 4218 finish_decl_cleanup (NULL_TREE, expr);
4219 }
471086d6 4220 }
4221 }
52616263 4222 }
4223
52616263 4224 /* Take care of the remaining baseclasses. */
f6cc6a08 4225 for (binfo = TYPE_BINFO (current_class_type), i = 0;
4226 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
52616263 4227 {
575852de 4228 if (BINFO_VIRTUAL_P (base_binfo)
4229 || !type_build_dtor_call (BINFO_TYPE (base_binfo)))
52616263 4230 continue;
4231
9031d10b 4232 expr = build_special_member_call (current_class_ref,
f70cb9e6 4233 base_dtor_identifier,
f352a3fb 4234 NULL, base_binfo,
ebd21de4 4235 LOOKUP_NORMAL | LOOKUP_NONVIRTUAL,
4236 tf_warning_or_error);
575852de 4237 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo)))
4238 finish_decl_cleanup (NULL_TREE, expr);
52616263 4239 }
4240
80e54732 4241 /* Don't automatically destroy union members. */
4242 if (TREE_CODE (current_class_type) == UNION_TYPE)
4243 return;
4244
52616263 4245 for (member = TYPE_FIELDS (current_class_type); member;
1767a056 4246 member = DECL_CHAIN (member))
52616263 4247 {
80e54732 4248 tree this_type = TREE_TYPE (member);
4249 if (this_type == error_mark_node
e9432e8f 4250 || TREE_CODE (member) != FIELD_DECL
4251 || DECL_ARTIFICIAL (member))
52616263 4252 continue;
2aa675e9 4253 if (ANON_AGGR_TYPE_P (this_type))
80e54732 4254 continue;
575852de 4255 if (type_build_dtor_call (this_type))
52616263 4256 {
9031d10b 4257 tree this_member = (build_class_member_access_expr
4258 (current_class_ref, member,
4ac852cb 4259 /*access_path=*/NULL_TREE,
ebd21de4 4260 /*preserve_reference=*/false,
4261 tf_warning_or_error));
52616263 4262 expr = build_delete (this_type, this_member,
4263 sfk_complete_destructor,
4264 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_NORMAL,
9e505437 4265 0, tf_warning_or_error);
575852de 4266 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (this_type))
4267 finish_decl_cleanup (NULL_TREE, expr);
52616263 4268 }
471086d6 4269 }
4270}
4271
471086d6 4272/* Build a C++ vector delete expression.
4273 MAXINDEX is the number of elements to be deleted.
4274 ELT_SIZE is the nominal size of each element in the vector.
4275 BASE is the expression that should yield the store to be deleted.
471086d6 4276 This function expands (or synthesizes) these calls itself.
4277 AUTO_DELETE_VEC says whether the container (vector) should be deallocated.
471086d6 4278
4279 This also calls delete for virtual baseclasses of elements of the vector.
4280
4281 Update: MAXINDEX is no longer needed. The size can be extracted from the
4282 start of the vector for pointers, and from the type for arrays. We still
4283 use MAXINDEX for arrays because it happens to already have one of the
4284 values we'd have to extract. (We could use MAXINDEX with pointers to
4285 confirm the size, and trap if the numbers differ; not clear that it'd
4286 be worth bothering.) */
96624a9e 4287
471086d6 4288tree
6c5ad428 4289build_vec_delete (tree base, tree maxindex,
9e505437 4290 special_function_kind auto_delete_vec,
4291 int use_global_delete, tsubst_flags_t complain)
471086d6 4292{
ce28ee2e 4293 tree type;
95873270 4294 tree rval;
4295 tree base_init = NULL_TREE;
471086d6 4296
ce28ee2e 4297 type = TREE_TYPE (base);
5c352956 4298
c21c015b 4299 if (TYPE_PTR_P (type))
471086d6 4300 {
4301 /* Step back one from start of vector, and read dimension. */
89e923d8 4302 tree cookie_addr;
75a70cf9 4303 tree size_ptr_type = build_pointer_type (sizetype);
89e923d8 4304
15dfc2ca 4305 base = mark_rvalue_use (base);
6853f4fa 4306 if (TREE_SIDE_EFFECTS (base))
95873270 4307 {
4308 base_init = get_target_expr (base);
4309 base = TARGET_EXPR_SLOT (base_init);
4310 }
30de7d91 4311 type = strip_array_types (TREE_TYPE (type));
389dd41b 4312 cookie_addr = fold_build1_loc (input_location, NEGATE_EXPR,
4313 sizetype, TYPE_SIZE_UNIT (sizetype));
2cc66f2a 4314 cookie_addr = fold_build_pointer_plus (fold_convert (size_ptr_type, base),
4315 cookie_addr);
9e505437 4316 maxindex = cp_build_indirect_ref (cookie_addr, RO_NULL, complain);
471086d6 4317 }
ce28ee2e 4318 else if (TREE_CODE (type) == ARRAY_TYPE)
471086d6 4319 {
331bc0ad 4320 /* Get the total number of things in the array, maxindex is a
4321 bad name. */
ce28ee2e 4322 maxindex = array_type_nelts_total (type);
89e923d8 4323 type = strip_array_types (type);
452fc47a 4324 base = decay_conversion (base, complain);
9e505437 4325 if (base == error_mark_node)
4326 return error_mark_node;
6853f4fa 4327 if (TREE_SIDE_EFFECTS (base))
95873270 4328 {
4329 base_init = get_target_expr (base);
4330 base = TARGET_EXPR_SLOT (base_init);
4331 }
471086d6 4332 }
4333 else
4334 {
9e505437 4335 if (base != error_mark_node && !(complain & tf_error))
905d4035 4336 error ("type to vector delete is neither pointer or array type");
471086d6 4337 return error_mark_node;
4338 }
471086d6 4339
95873270 4340 rval = build_vec_delete_1 (base, maxindex, type, auto_delete_vec,
9e505437 4341 use_global_delete, complain);
4342 if (base_init && rval != error_mark_node)
831d52a2 4343 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), base_init, rval);
95873270 4344
4345 return rval;
471086d6 4346}