]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cp/init.c
libstdc++: Fix <bit> to work freestanding [PR 100060]
[thirdparty/gcc.git] / gcc / cp / init.c
CommitLineData
8d08fdba 1/* Handle initialization things in C++.
99dee823 2 Copyright (C) 1987-2021 Free Software Foundation, Inc.
8d08fdba
MS
3 Contributed by Michael Tiemann (tiemann@cygnus.com)
4
f5adbb8d 5This file is part of GCC.
8d08fdba 6
f5adbb8d 7GCC is free software; you can redistribute it and/or modify
8d08fdba 8it under the terms of the GNU General Public License as published by
e77f031d 9the Free Software Foundation; either version 3, or (at your option)
8d08fdba
MS
10any later version.
11
f5adbb8d 12GCC is distributed in the hope that it will be useful,
8d08fdba
MS
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
e77f031d
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
8d08fdba 20
e92cc029 21/* High-level class interface. */
8d08fdba
MS
22
23#include "config.h"
8d052bc7 24#include "system.h"
4977bab6 25#include "coretypes.h"
2adfab87 26#include "target.h"
2adfab87 27#include "cp-tree.h"
d8a2d370
DN
28#include "stringpool.h"
29#include "varasm.h"
45b0be94 30#include "gimplify.h"
46621807 31#include "c-family/c-ubsan.h"
24f12823 32#include "intl.h"
314e6352
ML
33#include "stringpool.h"
34#include "attribs.h"
45b2222a 35#include "asan.h"
8e007055 36#include "stor-layout.h"
de05c19d 37#include "builtins.h"
8d08fdba 38
2a3398e1
NS
39static bool begin_init_stmts (tree *, tree *);
40static tree finish_init_stmts (bool, tree, tree);
2282d28d 41static void construct_virtual_base (tree, tree);
5ade1ed2
DG
42static void expand_aggr_init_1 (tree, tree, tree, tree, int, tsubst_flags_t);
43static void expand_default_init (tree, tree, tree, tree, int, tsubst_flags_t);
2282d28d 44static void perform_member_init (tree, tree);
362efdc1
NN
45static int member_init_ok_or_else (tree, tree, tree);
46static void expand_virtual_init (tree, tree);
2282d28d 47static tree sort_mem_initializers (tree, tree);
362efdc1
NN
48static tree initializing_context (tree);
49static void expand_cleanup_for_base (tree, tree);
362efdc1 50static tree dfs_initialize_vtbl_ptrs (tree, void *);
362efdc1 51static tree build_field_list (tree, tree, int *);
40bb78ad 52static int diagnose_uninitialized_cst_or_ref_member_1 (tree, tree, bool, bool);
8d08fdba 53
ff502317
BE
54static GTY(()) tree fn;
55
3dbc07b6
MM
56/* We are about to generate some complex initialization code.
57 Conceptually, it is all a single expression. However, we may want
58 to include conditionals, loops, and other such statement-level
59 constructs. Therefore, we build the initialization code inside a
60 statement-expression. This function starts such an expression.
61 STMT_EXPR_P and COMPOUND_STMT_P are filled in by this function;
62 pass them back to finish_init_stmts when the expression is
63 complete. */
64
2a3398e1 65static bool
362efdc1 66begin_init_stmts (tree *stmt_expr_p, tree *compound_stmt_p)
3dbc07b6 67{
38e01f9e 68 bool is_global = !building_stmt_list_p ();
c8094d83 69
2a3398e1 70 *stmt_expr_p = begin_stmt_expr ();
325c3691 71 *compound_stmt_p = begin_compound_stmt (BCS_NO_SCOPE);
2a3398e1
NS
72
73 return is_global;
3dbc07b6
MM
74}
75
76/* Finish out the statement-expression begun by the previous call to
77 begin_init_stmts. Returns the statement-expression itself. */
78
2a3398e1
NS
79static tree
80finish_init_stmts (bool is_global, tree stmt_expr, tree compound_stmt)
c8094d83 81{
7a3397c7 82 finish_compound_stmt (compound_stmt);
c8094d83 83
303b7406 84 stmt_expr = finish_stmt_expr (stmt_expr, true);
3dbc07b6 85
38e01f9e 86 gcc_assert (!building_stmt_list_p () == is_global);
c8094d83 87
3dbc07b6
MM
88 return stmt_expr;
89}
90
91/* Constructors */
92
338d90b8
NS
93/* Called from initialize_vtbl_ptrs via dfs_walk. BINFO is the base
94 which we want to initialize the vtable pointer for, DATA is
95 TREE_LIST whose TREE_VALUE is the this ptr expression. */
7177d104 96
d569399b 97static tree
362efdc1 98dfs_initialize_vtbl_ptrs (tree binfo, void *data)
d569399b 99{
5d5a519f
NS
100 if (!TYPE_CONTAINS_VPTR_P (BINFO_TYPE (binfo)))
101 return dfs_skip_bases;
c8094d83 102
5d5a519f 103 if (!BINFO_PRIMARY_P (binfo) || BINFO_VIRTUAL_P (binfo))
d569399b
MM
104 {
105 tree base_ptr = TREE_VALUE ((tree) data);
7177d104 106
a271590a
PC
107 base_ptr = build_base_path (PLUS_EXPR, base_ptr, binfo, /*nonnull=*/1,
108 tf_warning_or_error);
d569399b
MM
109
110 expand_virtual_init (binfo, base_ptr);
111 }
7177d104 112
d569399b
MM
113 return NULL_TREE;
114}
115
cf2e003b
MM
116/* Initialize all the vtable pointers in the object pointed to by
117 ADDR. */
e92cc029 118
8d08fdba 119void
362efdc1 120initialize_vtbl_ptrs (tree addr)
8d08fdba 121{
cf2e003b
MM
122 tree list;
123 tree type;
124
125 type = TREE_TYPE (TREE_TYPE (addr));
126 list = build_tree_list (type, addr);
d569399b 127
bbd15aac 128 /* Walk through the hierarchy, initializing the vptr in each base
1f5a253a 129 class. We do these in pre-order because we can't find the virtual
3461fba7
NS
130 bases for a class until we've initialized the vtbl for that
131 class. */
5d5a519f 132 dfs_walk_once (TYPE_BINFO (type), dfs_initialize_vtbl_ptrs, NULL, list);
8d08fdba 133}
d569399b 134
17bbb839
MM
135/* Return an expression for the zero-initialization of an object with
136 type T. This expression will either be a constant (in the case
137 that T is a scalar), or a CONSTRUCTOR (in the case that T is an
b43d1bde
PC
138 aggregate), or NULL (in the case that T does not require
139 initialization). In either case, the value can be used as
140 DECL_INITIAL for a decl of the indicated TYPE; it is a valid static
141 initializer. If NELTS is non-NULL, and TYPE is an ARRAY_TYPE, NELTS
142 is the number of elements in the array. If STATIC_STORAGE_P is
143 TRUE, initializers are only generated for entities for which
1cb8292f 144 zero-initialization does not simply mean filling the storage with
e33eba75
JJ
145 zero bytes. FIELD_SIZE, if non-NULL, is the bit size of the field,
146 subfields with bit positions at or above that bit size shouldn't
a8c1d899
JM
147 be added. Note that this only works when the result is assigned
148 to a base COMPONENT_REF; if we only have a pointer to the base subobject,
149 expand_assignment will end up clearing the full size of TYPE. */
94e6e4c4 150
e33eba75
JJ
151static tree
152build_zero_init_1 (tree type, tree nelts, bool static_storage_p,
153 tree field_size)
94e6e4c4 154{
17bbb839
MM
155 tree init = NULL_TREE;
156
157 /* [dcl.init]
158
0fcedd9c 159 To zero-initialize an object of type T means:
17bbb839
MM
160
161 -- if T is a scalar type, the storage is set to the value of zero
0cbd7506 162 converted to T.
17bbb839 163
d20b7173 164 -- if T is a non-union class type, the storage for each non-static
0cbd7506 165 data member and each base-class subobject is zero-initialized.
17bbb839
MM
166
167 -- if T is a union type, the storage for its first data member is
0cbd7506 168 zero-initialized.
17bbb839
MM
169
170 -- if T is an array type, the storage for each element is
0cbd7506 171 zero-initialized.
17bbb839
MM
172
173 -- if T is a reference type, no initialization is performed. */
94e6e4c4 174
50bc768d 175 gcc_assert (nelts == NULL_TREE || TREE_CODE (nelts) == INTEGER_CST);
7a1d37e9 176
17bbb839
MM
177 if (type == error_mark_node)
178 ;
179 else if (static_storage_p && zero_init_p (type))
180 /* In order to save space, we do not explicitly build initializers
181 for items that do not need them. GCC's semantics are that
182 items with static storage duration that are not otherwise
183 initialized are initialized to zero. */
184 ;
b2b1ea34 185 else if (TYPE_PTR_OR_PTRMEM_P (type))
cda0a029 186 init = fold (convert (type, nullptr_node));
b2b1ea34
JJ
187 else if (NULLPTR_TYPE_P (type))
188 init = build_int_cst (type, 0);
b8063b29 189 else if (SCALAR_TYPE_P (type))
550880a3 190 init = build_zero_cst (type);
5621a5d7 191 else if (RECORD_OR_UNION_CODE_P (TREE_CODE (type)))
17bbb839
MM
192 {
193 tree field;
9771b263 194 vec<constructor_elt, va_gc> *v = NULL;
17bbb839 195
17bbb839 196 /* Iterate over the fields, building initializations. */
910ad8de 197 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
17bbb839
MM
198 {
199 if (TREE_CODE (field) != FIELD_DECL)
200 continue;
201
7614d42c
JJ
202 if (TREE_TYPE (field) == error_mark_node)
203 continue;
204
e33eba75
JJ
205 /* Don't add virtual bases for base classes if they are beyond
206 the size of the current field, that means it is present
207 somewhere else in the object. */
208 if (field_size)
209 {
210 tree bitpos = bit_position (field);
211 if (TREE_CODE (bitpos) == INTEGER_CST
212 && !tree_int_cst_lt (bitpos, field_size))
213 continue;
214 }
215
17bbb839
MM
216 /* Note that for class types there will be FIELD_DECLs
217 corresponding to base classes as well. Thus, iterating
218 over TYPE_FIELDs will result in correct initialization of
219 all of the subobjects. */
32a11c08 220 if (!static_storage_p || !zero_init_p (TREE_TYPE (field)))
4038c495 221 {
e33eba75
JJ
222 tree new_field_size
223 = (DECL_FIELD_IS_BASE (field)
224 && DECL_SIZE (field)
225 && TREE_CODE (DECL_SIZE (field)) == INTEGER_CST)
226 ? DECL_SIZE (field) : NULL_TREE;
227 tree value = build_zero_init_1 (TREE_TYPE (field),
228 /*nelts=*/NULL_TREE,
229 static_storage_p,
230 new_field_size);
b43d1bde
PC
231 if (value)
232 CONSTRUCTOR_APPEND_ELT(v, field, value);
4038c495 233 }
17bbb839
MM
234
235 /* For unions, only the first field is initialized. */
236 if (TREE_CODE (type) == UNION_TYPE)
237 break;
238 }
4038c495 239
0fcedd9c
JM
240 /* Build a constructor to contain the initializations. */
241 init = build_constructor (type, v);
17bbb839
MM
242 }
243 else if (TREE_CODE (type) == ARRAY_TYPE)
94e6e4c4 244 {
17bbb839 245 tree max_index;
9771b263 246 vec<constructor_elt, va_gc> *v = NULL;
17bbb839 247
17bbb839 248 /* Iterate over the array elements, building initializations. */
6b6c8106 249 if (nelts)
2dcdd15d
JJ
250 max_index = fold_build2_loc (input_location, MINUS_EXPR,
251 TREE_TYPE (nelts), nelts,
252 build_one_cst (TREE_TYPE (nelts)));
253 /* Treat flexible array members like [0] arrays. */
254 else if (TYPE_DOMAIN (type) == NULL_TREE)
7768cadb 255 return NULL_TREE;
6b6c8106
SB
256 else
257 max_index = array_type_nelts (type);
9bdb04a2
AP
258
259 /* If we have an error_mark here, we should just return error mark
260 as we don't know the size of the array yet. */
261 if (max_index == error_mark_node)
262 return error_mark_node;
50bc768d 263 gcc_assert (TREE_CODE (max_index) == INTEGER_CST);
7a1d37e9 264
a8e6c82a
MM
265 /* A zero-sized array, which is accepted as an extension, will
266 have an upper bound of -1. */
2dcdd15d 267 if (!integer_minus_onep (max_index))
94763647 268 {
f32682ca 269 constructor_elt ce;
4038c495 270
b01f0d13 271 /* If this is a one element array, we just use a regular init. */
2dcdd15d 272 if (integer_zerop (max_index))
f32682ca 273 ce.index = size_zero_node;
b01f0d13 274 else
f32682ca 275 ce.index = build2 (RANGE_EXPR, sizetype, size_zero_node,
2dcdd15d 276 max_index);
c8094d83 277
2dcdd15d
JJ
278 ce.value = build_zero_init_1 (TREE_TYPE (type), /*nelts=*/NULL_TREE,
279 static_storage_p, NULL_TREE);
f11c7048
JJ
280 if (ce.value)
281 {
282 vec_alloc (v, 1);
283 v->quick_push (ce);
284 }
94763647 285 }
c8094d83 286
4038c495
GB
287 /* Build a constructor to contain the initializations. */
288 init = build_constructor (type, v);
94e6e4c4 289 }
b55b02ea 290 else if (VECTOR_TYPE_P (type))
e8160c9a 291 init = build_zero_cst (type);
94e6e4c4 292 else
a9ed1829 293 gcc_assert (TYPE_REF_P (type));
94e6e4c4 294
17bbb839
MM
295 /* In all cases, the initializer is a constant. */
296 if (init)
51eed280 297 TREE_CONSTANT (init) = 1;
94e6e4c4
AO
298
299 return init;
300}
301
e33eba75
JJ
302/* Return an expression for the zero-initialization of an object with
303 type T. This expression will either be a constant (in the case
304 that T is a scalar), or a CONSTRUCTOR (in the case that T is an
305 aggregate), or NULL (in the case that T does not require
306 initialization). In either case, the value can be used as
307 DECL_INITIAL for a decl of the indicated TYPE; it is a valid static
308 initializer. If NELTS is non-NULL, and TYPE is an ARRAY_TYPE, NELTS
309 is the number of elements in the array. If STATIC_STORAGE_P is
310 TRUE, initializers are only generated for entities for which
311 zero-initialization does not simply mean filling the storage with
312 zero bytes. */
313
314tree
315build_zero_init (tree type, tree nelts, bool static_storage_p)
316{
317 return build_zero_init_1 (type, nelts, static_storage_p, NULL_TREE);
318}
319
0fcedd9c 320/* Return a suitable initializer for value-initializing an object of type
8f540f06 321 TYPE, as described in [dcl.init]. */
0fcedd9c 322
8f540f06 323tree
309714d4 324build_value_init (tree type, tsubst_flags_t complain)
0fcedd9c
JM
325{
326 /* [dcl.init]
327
328 To value-initialize an object of type T means:
329
eca7fc57
JM
330 - if T is a class type (clause 9) with either no default constructor
331 (12.1) or a default constructor that is user-provided or deleted,
026c3cfd 332 then the object is default-initialized;
0fcedd9c 333
eca7fc57
JM
334 - if T is a (possibly cv-qualified) class type without a user-provided
335 or deleted default constructor, then the object is zero-initialized
336 and the semantic constraints for default-initialization are checked,
337 and if T has a non-trivial default constructor, the object is
338 default-initialized;
0fcedd9c
JM
339
340 - if T is an array type, then each element is value-initialized;
341
342 - otherwise, the object is zero-initialized.
343
344 A program that calls for default-initialization or
eca7fc57 345 value-initialization of an entity of reference type is ill-formed. */
0fcedd9c 346
95d7bdaa 347 /* The AGGR_INIT_EXPR tweaking below breaks in templates. */
14b1860e
JJ
348 gcc_assert (!processing_template_decl
349 || (SCALAR_TYPE_P (type) || TREE_CODE (type) == ARRAY_TYPE));
95d7bdaa 350
f968ef9b 351 if (CLASS_TYPE_P (type) && type_build_ctor_call (type))
0fcedd9c 352 {
f968ef9b
JJ
353 tree ctor
354 = build_special_member_call (NULL_TREE, complete_ctor_identifier,
355 NULL, type, LOOKUP_NORMAL, complain);
356 if (ctor == error_mark_node || TREE_CONSTANT (ctor))
a710f1f8
JM
357 return ctor;
358 tree fn = NULL_TREE;
359 if (TREE_CODE (ctor) == CALL_EXPR)
360 fn = get_callee_fndecl (ctor);
361 ctor = build_aggr_init_expr (type, ctor);
362 if (fn && user_provided_p (fn))
eca7fc57 363 return ctor;
7b37a0c5 364 else if (TYPE_HAS_COMPLEX_DFLT (type))
8f540f06
JM
365 {
366 /* This is a class that needs constructing, but doesn't have
367 a user-provided constructor. So we need to zero-initialize
368 the object and then call the implicitly defined ctor.
450a927a 369 This will be handled in simplify_aggr_init_expr. */
eca7fc57 370 AGGR_INIT_ZERO_FIRST (ctor) = 1;
8f540f06
JM
371 return ctor;
372 }
fd97a96a 373 }
eca7fc57
JM
374
375 /* Discard any access checking during subobject initialization;
376 the checks are implied by the call to the ctor which we have
377 verified is OK (cpp0x/defaulted46.C). */
378 push_deferring_access_checks (dk_deferred);
379 tree r = build_value_init_noctor (type, complain);
380 pop_deferring_access_checks ();
381 return r;
fd97a96a
JM
382}
383
384/* Like build_value_init, but don't call the constructor for TYPE. Used
385 for base initializers. */
386
387tree
309714d4 388build_value_init_noctor (tree type, tsubst_flags_t complain)
fd97a96a 389{
46a76d4b
JM
390 if (!COMPLETE_TYPE_P (type))
391 {
392 if (complain & tf_error)
393 error ("value-initialization of incomplete type %qT", type);
394 return error_mark_node;
395 }
4ddd8a74
JM
396 /* FIXME the class and array cases should just use digest_init once it is
397 SFINAE-enabled. */
fd97a96a
JM
398 if (CLASS_TYPE_P (type))
399 {
12185846
PC
400 gcc_assert (!TYPE_HAS_COMPLEX_DFLT (type)
401 || errorcount != 0);
fd97a96a
JM
402
403 if (TREE_CODE (type) != UNION_TYPE)
0fcedd9c 404 {
8f540f06 405 tree field;
9771b263 406 vec<constructor_elt, va_gc> *v = NULL;
0fcedd9c
JM
407
408 /* Iterate over the fields, building initializations. */
910ad8de 409 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
0fcedd9c
JM
410 {
411 tree ftype, value;
412
413 if (TREE_CODE (field) != FIELD_DECL)
414 continue;
415
416 ftype = TREE_TYPE (field);
417
a95aef3c
PC
418 if (ftype == error_mark_node)
419 continue;
420
71b6cb2b
JJ
421 /* Ignore flexible array members for value initialization. */
422 if (TREE_CODE (ftype) == ARRAY_TYPE
423 && !COMPLETE_TYPE_P (ftype)
424 && !TYPE_DOMAIN (ftype)
425 && COMPLETE_TYPE_P (TREE_TYPE (ftype))
426 && (next_initializable_field (DECL_CHAIN (field))
427 == NULL_TREE))
428 continue;
429
0fcedd9c
JM
430 /* We could skip vfields and fields of types with
431 user-defined constructors, but I think that won't improve
432 performance at all; it should be simpler in general just
433 to zero out the entire object than try to only zero the
434 bits that actually need it. */
435
436 /* Note that for class types there will be FIELD_DECLs
437 corresponding to base classes as well. Thus, iterating
438 over TYPE_FIELDs will result in correct initialization of
439 all of the subobjects. */
309714d4 440 value = build_value_init (ftype, complain);
c0014b07 441 value = maybe_constant_init (value);
0fcedd9c 442
351ccf20
JM
443 if (value == error_mark_node)
444 return error_mark_node;
445
c0014b07
JM
446 CONSTRUCTOR_APPEND_ELT(v, field, value);
447
448 /* We shouldn't have gotten here for anything that would need
449 non-trivial initialization, and gimplify_init_ctor_preeval
450 would need to be fixed to allow it. */
451 gcc_assert (TREE_CODE (value) != TARGET_EXPR
452 && TREE_CODE (value) != AGGR_INIT_EXPR);
0fcedd9c
JM
453 }
454
455 /* Build a constructor to contain the zero- initializations. */
8f540f06 456 return build_constructor (type, v);
0fcedd9c
JM
457 }
458 }
459 else if (TREE_CODE (type) == ARRAY_TYPE)
460 {
9771b263 461 vec<constructor_elt, va_gc> *v = NULL;
0fcedd9c
JM
462
463 /* Iterate over the array elements, building initializations. */
464 tree max_index = array_type_nelts (type);
465
466 /* If we have an error_mark here, we should just return error mark
467 as we don't know the size of the array yet. */
468 if (max_index == error_mark_node)
462aa169 469 {
e2a009c7
JM
470 if (complain & tf_error)
471 error ("cannot value-initialize array of unknown bound %qT",
472 type);
462aa169
JM
473 return error_mark_node;
474 }
0fcedd9c
JM
475 gcc_assert (TREE_CODE (max_index) == INTEGER_CST);
476
477 /* A zero-sized array, which is accepted as an extension, will
478 have an upper bound of -1. */
479 if (!tree_int_cst_equal (max_index, integer_minus_one_node))
480 {
f32682ca 481 constructor_elt ce;
0fcedd9c 482
0fcedd9c
JM
483 /* If this is a one element array, we just use a regular init. */
484 if (tree_int_cst_equal (size_zero_node, max_index))
f32682ca 485 ce.index = size_zero_node;
0fcedd9c 486 else
f32682ca 487 ce.index = build2 (RANGE_EXPR, sizetype, size_zero_node, max_index);
0fcedd9c 488
f32682ca 489 ce.value = build_value_init (TREE_TYPE (type), complain);
c0014b07
JM
490 ce.value = maybe_constant_init (ce.value);
491 if (ce.value == error_mark_node)
492 return error_mark_node;
9dbd4406 493
c0014b07
JM
494 vec_alloc (v, 1);
495 v->quick_push (ce);
351ccf20 496
c0014b07
JM
497 /* We shouldn't have gotten here for anything that would need
498 non-trivial initialization, and gimplify_init_ctor_preeval
499 would need to be fixed to allow it. */
500 gcc_assert (TREE_CODE (ce.value) != TARGET_EXPR
501 && TREE_CODE (ce.value) != AGGR_INIT_EXPR);
0fcedd9c
JM
502 }
503
504 /* Build a constructor to contain the initializations. */
505 return build_constructor (type, v);
506 }
2b8497cd
JM
507 else if (TREE_CODE (type) == FUNCTION_TYPE)
508 {
509 if (complain & tf_error)
510 error ("value-initialization of function type %qT", type);
511 return error_mark_node;
512 }
9f613f06 513 else if (TYPE_REF_P (type))
351ccf20
JM
514 {
515 if (complain & tf_error)
516 error ("value-initialization of reference type %qT", type);
517 return error_mark_node;
518 }
0fcedd9c
JM
519
520 return build_zero_init (type, NULL_TREE, /*static_storage_p=*/false);
521}
522
238e471c
VV
523/* Initialize current class with INIT, a TREE_LIST of
524 arguments for a target constructor. If TREE_LIST is void_type_node,
525 an empty initializer list was given. */
526
527static void
528perform_target_ctor (tree init)
529{
530 tree decl = current_class_ref;
531 tree type = current_class_type;
532
a624d5fe
PC
533 finish_expr_stmt (build_aggr_init (decl, init,
534 LOOKUP_NORMAL|LOOKUP_DELEGATING_CONS,
535 tf_warning_or_error));
eca7fc57 536 if (type_build_dtor_call (type))
238e471c 537 {
04e4997a
PC
538 tree expr = build_delete (input_location,
539 type, decl, sfk_complete_destructor,
238e471c
VV
540 LOOKUP_NORMAL
541 |LOOKUP_NONVIRTUAL
542 |LOOKUP_DESTRUCTOR,
543 0, tf_warning_or_error);
eca7fc57
JM
544 if (expr != error_mark_node
545 && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type))
238e471c
VV
546 finish_eh_cleanup (expr);
547 }
548}
549
b15ea309
JM
550/* Return the non-static data initializer for FIELD_DECL MEMBER. */
551
df418f1d 552static GTY((cache)) decl_tree_cache_map *nsdmi_inst;
12659e10 553
b15ea309 554tree
9fb82e65 555get_nsdmi (tree member, bool in_ctor, tsubst_flags_t complain)
b15ea309
JM
556{
557 tree init;
558 tree save_ccp = current_class_ptr;
559 tree save_ccr = current_class_ref;
04eca83e 560
b15ea309 561 if (DECL_LANG_SPECIFIC (member) && DECL_TEMPLATE_INFO (member))
f4cd9c51 562 {
04eca83e 563 init = DECL_INITIAL (DECL_TI_TEMPLATE (member));
12659e10 564 location_t expr_loc
6bdfada4 565 = cp_expr_loc_or_loc (init, DECL_SOURCE_LOCATION (member));
7b49e3da 566 if (TREE_CODE (init) == DEFERRED_PARSE)
9fb82e65 567 /* Unparsed. */;
c89844e5 568 else if (tree *slot = hash_map_safe_get (nsdmi_inst, member))
12659e10 569 init = *slot;
04eca83e 570 /* Check recursive instantiation. */
9fb82e65 571 else if (DECL_INSTANTIATING_NSDMI_P (member))
04eca83e 572 {
9fb82e65 573 if (complain & tf_error)
12659e10
JM
574 error_at (expr_loc, "recursive instantiation of default member "
575 "initializer for %qD", member);
04eca83e
NS
576 init = error_mark_node;
577 }
578 else
579 {
16e723e6 580 cp_evaluated ev;
12659e10
JM
581
582 location_t sloc = input_location;
583 input_location = expr_loc;
584
04eca83e 585 DECL_INSTANTIATING_NSDMI_P (member) = 1;
9fb82e65 586
298434c9 587 bool pushed = false;
82d5dece
JM
588 tree ctx = DECL_CONTEXT (member);
589 if (!currently_open_class (ctx)
590 && !LOCAL_CLASS_P (ctx))
298434c9
JM
591 {
592 push_to_top_level ();
82d5dece 593 push_nested_class (ctx);
de03b82f 594 push_deferring_access_checks (dk_no_deferred);
298434c9
JM
595 pushed = true;
596 }
597
598 gcc_checking_assert (!processing_template_decl);
599
82d5dece 600 inject_this_parameter (ctx, TYPE_UNQUALIFIED);
12659e10 601
f44a8dd5
JM
602 start_lambda_scope (member);
603
04eca83e
NS
604 /* Do deferred instantiation of the NSDMI. */
605 init = (tsubst_copy_and_build
606 (init, DECL_TI_ARGS (member),
9fb82e65 607 complain, member, /*function_p=*/false,
04eca83e 608 /*integral_constant_expression_p=*/false));
9fb82e65 609 init = digest_nsdmi_init (member, init, complain);
f44a8dd5
JM
610
611 finish_lambda_scope ();
612
04eca83e 613 DECL_INSTANTIATING_NSDMI_P (member) = 0;
12659e10
JM
614
615 if (init != error_mark_node)
c89844e5 616 hash_map_safe_put<hm_ggc> (nsdmi_inst, member, init);
12659e10 617
298434c9
JM
618 if (pushed)
619 {
de03b82f 620 pop_deferring_access_checks ();
298434c9
JM
621 pop_nested_class ();
622 pop_from_top_level ();
623 }
624
12659e10 625 input_location = sloc;
04eca83e 626 }
f4cd9c51 627 }
b15ea309 628 else
9fb82e65
JM
629 init = DECL_INITIAL (member);
630
7b49e3da 631 if (init && TREE_CODE (init) == DEFERRED_PARSE)
b15ea309 632 {
9fb82e65 633 if (complain & tf_error)
b15ea309 634 {
9fb82e65
JM
635 error ("default member initializer for %qD required before the end "
636 "of its enclosing class", member);
637 inform (location_of (init), "defined here");
b15ea309 638 DECL_INITIAL (member) = error_mark_node;
b15ea309 639 }
9fb82e65 640 init = error_mark_node;
b15ea309 641 }
9fb82e65 642
12659e10
JM
643 if (in_ctor)
644 {
645 current_class_ptr = save_ccp;
646 current_class_ref = save_ccr;
647 }
648 else
649 {
650 /* Use a PLACEHOLDER_EXPR when we don't have a 'this' parameter to
651 refer to; constexpr evaluation knows what to do with it. */
652 current_class_ref = build0 (PLACEHOLDER_EXPR, DECL_CONTEXT (member));
653 current_class_ptr = build_address (current_class_ref);
654 }
655
9fb82e65
JM
656 /* Strip redundant TARGET_EXPR so we don't need to remap it, and
657 so the aggregate init code below will see a CONSTRUCTOR. */
658 bool simple_target = (init && SIMPLE_TARGET_EXPR_P (init));
659 if (simple_target)
660 init = TARGET_EXPR_INITIAL (init);
45d14461 661 init = break_out_target_exprs (init, /*loc*/true);
801f5b96
JM
662 if (in_ctor && init && TREE_CODE (init) == TARGET_EXPR)
663 /* This expresses the full initialization, prevent perform_member_init from
664 calling another constructor (58162). */
665 TARGET_EXPR_DIRECT_INIT_P (init) = true;
9fb82e65
JM
666 if (simple_target && TREE_CODE (init) != CONSTRUCTOR)
667 /* Now put it back so C++17 copy elision works. */
668 init = get_target_expr (init);
669
b15ea309
JM
670 current_class_ptr = save_ccp;
671 current_class_ref = save_ccr;
672 return init;
673}
674
945c17d8
MS
675/* Diagnose the flexible array MEMBER if its INITializer is non-null
676 and return true if so. Otherwise return false. */
677
a232a1cb 678bool
945c17d8
MS
679maybe_reject_flexarray_init (tree member, tree init)
680{
681 tree type = TREE_TYPE (member);
682
683 if (!init
684 || TREE_CODE (type) != ARRAY_TYPE
685 || TYPE_DOMAIN (type))
686 return false;
687
688 /* Point at the flexible array member declaration if it's initialized
689 in-class, and at the ctor if it's initialized in a ctor member
690 initializer list. */
691 location_t loc;
692 if (DECL_INITIAL (member) == init
a232a1cb 693 || !current_function_decl
945c17d8
MS
694 || DECL_DEFAULTED_FN (current_function_decl))
695 loc = DECL_SOURCE_LOCATION (member);
696 else
697 loc = DECL_SOURCE_LOCATION (current_function_decl);
698
699 error_at (loc, "initializer for flexible array member %q#D", member);
700 return true;
701}
702
04eb9c55
JM
703/* If INIT's value can come from a call to std::initializer_list<T>::begin,
704 return that function. Otherwise, NULL_TREE. */
705
706static tree
707find_list_begin (tree init)
708{
709 STRIP_NOPS (init);
710 while (TREE_CODE (init) == COMPOUND_EXPR)
711 init = TREE_OPERAND (init, 1);
712 STRIP_NOPS (init);
713 if (TREE_CODE (init) == COND_EXPR)
714 {
715 tree left = TREE_OPERAND (init, 1);
716 if (!left)
717 left = TREE_OPERAND (init, 0);
718 left = find_list_begin (left);
719 if (left)
720 return left;
721 return find_list_begin (TREE_OPERAND (init, 2));
722 }
723 if (TREE_CODE (init) == CALL_EXPR)
724 if (tree fn = get_callee_fndecl (init))
725 if (id_equal (DECL_NAME (fn), "begin")
726 && is_std_init_list (DECL_CONTEXT (fn)))
727 return fn;
728 return NULL_TREE;
729}
730
731/* If INIT initializing MEMBER is copying the address of the underlying array
732 of an initializer_list, warn. */
733
734static void
735maybe_warn_list_ctor (tree member, tree init)
736{
737 tree memtype = TREE_TYPE (member);
738 if (!init || !TYPE_PTR_P (memtype)
739 || !is_list_ctor (current_function_decl))
740 return;
741
742 tree parms = FUNCTION_FIRST_USER_PARMTYPE (current_function_decl);
743 tree initlist = non_reference (TREE_VALUE (parms));
744 tree targs = CLASSTYPE_TI_ARGS (initlist);
745 tree elttype = TREE_VEC_ELT (targs, 0);
746
747 if (!same_type_ignoring_top_level_qualifiers_p
748 (TREE_TYPE (memtype), elttype))
749 return;
750
751 tree begin = find_list_begin (init);
752 if (!begin)
753 return;
754
f9d0ca40 755 location_t loc = cp_expr_loc_or_input_loc (init);
04eb9c55
JM
756 warning_at (loc, OPT_Winit_list_lifetime,
757 "initializing %qD from %qE does not extend the lifetime "
758 "of the underlying array", member, begin);
759}
760
2282d28d
MM
761/* Initialize MEMBER, a FIELD_DECL, with INIT, a TREE_LIST of
762 arguments. If TREE_LIST is void_type_node, an empty initializer
763 list was given; if NULL_TREE no initializer was given. */
e92cc029 764
8d08fdba 765static void
2282d28d 766perform_member_init (tree member, tree init)
8d08fdba
MS
767{
768 tree decl;
769 tree type = TREE_TYPE (member);
2282d28d 770
0e5f8a59
JM
771 /* Use the non-static data member initializer if there was no
772 mem-initializer for this field. */
773 if (init == NULL_TREE)
9fb82e65 774 init = get_nsdmi (member, /*ctor*/true, tf_warning_or_error);
0e5f8a59 775
a9eba00e
PC
776 if (init == error_mark_node)
777 return;
778
2282d28d
MM
779 /* Effective C++ rule 12 requires that all data members be
780 initialized. */
9dbd4406 781 if (warn_ecpp && init == NULL_TREE && TREE_CODE (type) != ARRAY_TYPE)
c5d75364
MLI
782 warning_at (DECL_SOURCE_LOCATION (current_function_decl), OPT_Weffc__,
783 "%qD should be initialized in the member initialization list",
784 member);
2282d28d 785
2282d28d 786 /* Get an lvalue for the data member. */
50ad9642
MM
787 decl = build_class_member_access_expr (current_class_ref, member,
788 /*access_path=*/NULL_TREE,
5ade1ed2
DG
789 /*preserve_reference=*/true,
790 tf_warning_or_error);
2fbfe9b8
MS
791 if (decl == error_mark_node)
792 return;
793
c11e39b0
JW
794 if (warn_init_self && init && TREE_CODE (init) == TREE_LIST
795 && TREE_CHAIN (init) == NULL_TREE)
796 {
797 tree val = TREE_VALUE (init);
0aa359c1
PC
798 /* Handle references. */
799 if (REFERENCE_REF_P (val))
800 val = TREE_OPERAND (val, 0);
c11e39b0
JW
801 if (TREE_CODE (val) == COMPONENT_REF && TREE_OPERAND (val, 1) == member
802 && TREE_OPERAND (val, 0) == current_class_ref)
803 warning_at (DECL_SOURCE_LOCATION (current_function_decl),
0ccb505d 804 OPT_Winit_self, "%qD is initialized with itself",
c11e39b0
JW
805 member);
806 }
807
59dbb04d
JM
808 if (array_of_unknown_bound_p (type))
809 {
810 maybe_reject_flexarray_init (member, init);
811 return;
812 }
a1c9c9ff 813
753b4679
MP
814 if (init && TREE_CODE (init) == TREE_LIST)
815 {
816 /* A(): a{e} */
817 if (DIRECT_LIST_INIT_P (TREE_VALUE (init)))
818 init = build_x_compound_expr_from_list (init, ELK_MEM_INIT,
819 tf_warning_or_error);
820 /* We are trying to initialize an array from a ()-list. If we
821 should attempt to do so, conjure up a CONSTRUCTOR. */
822 else if (TREE_CODE (type) == ARRAY_TYPE
823 /* P0960 is a C++20 feature. */
824 && cxx_dialect >= cxx20)
825 init = do_aggregate_paren_init (init, type);
826 else if (!CLASS_TYPE_P (type))
827 init = build_x_compound_expr_from_list (init, ELK_MEM_INIT,
828 tf_warning_or_error);
829 /* If we're initializing a class from a ()-list, leave the TREE_LIST
830 alone: we might call an appropriate constructor, or (in C++20)
831 do aggregate-initialization. */
832 }
a1c9c9ff 833
9dbd4406
JM
834 if (init == void_type_node)
835 {
836 /* mem() means value-initialization. */
837 if (TREE_CODE (type) == ARRAY_TYPE)
0f737a30 838 {
9c69dcea 839 init = build_vec_init_expr (type, init, tf_warning_or_error);
4de2f020 840 init = build2 (INIT_EXPR, type, decl, init);
0f737a30
JJ
841 finish_expr_stmt (init);
842 }
9dbd4406
JM
843 else
844 {
48e5d119
PC
845 tree value = build_value_init (type, tf_warning_or_error);
846 if (value == error_mark_node)
847 return;
848 init = build2 (INIT_EXPR, type, decl, value);
351ccf20 849 finish_expr_stmt (init);
9dbd4406 850 }
9dbd4406 851 }
6bdb8141
JM
852 /* Deal with this here, as we will get confused if we try to call the
853 assignment op for an anonymous union. This can happen in a
854 synthesized copy constructor. */
9dbd4406 855 else if (ANON_AGGR_TYPE_P (type))
6bdb8141 856 {
ff9f1a5d
MM
857 if (init)
858 {
f293ce4b 859 init = build2 (INIT_EXPR, type, decl, TREE_VALUE (init));
ff9f1a5d
MM
860 finish_expr_stmt (init);
861 }
6bdb8141 862 }
e2df21bf 863 else if (init
9f613f06 864 && (TYPE_REF_P (type)
a1c9c9ff 865 || (TREE_CODE (init) == CONSTRUCTOR
e2df21bf
JM
866 && (CP_AGGREGATE_TYPE_P (type)
867 || is_std_init_list (type)))))
868 {
869 /* With references and list-initialization, we need to deal with
870 extending temporary lifetimes. 12.2p5: "A temporary bound to a
871 reference member in a constructor’s ctor-initializer (12.6.2)
872 persists until the constructor exits." */
873 unsigned i; tree t;
cd9cf97b 874 releasing_vec cleanups;
a1c9c9ff 875 if (!same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (init), type))
4794d4b5
JM
876 {
877 if (BRACE_ENCLOSED_INITIALIZER_P (init)
878 && CP_AGGREGATE_TYPE_P (type))
879 init = reshape_init (type, init, tf_warning_or_error);
880 init = digest_init (type, init, tf_warning_or_error);
881 }
e2df21bf
JM
882 if (init == error_mark_node)
883 return;
a4dfd0f0 884 if (is_empty_field (member)
6876b269
JM
885 && !TREE_SIDE_EFFECTS (init))
886 /* Don't add trivial initialization of an empty base/field, as they
887 might not be ordered the way the back-end expects. */
888 return;
f3fae478
JM
889 /* A FIELD_DECL doesn't really have a suitable lifetime, but
890 make_temporary_var_for_ref_to_temp will treat it as automatic and
891 set_up_extended_ref_temp wants to use the decl in a warning. */
2c6f7927 892 init = extend_ref_init_temps (member, init, &cleanups);
e2df21bf
JM
893 if (TREE_CODE (type) == ARRAY_TYPE
894 && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (type)))
895 init = build_vec_init_expr (type, init, tf_warning_or_error);
896 init = build2 (INIT_EXPR, type, decl, init);
897 finish_expr_stmt (init);
9771b263 898 FOR_EACH_VEC_ELT (*cleanups, i, t)
e2df21bf 899 push_cleanup (decl, t, false);
e2df21bf 900 }
a0348261
JM
901 else if (type_build_ctor_call (type)
902 || (init && CLASS_TYPE_P (strip_array_types (type))))
8d08fdba 903 {
534ecb17 904 if (TREE_CODE (type) == ARRAY_TYPE)
8d08fdba 905 {
534ecb17
JM
906 if (init == NULL_TREE
907 || same_type_ignoring_top_level_qualifiers_p (type,
908 TREE_TYPE (init)))
909 {
7e9a3ad3
MS
910 if (TYPE_DOMAIN (type) && TYPE_MAX_VALUE (TYPE_DOMAIN (type)))
911 {
912 /* Initialize the array only if it's not a flexible
913 array member (i.e., if it has an upper bound). */
914 init = build_vec_init_expr (type, init, tf_warning_or_error);
915 init = build2 (INIT_EXPR, type, decl, init);
916 finish_expr_stmt (init);
917 }
534ecb17
JM
918 }
919 else
920 error ("invalid initializer for array member %q#D", member);
8d08fdba
MS
921 }
922 else
b87d79e6 923 {
b8bf6ad9
JM
924 int flags = LOOKUP_NORMAL;
925 if (DECL_DEFAULTED_FN (current_function_decl))
926 flags |= LOOKUP_DEFAULTED;
b87d79e6
JM
927 if (CP_TYPE_CONST_P (type)
928 && init == NULL_TREE
6132bdd7 929 && default_init_uninitialized_part (type))
0df9da03
FC
930 {
931 /* TYPE_NEEDS_CONSTRUCTING can be set just because we have a
932 vtable; still give this diagnostic. */
097f82ec 933 auto_diagnostic_group d;
0df9da03
FC
934 if (permerror (DECL_SOURCE_LOCATION (current_function_decl),
935 "uninitialized const member in %q#T", type))
936 inform (DECL_SOURCE_LOCATION (member),
937 "%q#D should be initialized", member );
938 }
b8bf6ad9 939 finish_expr_stmt (build_aggr_init (decl, init, flags,
b87d79e6
JM
940 tf_warning_or_error));
941 }
8d08fdba
MS
942 }
943 else
944 {
945 if (init == NULL_TREE)
946 {
31d1acec 947 tree core_type;
8d08fdba 948 /* member traversal: note it leaves init NULL */
9f613f06 949 if (TYPE_REF_P (type))
0df9da03 950 {
097f82ec 951 auto_diagnostic_group d;
0df9da03
FC
952 if (permerror (DECL_SOURCE_LOCATION (current_function_decl),
953 "uninitialized reference member in %q#T", type))
954 inform (DECL_SOURCE_LOCATION (member),
955 "%q#D should be initialized", member);
956 }
58ec3cc5 957 else if (CP_TYPE_CONST_P (type))
0df9da03 958 {
097f82ec 959 auto_diagnostic_group d;
0df9da03
FC
960 if (permerror (DECL_SOURCE_LOCATION (current_function_decl),
961 "uninitialized const member in %q#T", type))
962 inform (DECL_SOURCE_LOCATION (member),
963 "%q#D should be initialized", member );
964 }
31d1acec 965
69f36ba6
JM
966 core_type = strip_array_types (type);
967
012e6a1e
JM
968 if (CLASS_TYPE_P (core_type)
969 && (CLASSTYPE_READONLY_FIELDS_NEED_INIT (core_type)
970 || CLASSTYPE_REF_FIELDS_NEED_INIT (core_type)))
971 diagnose_uninitialized_cst_or_ref_member (core_type,
40bb78ad
FC
972 /*using_new=*/false,
973 /*complain=*/true);
8d08fdba 974 }
8d08fdba 975
04eb9c55
JM
976 maybe_warn_list_ctor (member, init);
977
a1c9c9ff 978 if (init)
4f2e1536
MP
979 finish_expr_stmt (cp_build_modify_expr (input_location, decl,
980 INIT_EXPR, init,
5ade1ed2 981 tf_warning_or_error));
8d08fdba 982 }
eb66be0e 983
eca7fc57 984 if (type_build_dtor_call (type))
b7484fbe 985 {
de22184b
MS
986 tree expr;
987
50ad9642
MM
988 expr = build_class_member_access_expr (current_class_ref, member,
989 /*access_path=*/NULL_TREE,
5ade1ed2
DG
990 /*preserve_reference=*/false,
991 tf_warning_or_error);
04e4997a
PC
992 expr = build_delete (input_location,
993 type, expr, sfk_complete_destructor,
574cfaa4
JM
994 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0,
995 tf_warning_or_error);
b7484fbe 996
eca7fc57
JM
997 if (expr != error_mark_node
998 && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type))
659e5a7a 999 finish_eh_cleanup (expr);
b7484fbe 1000 }
8d08fdba
MS
1001}
1002
ff9f1a5d
MM
1003/* Returns a TREE_LIST containing (as the TREE_PURPOSE of each node) all
1004 the FIELD_DECLs on the TYPE_FIELDS list for T, in reverse order. */
1005
c8094d83 1006static tree
a81072c7 1007build_field_list (tree t, tree list, int *uses_unions_or_anon_p)
ff9f1a5d
MM
1008{
1009 tree fields;
1010
1011 /* Note whether or not T is a union. */
1012 if (TREE_CODE (t) == UNION_TYPE)
a81072c7 1013 *uses_unions_or_anon_p = 1;
ff9f1a5d 1014
910ad8de 1015 for (fields = TYPE_FIELDS (t); fields; fields = DECL_CHAIN (fields))
ff9f1a5d 1016 {
535335bf
JM
1017 tree fieldtype;
1018
ff9f1a5d 1019 /* Skip CONST_DECLs for enumeration constants and so forth. */
17bbb839 1020 if (TREE_CODE (fields) != FIELD_DECL || DECL_ARTIFICIAL (fields))
ff9f1a5d 1021 continue;
c8094d83 1022
535335bf 1023 fieldtype = TREE_TYPE (fields);
ff9f1a5d
MM
1024
1025 /* For an anonymous struct or union, we must recursively
1026 consider the fields of the anonymous type. They can be
1027 directly initialized from the constructor. */
535335bf 1028 if (ANON_AGGR_TYPE_P (fieldtype))
ff9f1a5d
MM
1029 {
1030 /* Add this field itself. Synthesized copy constructors
1031 initialize the entire aggregate. */
1032 list = tree_cons (fields, NULL_TREE, list);
1033 /* And now add the fields in the anonymous aggregate. */
a81072c7
JM
1034 list = build_field_list (fieldtype, list, uses_unions_or_anon_p);
1035 *uses_unions_or_anon_p = 1;
ff9f1a5d
MM
1036 }
1037 /* Add this field. */
1038 else if (DECL_NAME (fields))
1039 list = tree_cons (fields, NULL_TREE, list);
1040 }
1041
1042 return list;
1043}
1044
a81072c7
JM
1045/* Return the innermost aggregate scope for FIELD, whether that is
1046 the enclosing class or an anonymous aggregate within it. */
1047
1048static tree
1049innermost_aggr_scope (tree field)
1050{
1051 if (ANON_AGGR_TYPE_P (TREE_TYPE (field)))
1052 return TREE_TYPE (field);
1053 else
1054 return DECL_CONTEXT (field);
1055}
1056
2282d28d
MM
1057/* The MEM_INITS are a TREE_LIST. The TREE_PURPOSE of each list gives
1058 a FIELD_DECL or BINFO in T that needs initialization. The
1059 TREE_VALUE gives the initializer, or list of initializer arguments.
1060
1061 Return a TREE_LIST containing all of the initializations required
1062 for T, in the order in which they should be performed. The output
1063 list has the same format as the input. */
e92cc029 1064
8d08fdba 1065static tree
2282d28d 1066sort_mem_initializers (tree t, tree mem_inits)
8d08fdba 1067{
ff9f1a5d 1068 tree init;
fa743e8c 1069 tree base, binfo, base_binfo;
2282d28d
MM
1070 tree sorted_inits;
1071 tree next_subobject;
9771b263 1072 vec<tree, va_gc> *vbases;
2282d28d 1073 int i;
a81072c7 1074 int uses_unions_or_anon_p = 0;
ff9f1a5d 1075
2282d28d
MM
1076 /* Build up a list of initializations. The TREE_PURPOSE of entry
1077 will be the subobject (a FIELD_DECL or BINFO) to initialize. The
1078 TREE_VALUE will be the constructor arguments, or NULL if no
1079 explicit initialization was provided. */
1080 sorted_inits = NULL_TREE;
c8094d83 1081
2282d28d 1082 /* Process the virtual bases. */
9ba5ff0f 1083 for (vbases = CLASSTYPE_VBASECLASSES (t), i = 0;
9771b263 1084 vec_safe_iterate (vbases, i, &base); i++)
58c42dc2 1085 sorted_inits = tree_cons (base, NULL_TREE, sorted_inits);
c8094d83 1086
2282d28d 1087 /* Process the direct bases. */
fa743e8c
NS
1088 for (binfo = TYPE_BINFO (t), i = 0;
1089 BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i)
1090 if (!BINFO_VIRTUAL_P (base_binfo))
1091 sorted_inits = tree_cons (base_binfo, NULL_TREE, sorted_inits);
1092
2282d28d 1093 /* Process the non-static data members. */
a81072c7 1094 sorted_inits = build_field_list (t, sorted_inits, &uses_unions_or_anon_p);
2282d28d
MM
1095 /* Reverse the entire list of initializations, so that they are in
1096 the order that they will actually be performed. */
1097 sorted_inits = nreverse (sorted_inits);
1098
1099 /* If the user presented the initializers in an order different from
1100 that in which they will actually occur, we issue a warning. Keep
1101 track of the next subobject which can be explicitly initialized
1102 without issuing a warning. */
1103 next_subobject = sorted_inits;
1104
1105 /* Go through the explicit initializers, filling in TREE_PURPOSE in
1106 the SORTED_INITS. */
1107 for (init = mem_inits; init; init = TREE_CHAIN (init))
1108 {
1109 tree subobject;
1110 tree subobject_init;
1111
1112 subobject = TREE_PURPOSE (init);
1113
1114 /* If the explicit initializers are in sorted order, then
c8094d83 1115 SUBOBJECT will be NEXT_SUBOBJECT, or something following
2282d28d 1116 it. */
c8094d83
MS
1117 for (subobject_init = next_subobject;
1118 subobject_init;
2282d28d
MM
1119 subobject_init = TREE_CHAIN (subobject_init))
1120 if (TREE_PURPOSE (subobject_init) == subobject)
ff9f1a5d
MM
1121 break;
1122
2282d28d 1123 /* Issue a warning if the explicit initializer order does not
2cfe82fe 1124 match that which will actually occur.
0cbd7506 1125 ??? Are all these on the correct lines? */
2282d28d 1126 if (warn_reorder && !subobject_init)
ff9f1a5d 1127 {
2282d28d 1128 if (TREE_CODE (TREE_PURPOSE (next_subobject)) == FIELD_DECL)
af718670
PC
1129 warning_at (DECL_SOURCE_LOCATION (TREE_PURPOSE (next_subobject)),
1130 OPT_Wreorder, "%qD will be initialized after",
1131 TREE_PURPOSE (next_subobject));
2282d28d 1132 else
b323323f 1133 warning (OPT_Wreorder, "base %qT will be initialized after",
2282d28d
MM
1134 TREE_PURPOSE (next_subobject));
1135 if (TREE_CODE (subobject) == FIELD_DECL)
af718670
PC
1136 warning_at (DECL_SOURCE_LOCATION (subobject),
1137 OPT_Wreorder, " %q#D", subobject);
2282d28d 1138 else
b323323f 1139 warning (OPT_Wreorder, " base %qT", subobject);
c5d75364
MLI
1140 warning_at (DECL_SOURCE_LOCATION (current_function_decl),
1141 OPT_Wreorder, " when initialized here");
ff9f1a5d 1142 }
b7484fbe 1143
2282d28d
MM
1144 /* Look again, from the beginning of the list. */
1145 if (!subobject_init)
ff9f1a5d 1146 {
2282d28d
MM
1147 subobject_init = sorted_inits;
1148 while (TREE_PURPOSE (subobject_init) != subobject)
1149 subobject_init = TREE_CHAIN (subobject_init);
ff9f1a5d 1150 }
c8094d83 1151
2282d28d
MM
1152 /* It is invalid to initialize the same subobject more than
1153 once. */
1154 if (TREE_VALUE (subobject_init))
ff9f1a5d 1155 {
2282d28d 1156 if (TREE_CODE (subobject) == FIELD_DECL)
c5d75364
MLI
1157 error_at (DECL_SOURCE_LOCATION (current_function_decl),
1158 "multiple initializations given for %qD",
1159 subobject);
2282d28d 1160 else
c5d75364
MLI
1161 error_at (DECL_SOURCE_LOCATION (current_function_decl),
1162 "multiple initializations given for base %qT",
1163 subobject);
ff9f1a5d
MM
1164 }
1165
2282d28d
MM
1166 /* Record the initialization. */
1167 TREE_VALUE (subobject_init) = TREE_VALUE (init);
843710c0
PP
1168 /* Carry over the dummy TREE_TYPE node containing the source location. */
1169 TREE_TYPE (subobject_init) = TREE_TYPE (init);
2282d28d 1170 next_subobject = subobject_init;
ff9f1a5d
MM
1171 }
1172
1173 /* [class.base.init]
b7484fbe 1174
ff9f1a5d
MM
1175 If a ctor-initializer specifies more than one mem-initializer for
1176 multiple members of the same union (including members of
57ece258
JM
1177 anonymous unions), the ctor-initializer is ill-formed.
1178
1179 Here we also splice out uninitialized union members. */
a81072c7 1180 if (uses_unions_or_anon_p)
ff9f1a5d 1181 {
3a6a88c8 1182 tree *last_p = NULL;
57ece258
JM
1183 tree *p;
1184 for (p = &sorted_inits; *p; )
8d08fdba 1185 {
ff9f1a5d 1186 tree field;
535335bf 1187 tree ctx;
ff9f1a5d 1188
57ece258
JM
1189 init = *p;
1190
1191 field = TREE_PURPOSE (init);
1192
1193 /* Skip base classes. */
1194 if (TREE_CODE (field) != FIELD_DECL)
1195 goto next;
1196
a81072c7 1197 /* If this is an anonymous aggregate with no explicit initializer,
57ece258 1198 splice it out. */
a81072c7 1199 if (!TREE_VALUE (init) && ANON_AGGR_TYPE_P (TREE_TYPE (field)))
57ece258
JM
1200 goto splice;
1201
ff9f1a5d
MM
1202 /* See if this field is a member of a union, or a member of a
1203 structure contained in a union, etc. */
a81072c7
JM
1204 ctx = innermost_aggr_scope (field);
1205
ff9f1a5d 1206 /* If this field is not a member of a union, skip it. */
a81072c7
JM
1207 if (TREE_CODE (ctx) != UNION_TYPE
1208 && !ANON_AGGR_TYPE_P (ctx))
57ece258
JM
1209 goto next;
1210
3a6a88c8
JM
1211 /* If this union member has no explicit initializer and no NSDMI,
1212 splice it out. */
1213 if (TREE_VALUE (init) || DECL_INITIAL (field))
1214 /* OK. */;
1215 else
57ece258 1216 goto splice;
8d08fdba 1217
ff9f1a5d
MM
1218 /* It's only an error if we have two initializers for the same
1219 union type. */
3a6a88c8 1220 if (!last_p)
6bdb8141 1221 {
3a6a88c8 1222 last_p = p;
57ece258 1223 goto next;
6bdb8141 1224 }
8d08fdba 1225
ff9f1a5d 1226 /* See if LAST_FIELD and the field initialized by INIT are
a81072c7
JM
1227 members of the same union (or the union itself). If so, there's
1228 a problem, unless they're actually members of the same structure
ff9f1a5d 1229 which is itself a member of a union. For example, given:
8d08fdba 1230
ff9f1a5d
MM
1231 union { struct { int i; int j; }; };
1232
1233 initializing both `i' and `j' makes sense. */
a81072c7
JM
1234 ctx = common_enclosing_class
1235 (innermost_aggr_scope (field),
1236 innermost_aggr_scope (TREE_PURPOSE (*last_p)));
3a6a88c8 1237
a81072c7
JM
1238 if (ctx && (TREE_CODE (ctx) == UNION_TYPE
1239 || ctx == TREE_TYPE (TREE_PURPOSE (*last_p))))
8d08fdba 1240 {
3a6a88c8
JM
1241 /* A mem-initializer hides an NSDMI. */
1242 if (TREE_VALUE (init) && !TREE_VALUE (*last_p))
1243 *last_p = TREE_CHAIN (*last_p);
1244 else if (TREE_VALUE (*last_p) && !TREE_VALUE (init))
1245 goto splice;
1246 else
2ef7251f
MP
1247 {
1248 error_at (DECL_SOURCE_LOCATION (current_function_decl),
1249 "initializations for multiple members of %qT",
1250 ctx);
1251 goto splice;
1252 }
8d08fdba 1253 }
ff9f1a5d 1254
3a6a88c8 1255 last_p = p;
57ece258
JM
1256
1257 next:
1258 p = &TREE_CHAIN (*p);
1259 continue;
1260 splice:
1261 *p = TREE_CHAIN (*p);
1262 continue;
b7484fbe
MS
1263 }
1264 }
8d08fdba 1265
2282d28d 1266 return sorted_inits;
b7484fbe
MS
1267}
1268
50bea0c5
JJ
1269/* Callback for cp_walk_tree to mark all PARM_DECLs in a tree as read. */
1270
1271static tree
1272mark_exp_read_r (tree *tp, int *, void *)
1273{
1274 tree t = *tp;
1275 if (TREE_CODE (t) == PARM_DECL)
1276 mark_exp_read (t);
1277 return NULL_TREE;
1278}
1279
2282d28d
MM
1280/* Initialize all bases and members of CURRENT_CLASS_TYPE. MEM_INITS
1281 is a TREE_LIST giving the explicit mem-initializer-list for the
1282 constructor. The TREE_PURPOSE of each entry is a subobject (a
1283 FIELD_DECL or a BINFO) of the CURRENT_CLASS_TYPE. The TREE_VALUE
1284 is a TREE_LIST giving the arguments to the constructor or
1285 void_type_node for an empty list of arguments. */
a9aedbc2 1286
3dbc07b6 1287void
2282d28d 1288emit_mem_initializers (tree mem_inits)
8d08fdba 1289{
b8bf6ad9
JM
1290 int flags = LOOKUP_NORMAL;
1291
72e4661a
PC
1292 /* We will already have issued an error message about the fact that
1293 the type is incomplete. */
1294 if (!COMPLETE_TYPE_P (current_class_type))
1295 return;
c8094d83 1296
238e471c
VV
1297 if (mem_inits
1298 && TYPE_P (TREE_PURPOSE (mem_inits))
1299 && same_type_p (TREE_PURPOSE (mem_inits), current_class_type))
1300 {
1301 /* Delegating constructor. */
1302 gcc_assert (TREE_CHAIN (mem_inits) == NULL_TREE);
1303 perform_target_ctor (TREE_VALUE (mem_inits));
1304 return;
1305 }
1306
85b5d65a 1307 if (DECL_DEFAULTED_FN (current_function_decl)
31f7f784 1308 && ! DECL_INHERITED_CTOR (current_function_decl))
b8bf6ad9
JM
1309 flags |= LOOKUP_DEFAULTED;
1310
2282d28d
MM
1311 /* Sort the mem-initializers into the order in which the
1312 initializations should be performed. */
1313 mem_inits = sort_mem_initializers (current_class_type, mem_inits);
8d08fdba 1314
1f5a253a 1315 in_base_initializer = 1;
c8094d83 1316
2282d28d 1317 /* Initialize base classes. */
3b616f08
PC
1318 for (; (mem_inits
1319 && TREE_CODE (TREE_PURPOSE (mem_inits)) != FIELD_DECL);
1320 mem_inits = TREE_CHAIN (mem_inits))
8d08fdba 1321 {
2282d28d
MM
1322 tree subobject = TREE_PURPOSE (mem_inits);
1323 tree arguments = TREE_VALUE (mem_inits);
1324
3b616f08
PC
1325 /* We already have issued an error message. */
1326 if (arguments == error_mark_node)
1327 continue;
1328
31f7f784
JM
1329 /* Suppress access control when calling the inherited ctor. */
1330 bool inherited_base = (DECL_INHERITED_CTOR (current_function_decl)
1331 && flag_new_inheriting_ctors
1332 && arguments);
1333 if (inherited_base)
1334 push_deferring_access_checks (dk_deferred);
1335
91ea6df3
GDR
1336 if (arguments == NULL_TREE)
1337 {
1338 /* If these initializations are taking place in a copy constructor,
1339 the base class should probably be explicitly initialized if there
1340 is a user-defined constructor in the base class (other than the
1341 default constructor, which will be called anyway). */
1342 if (extra_warnings
1343 && DECL_COPY_CONSTRUCTOR_P (current_function_decl)
1344 && type_has_user_nondefault_constructor (BINFO_TYPE (subobject)))
1345 warning_at (DECL_SOURCE_LOCATION (current_function_decl),
1346 OPT_Wextra, "base class %q#T should be explicitly "
1347 "initialized in the copy constructor",
1348 BINFO_TYPE (subobject));
91ea6df3 1349 }
2282d28d 1350
2282d28d 1351 /* Initialize the base. */
45e2bf2e 1352 if (!BINFO_VIRTUAL_P (subobject))
b7484fbe 1353 {
2282d28d 1354 tree base_addr;
c8094d83 1355
2282d28d 1356 base_addr = build_base_path (PLUS_EXPR, current_class_ptr,
a271590a 1357 subobject, 1, tf_warning_or_error);
2282d28d 1358 expand_aggr_init_1 (subobject, NULL_TREE,
04757a2a 1359 cp_build_fold_indirect_ref (base_addr),
2282d28d 1360 arguments,
b8bf6ad9 1361 flags,
5ade1ed2 1362 tf_warning_or_error);
2282d28d 1363 expand_cleanup_for_base (subobject, NULL_TREE);
8d08fdba 1364 }
45e2bf2e
NS
1365 else if (!ABSTRACT_CLASS_TYPE_P (current_class_type))
1366 /* C++14 DR1658 Means we do not have to construct vbases of
1367 abstract classes. */
1368 construct_virtual_base (subobject, arguments);
e3e9e8ca
JJ
1369 else
1370 /* When not constructing vbases of abstract classes, at least mark
1371 the arguments expressions as read to avoid
1372 -Wunused-but-set-parameter false positives. */
50bea0c5 1373 cp_walk_tree (&arguments, mark_exp_read_r, NULL, NULL);
31f7f784
JM
1374
1375 if (inherited_base)
1376 pop_deferring_access_checks ();
8d08fdba 1377 }
1f5a253a 1378 in_base_initializer = 0;
8d08fdba 1379
2282d28d 1380 /* Initialize the vptrs. */
cf2e003b 1381 initialize_vtbl_ptrs (current_class_ptr);
c8094d83 1382
2282d28d
MM
1383 /* Initialize the data members. */
1384 while (mem_inits)
8d08fdba 1385 {
843710c0
PP
1386 /* If this initializer was explicitly provided, then the dummy TREE_TYPE
1387 node contains the source location. */
1388 iloc_sentinel ils (EXPR_LOCATION (TREE_TYPE (mem_inits)));
1389
2282d28d
MM
1390 perform_member_init (TREE_PURPOSE (mem_inits),
1391 TREE_VALUE (mem_inits));
1392 mem_inits = TREE_CHAIN (mem_inits);
b7484fbe 1393 }
8d08fdba
MS
1394}
1395
3ec6bad3
MM
1396/* Returns the address of the vtable (i.e., the value that should be
1397 assigned to the vptr) for BINFO. */
1398
2077db1b 1399tree
362efdc1 1400build_vtbl_address (tree binfo)
3ec6bad3 1401{
9965d119 1402 tree binfo_for = binfo;
3ec6bad3
MM
1403 tree vtbl;
1404
fc6633e0 1405 if (BINFO_VPTR_INDEX (binfo) && BINFO_VIRTUAL_P (binfo))
9965d119
NS
1406 /* If this is a virtual primary base, then the vtable we want to store
1407 is that for the base this is being used as the primary base of. We
1408 can't simply skip the initialization, because we may be expanding the
1409 inits of a subobject constructor where the virtual base layout
1410 can be different. */
fc6633e0
NS
1411 while (BINFO_PRIMARY_P (binfo_for))
1412 binfo_for = BINFO_INHERITANCE_CHAIN (binfo_for);
9965d119 1413
3ec6bad3
MM
1414 /* Figure out what vtable BINFO's vtable is based on, and mark it as
1415 used. */
9965d119 1416 vtbl = get_vtbl_decl_for_binfo (binfo_for);
c3439626 1417 TREE_USED (vtbl) = true;
3ec6bad3
MM
1418
1419 /* Now compute the address to use when initializing the vptr. */
6de9cd9a 1420 vtbl = unshare_expr (BINFO_VTABLE (binfo_for));
5a6ccc94 1421 if (VAR_P (vtbl))
6de9cd9a 1422 vtbl = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (vtbl)), vtbl);
3ec6bad3
MM
1423
1424 return vtbl;
1425}
1426
8d08fdba
MS
1427/* This code sets up the virtual function tables appropriate for
1428 the pointer DECL. It is a one-ply initialization.
1429
1430 BINFO is the exact type that DECL is supposed to be. In
1431 multiple inheritance, this might mean "C's A" if C : A, B. */
e92cc029 1432
8926095f 1433static void
362efdc1 1434expand_virtual_init (tree binfo, tree decl)
8d08fdba 1435{
8d08fdba 1436 tree vtbl, vtbl_ptr;
3ec6bad3 1437 tree vtt_index;
8d08fdba 1438
3ec6bad3
MM
1439 /* Compute the initializer for vptr. */
1440 vtbl = build_vtbl_address (binfo);
1441
3461fba7
NS
1442 /* We may get this vptr from a VTT, if this is a subobject
1443 constructor or subobject destructor. */
3ec6bad3
MM
1444 vtt_index = BINFO_VPTR_INDEX (binfo);
1445 if (vtt_index)
1446 {
1447 tree vtbl2;
1448 tree vtt_parm;
1449
1450 /* Compute the value to use, when there's a VTT. */
e0fff4b3 1451 vtt_parm = current_vtt_parm;
5d49b6a7 1452 vtbl2 = fold_build_pointer_plus (vtt_parm, vtt_index);
04757a2a 1453 vtbl2 = cp_build_fold_indirect_ref (vtbl2);
6de9cd9a 1454 vtbl2 = convert (TREE_TYPE (vtbl), vtbl2);
3ec6bad3
MM
1455
1456 /* The actual initializer is the VTT value only in the subobject
1457 constructor. In maybe_clone_body we'll substitute NULL for
1458 the vtt_parm in the case of the non-subobject constructor. */
eb0dbdc7 1459 vtbl = build_if_in_charge (vtbl, vtbl2);
3ec6bad3 1460 }
70ae3201
MM
1461
1462 /* Compute the location of the vtpr. */
04757a2a 1463 vtbl_ptr = build_vfield_ref (cp_build_fold_indirect_ref (decl),
338d90b8 1464 TREE_TYPE (binfo));
50bc768d 1465 gcc_assert (vtbl_ptr != error_mark_node);
8d08fdba 1466
70ae3201 1467 /* Assign the vtable to the vptr. */
4b978f96 1468 vtbl = convert_force (TREE_TYPE (vtbl_ptr), vtbl, 0, tf_warning_or_error);
4f2e1536
MP
1469 finish_expr_stmt (cp_build_modify_expr (input_location, vtbl_ptr, NOP_EXPR,
1470 vtbl, tf_warning_or_error));
8d08fdba
MS
1471}
1472
f33e32a8
MM
1473/* If an exception is thrown in a constructor, those base classes already
1474 constructed must be destroyed. This function creates the cleanup
0b8a1e58 1475 for BINFO, which has just been constructed. If FLAG is non-NULL,
838dfd8a 1476 it is a DECL which is nonzero when this base needs to be
0b8a1e58 1477 destroyed. */
f33e32a8
MM
1478
1479static void
362efdc1 1480expand_cleanup_for_base (tree binfo, tree flag)
f33e32a8
MM
1481{
1482 tree expr;
1483
eca7fc57 1484 if (!type_build_dtor_call (BINFO_TYPE (binfo)))
f33e32a8
MM
1485 return;
1486
0b8a1e58 1487 /* Call the destructor. */
c8094d83 1488 expr = build_special_member_call (current_class_ref,
4ba126e4 1489 base_dtor_identifier,
c166b898 1490 NULL,
4ba126e4 1491 binfo,
5ade1ed2
DG
1492 LOOKUP_NORMAL | LOOKUP_NONVIRTUAL,
1493 tf_warning_or_error);
eca7fc57
JM
1494
1495 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (BINFO_TYPE (binfo)))
1496 return;
1497
0b8a1e58 1498 if (flag)
db3927fb
AH
1499 expr = fold_build3_loc (input_location,
1500 COND_EXPR, void_type_node,
ba47d38d 1501 c_common_truthvalue_conversion (input_location, flag),
7866705a 1502 expr, integer_zero_node);
0b8a1e58 1503
659e5a7a 1504 finish_eh_cleanup (expr);
f33e32a8
MM
1505}
1506
2282d28d
MM
1507/* Construct the virtual base-class VBASE passing the ARGUMENTS to its
1508 constructor. */
e92cc029 1509
8d08fdba 1510static void
2282d28d 1511construct_virtual_base (tree vbase, tree arguments)
8d08fdba 1512{
2282d28d 1513 tree inner_if_stmt;
2282d28d 1514 tree exp;
c8094d83 1515 tree flag;
2282d28d
MM
1516
1517 /* If there are virtual base classes with destructors, we need to
1518 emit cleanups to destroy them if an exception is thrown during
1519 the construction process. These exception regions (i.e., the
1520 period during which the cleanups must occur) begin from the time
1521 the construction is complete to the end of the function. If we
1522 create a conditional block in which to initialize the
1523 base-classes, then the cleanup region for the virtual base begins
1524 inside a block, and ends outside of that block. This situation
1525 confuses the sjlj exception-handling code. Therefore, we do not
1526 create a single conditional block, but one for each
1527 initialization. (That way the cleanup regions always begin
3b426391 1528 in the outer block.) We trust the back end to figure out
2282d28d
MM
1529 that the FLAG will not change across initializations, and
1530 avoid doing multiple tests. */
910ad8de 1531 flag = DECL_CHAIN (DECL_ARGUMENTS (current_function_decl));
2282d28d
MM
1532 inner_if_stmt = begin_if_stmt ();
1533 finish_if_stmt_cond (flag, inner_if_stmt);
2282d28d
MM
1534
1535 /* Compute the location of the virtual base. If we're
1536 constructing virtual bases, then we must be the most derived
1537 class. Therefore, we don't have to look up the virtual base;
1538 we already know where it is. */
22ed7e5f
MM
1539 exp = convert_to_base_statically (current_class_ref, vbase);
1540
c8094d83 1541 expand_aggr_init_1 (vbase, current_class_ref, exp, arguments,
4b978f96 1542 0, tf_warning_or_error);
2282d28d 1543 finish_then_clause (inner_if_stmt);
325c3691 1544 finish_if_stmt (inner_if_stmt);
2282d28d
MM
1545
1546 expand_cleanup_for_base (vbase, flag);
8d08fdba
MS
1547}
1548
2ee887f2 1549/* Find the context in which this FIELD can be initialized. */
e92cc029 1550
2ee887f2 1551static tree
362efdc1 1552initializing_context (tree field)
2ee887f2
MS
1553{
1554 tree t = DECL_CONTEXT (field);
1555
1556 /* Anonymous union members can be initialized in the first enclosing
1557 non-anonymous union context. */
6bdb8141 1558 while (t && ANON_AGGR_TYPE_P (t))
2ee887f2
MS
1559 t = TYPE_CONTEXT (t);
1560 return t;
1561}
1562
8d08fdba
MS
1563/* Function to give error message if member initialization specification
1564 is erroneous. FIELD is the member we decided to initialize.
1565 TYPE is the type for which the initialization is being performed.
72b7eeff 1566 FIELD must be a member of TYPE.
c8094d83 1567
8d08fdba
MS
1568 MEMBER_NAME is the name of the member. */
1569
1570static int
362efdc1 1571member_init_ok_or_else (tree field, tree type, tree member_name)
8d08fdba
MS
1572{
1573 if (field == error_mark_node)
1574 return 0;
a723baf1 1575 if (!field)
8d08fdba 1576 {
15a7ee29 1577 error ("class %qT does not have any field named %qD", type,
a723baf1 1578 member_name);
8d08fdba
MS
1579 return 0;
1580 }
5a6ccc94 1581 if (VAR_P (field))
b7484fbe 1582 {
15a7ee29 1583 error ("%q#D is a static data member; it can only be "
a723baf1
MM
1584 "initialized at its definition",
1585 field);
1586 return 0;
1587 }
1588 if (TREE_CODE (field) != FIELD_DECL)
1589 {
15a7ee29 1590 error ("%q#D is not a non-static data member of %qT",
a723baf1
MM
1591 field, type);
1592 return 0;
1593 }
1594 if (initializing_context (field) != type)
1595 {
15a7ee29 1596 error ("class %qT does not have any field named %qD", type,
a723baf1 1597 member_name);
b7484fbe
MS
1598 return 0;
1599 }
1600
8d08fdba
MS
1601 return 1;
1602}
1603
2282d28d
MM
1604/* NAME is a FIELD_DECL, an IDENTIFIER_NODE which names a field, or it
1605 is a _TYPE node or TYPE_DECL which names a base for that type.
1f5a253a
NS
1606 Check the validity of NAME, and return either the base _TYPE, base
1607 binfo, or the FIELD_DECL of the member. If NAME is invalid, return
2282d28d 1608 NULL_TREE and issue a diagnostic.
8d08fdba 1609
36a68fe7
NS
1610 An old style unnamed direct single base construction is permitted,
1611 where NAME is NULL. */
8d08fdba 1612
fd74ca0b 1613tree
1f5a253a 1614expand_member_init (tree name)
8d08fdba 1615{
2282d28d
MM
1616 tree basetype;
1617 tree field;
8d08fdba 1618
2282d28d 1619 if (!current_class_ref)
fd74ca0b 1620 return NULL_TREE;
8d08fdba 1621
36a68fe7 1622 if (!name)
90418208 1623 {
36a68fe7
NS
1624 /* This is an obsolete unnamed base class initializer. The
1625 parser will already have warned about its use. */
604a3205 1626 switch (BINFO_N_BASE_BINFOS (TYPE_BINFO (current_class_type)))
36a68fe7
NS
1627 {
1628 case 0:
15a7ee29 1629 error ("unnamed initializer for %qT, which has no base classes",
2282d28d 1630 current_class_type);
36a68fe7
NS
1631 return NULL_TREE;
1632 case 1:
604a3205
NS
1633 basetype = BINFO_TYPE
1634 (BINFO_BASE_BINFO (TYPE_BINFO (current_class_type), 0));
36a68fe7
NS
1635 break;
1636 default:
15a7ee29 1637 error ("unnamed initializer for %qT, which uses multiple inheritance",
2282d28d 1638 current_class_type);
36a68fe7
NS
1639 return NULL_TREE;
1640 }
90418208 1641 }
36a68fe7 1642 else if (TYPE_P (name))
be99da77 1643 {
a82d6da5 1644 basetype = TYPE_MAIN_VARIANT (name);
36a68fe7 1645 name = TYPE_NAME (name);
be99da77 1646 }
36a68fe7
NS
1647 else if (TREE_CODE (name) == TYPE_DECL)
1648 basetype = TYPE_MAIN_VARIANT (TREE_TYPE (name));
2282d28d
MM
1649 else
1650 basetype = NULL_TREE;
8d08fdba 1651
36a68fe7 1652 if (basetype)
41efda8f 1653 {
d9148cf4
MM
1654 tree class_binfo;
1655 tree direct_binfo;
1656 tree virtual_binfo;
1657 int i;
2282d28d 1658
5cd5a78c
JM
1659 if (current_template_parms
1660 || same_type_p (basetype, current_class_type))
238e471c 1661 return basetype;
2282d28d 1662
d9148cf4
MM
1663 class_binfo = TYPE_BINFO (current_class_type);
1664 direct_binfo = NULL_TREE;
1665 virtual_binfo = NULL_TREE;
1666
1667 /* Look for a direct base. */
fa743e8c 1668 for (i = 0; BINFO_BASE_ITERATE (class_binfo, i, direct_binfo); ++i)
539ed333 1669 if (SAME_BINFO_TYPE_P (BINFO_TYPE (direct_binfo), basetype))
fa743e8c
NS
1670 break;
1671
d9148cf4
MM
1672 /* Look for a virtual base -- unless the direct base is itself
1673 virtual. */
809e3e7f 1674 if (!direct_binfo || !BINFO_VIRTUAL_P (direct_binfo))
58c42dc2 1675 virtual_binfo = binfo_for_vbase (basetype, current_class_type);
d9148cf4
MM
1676
1677 /* [class.base.init]
c8094d83 1678
0cbd7506 1679 If a mem-initializer-id is ambiguous because it designates
d9148cf4
MM
1680 both a direct non-virtual base class and an inherited virtual
1681 base class, the mem-initializer is ill-formed. */
1682 if (direct_binfo && virtual_binfo)
1683 {
15a7ee29 1684 error ("%qD is both a direct base and an indirect virtual base",
d9148cf4
MM
1685 basetype);
1686 return NULL_TREE;
1687 }
1688
1689 if (!direct_binfo && !virtual_binfo)
8d08fdba 1690 {
5775a06a 1691 if (CLASSTYPE_VBASECLASSES (current_class_type))
c3115fd2
MM
1692 error ("type %qT is not a direct or virtual base of %qT",
1693 basetype, current_class_type);
41efda8f 1694 else
c3115fd2
MM
1695 error ("type %qT is not a direct base of %qT",
1696 basetype, current_class_type);
fd74ca0b 1697 return NULL_TREE;
41efda8f 1698 }
d9148cf4
MM
1699
1700 return direct_binfo ? direct_binfo : virtual_binfo;
41efda8f
MM
1701 }
1702 else
1703 {
9dc6f476 1704 if (identifier_p (name))
86ac0575 1705 field = lookup_field (current_class_type, name, 1, false);
2282d28d
MM
1706 else
1707 field = name;
8d08fdba 1708
2282d28d 1709 if (member_init_ok_or_else (field, current_class_type, name))
1f5a253a 1710 return field;
41efda8f 1711 }
fd74ca0b 1712
2282d28d 1713 return NULL_TREE;
8d08fdba
MS
1714}
1715
1716/* This is like `expand_member_init', only it stores one aggregate
1717 value into another.
1718
1719 INIT comes in two flavors: it is either a value which
1720 is to be stored in EXP, or it is a parameter list
1721 to go to a constructor, which will operate on EXP.
f30432d7
MS
1722 If INIT is not a parameter list for a constructor, then set
1723 LOOKUP_ONLYCONVERTING.
6060a796
MS
1724 If FLAGS is LOOKUP_ONLYCONVERTING then it is the = init form of
1725 the initializer, if FLAGS is 0, then it is the (init) form.
8d08fdba 1726 If `init' is a CONSTRUCTOR, then we emit a warning message,
59be0cdd 1727 explaining that such initializations are invalid.
8d08fdba 1728
8d08fdba
MS
1729 If INIT resolves to a CALL_EXPR which happens to return
1730 something of the type we are looking for, then we know
1731 that we can safely use that call to perform the
1732 initialization.
1733
1734 The virtual function table pointer cannot be set up here, because
1735 we do not really know its type.
1736
8d08fdba
MS
1737 This never calls operator=().
1738
1739 When initializing, nothing is CONST.
1740
1741 A default copy constructor may have to be used to perform the
1742 initialization.
1743
1744 A constructor or a conversion operator may have to be used to
e92cc029 1745 perform the initialization, but not both, as it would be ambiguous. */
8d08fdba 1746
f1dedc31 1747tree
5ade1ed2 1748build_aggr_init (tree exp, tree init, int flags, tsubst_flags_t complain)
8d08fdba 1749{
f1dedc31
MM
1750 tree stmt_expr;
1751 tree compound_stmt;
1752 int destroy_temps;
8d08fdba
MS
1753 tree type = TREE_TYPE (exp);
1754 int was_const = TREE_READONLY (exp);
f30432d7 1755 int was_volatile = TREE_THIS_VOLATILE (exp);
2a3398e1 1756 int is_global;
8d08fdba
MS
1757
1758 if (init == error_mark_node)
f1dedc31 1759 return error_mark_node;
8d08fdba 1760
d1a73b0b 1761 location_t init_loc = (init
f9d0ca40 1762 ? cp_expr_loc_or_input_loc (init)
d1a73b0b
JM
1763 : location_of (exp));
1764
8d08fdba 1765 TREE_READONLY (exp) = 0;
f30432d7
MS
1766 TREE_THIS_VOLATILE (exp) = 0;
1767
8d08fdba
MS
1768 if (TREE_CODE (type) == ARRAY_TYPE)
1769 {
70f40fea
JJ
1770 tree itype = init ? TREE_TYPE (init) : NULL_TREE;
1771 int from_array = 0;
671cb993 1772
70f40fea 1773 if (VAR_P (exp) && DECL_DECOMPOSITION_P (exp))
0655c6d5
JM
1774 {
1775 from_array = 1;
69ce0c8c 1776 init = mark_rvalue_use (init);
dfd7fdca
DM
1777 if (init
1778 && DECL_P (tree_strip_any_location_wrapper (init))
0655c6d5
JM
1779 && !(flags & LOOKUP_ONLYCONVERTING))
1780 {
1781 /* Wrap the initializer in a CONSTRUCTOR so that build_vec_init
1782 recognizes it as direct-initialization. */
1783 init = build_constructor_single (init_list_type_node,
1784 NULL_TREE, init);
1785 CONSTRUCTOR_IS_DIRECT_INIT (init) = true;
1786 }
1787 }
70f40fea 1788 else
8d08fdba 1789 {
70f40fea
JJ
1790 /* Must arrange to initialize each element of EXP
1791 from elements of INIT. */
1792 if (cv_qualified_p (type))
1793 TREE_TYPE (exp) = cv_unqualified (type);
1794 if (itype && cv_qualified_p (itype))
1795 TREE_TYPE (init) = cv_unqualified (itype);
1796 from_array = (itype && same_type_p (TREE_TYPE (init),
1797 TREE_TYPE (exp)));
d1a73b0b 1798
e278212e
PC
1799 if (init && !BRACE_ENCLOSED_INITIALIZER_P (init)
1800 && (!from_array
1801 || (TREE_CODE (init) != CONSTRUCTOR
1802 /* Can happen, eg, handling the compound-literals
1803 extension (ext/complit12.C). */
1804 && TREE_CODE (init) != TARGET_EXPR)))
d1a73b0b
JM
1805 {
1806 if (complain & tf_error)
e278212e
PC
1807 error_at (init_loc, "array must be initialized "
1808 "with a brace-enclosed initializer");
1809 return error_mark_node;
d1a73b0b 1810 }
8d08fdba 1811 }
70f40fea 1812
a48cccea 1813 stmt_expr = build_vec_init (exp, NULL_TREE, init,
844ae01d 1814 /*explicit_value_init_p=*/false,
70f40fea 1815 from_array,
5ade1ed2 1816 complain);
8d08fdba 1817 TREE_READONLY (exp) = was_const;
f30432d7 1818 TREE_THIS_VOLATILE (exp) = was_volatile;
8d08fdba 1819 TREE_TYPE (exp) = type;
a47c2f62
JM
1820 /* Restore the type of init unless it was used directly. */
1821 if (init && TREE_CODE (stmt_expr) != INIT_EXPR)
f376e137 1822 TREE_TYPE (init) = itype;
f1dedc31 1823 return stmt_expr;
8d08fdba
MS
1824 }
1825
0655c6d5
JM
1826 if (init && init != void_type_node
1827 && TREE_CODE (init) != TREE_LIST
1828 && !(TREE_CODE (init) == TARGET_EXPR
1829 && TARGET_EXPR_DIRECT_INIT_P (init))
1830 && !DIRECT_LIST_INIT_P (init))
1831 flags |= LOOKUP_ONLYCONVERTING;
1832
2a3398e1 1833 is_global = begin_init_stmts (&stmt_expr, &compound_stmt);
f2c5f623 1834 destroy_temps = stmts_are_full_exprs_p ();
ae499cce 1835 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
8d08fdba 1836 expand_aggr_init_1 (TYPE_BINFO (type), exp, exp,
5ade1ed2 1837 init, LOOKUP_NORMAL|flags, complain);
2a3398e1 1838 stmt_expr = finish_init_stmts (is_global, stmt_expr, compound_stmt);
ae499cce 1839 current_stmt_tree ()->stmts_are_full_exprs_p = destroy_temps;
8d08fdba 1840 TREE_READONLY (exp) = was_const;
f30432d7 1841 TREE_THIS_VOLATILE (exp) = was_volatile;
f1dedc31 1842
b46b715d
JM
1843 if ((VAR_P (exp) || TREE_CODE (exp) == PARM_DECL)
1844 && TREE_SIDE_EFFECTS (stmt_expr)
1845 && !lookup_attribute ("warn_unused", TYPE_ATTRIBUTES (type)))
1846 /* Just know that we've seen something for this node. */
1847 TREE_USED (exp) = 1;
1848
f1dedc31 1849 return stmt_expr;
8d08fdba
MS
1850}
1851
1852static void
5ade1ed2
DG
1853expand_default_init (tree binfo, tree true_exp, tree exp, tree init, int flags,
1854 tsubst_flags_t complain)
8d08fdba 1855{
fc378698
MS
1856 tree type = TREE_TYPE (exp);
1857
8d08fdba
MS
1858 /* It fails because there may not be a constructor which takes
1859 its own type as the first (or only parameter), but which does
1860 take other types via a conversion. So, if the thing initializing
1861 the expression is a unit element of type X, first try X(X&),
1862 followed by initialization by X. If neither of these work
1863 out, then look hard. */
1864 tree rval;
9771b263 1865 vec<tree, va_gc> *parms;
8d08fdba 1866
2061820e
JM
1867 /* If we have direct-initialization from an initializer list, pull
1868 it out of the TREE_LIST so the code below can see it. */
1869 if (init && TREE_CODE (init) == TREE_LIST
014397c2 1870 && DIRECT_LIST_INIT_P (TREE_VALUE (init)))
2061820e
JM
1871 {
1872 gcc_checking_assert ((flags & LOOKUP_ONLYCONVERTING) == 0
1873 && TREE_CHAIN (init) == NULL_TREE);
1874 init = TREE_VALUE (init);
f0516ca4
JJ
1875 /* Only call reshape_init if it has not been called earlier
1876 by the callers. */
1877 if (BRACE_ENCLOSED_INITIALIZER_P (init) && CP_AGGREGATE_TYPE_P (type))
1878 init = reshape_init (type, init, complain);
2061820e
JM
1879 }
1880
4c9b3895
JM
1881 if (init && BRACE_ENCLOSED_INITIALIZER_P (init)
1882 && CP_AGGREGATE_TYPE_P (type))
e08cc018
JM
1883 /* A brace-enclosed initializer for an aggregate. In C++0x this can
1884 happen for direct-initialization, too. */
f0516ca4 1885 init = digest_init (type, init, complain);
e08cc018
JM
1886
1887 /* A CONSTRUCTOR of the target's type is a previously digested
1888 initializer, whether that happened just above or in
1889 cp_parser_late_parsing_nsdmi.
1890
36cbfdb0
JM
1891 A TARGET_EXPR with TARGET_EXPR_DIRECT_INIT_P or TARGET_EXPR_LIST_INIT_P
1892 set represents the whole initialization, so we shouldn't build up
1893 another ctor call. */
e08cc018
JM
1894 if (init
1895 && (TREE_CODE (init) == CONSTRUCTOR
36cbfdb0
JM
1896 || (TREE_CODE (init) == TARGET_EXPR
1897 && (TARGET_EXPR_DIRECT_INIT_P (init)
1898 || TARGET_EXPR_LIST_INIT_P (init))))
e08cc018 1899 && same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (init), type))
4c9b3895 1900 {
e08cc018
JM
1901 /* Early initialization via a TARGET_EXPR only works for
1902 complete objects. */
1903 gcc_assert (TREE_CODE (init) == CONSTRUCTOR || true_exp == exp);
1904
4c9b3895
JM
1905 init = build2 (INIT_EXPR, TREE_TYPE (exp), exp, init);
1906 TREE_SIDE_EFFECTS (init) = 1;
1907 finish_expr_stmt (init);
1908 return;
1909 }
1910
277294d7 1911 if (init && TREE_CODE (init) != TREE_LIST
32005478
JM
1912 && (flags & LOOKUP_ONLYCONVERTING)
1913 && !unsafe_return_slot_p (exp))
faf5394a
MS
1914 {
1915 /* Base subobjects should only get direct-initialization. */
8dc2b103 1916 gcc_assert (true_exp == exp);
faf5394a 1917
c37dc68e
JM
1918 if (flags & DIRECT_BIND)
1919 /* Do nothing. We hit this in two cases: Reference initialization,
1920 where we aren't initializing a real variable, so we don't want
1921 to run a new constructor; and catching an exception, where we
1922 have already built up the constructor call so we could wrap it
1923 in an exception region. */;
1924 else
4b978f96 1925 init = ocp_convert (type, init, CONV_IMPLICIT|CONV_FORCE_TEMP,
4eb28483 1926 flags, complain | tf_no_cleanup);
faf5394a 1927
4e8dca1c
JM
1928 if (TREE_CODE (init) == MUST_NOT_THROW_EXPR)
1929 /* We need to protect the initialization of a catch parm with a
1930 call to terminate(), which shows up as a MUST_NOT_THROW_EXPR
c7ae64f2 1931 around the TARGET_EXPR for the copy constructor. See
4e8dca1c
JM
1932 initialize_handler_parm. */
1933 {
f293ce4b
RS
1934 TREE_OPERAND (init, 0) = build2 (INIT_EXPR, TREE_TYPE (exp), exp,
1935 TREE_OPERAND (init, 0));
4e8dca1c
JM
1936 TREE_TYPE (init) = void_type_node;
1937 }
c7ae64f2 1938 else
f293ce4b 1939 init = build2 (INIT_EXPR, TREE_TYPE (exp), exp, init);
c7ae64f2 1940 TREE_SIDE_EFFECTS (init) = 1;
f1dedc31 1941 finish_expr_stmt (init);
faf5394a
MS
1942 return;
1943 }
1944
c166b898
ILT
1945 if (init == NULL_TREE)
1946 parms = NULL;
1947 else if (TREE_CODE (init) == TREE_LIST && !TREE_TYPE (init))
8d08fdba 1948 {
c166b898
ILT
1949 parms = make_tree_vector ();
1950 for (; init != NULL_TREE; init = TREE_CHAIN (init))
9771b263 1951 vec_safe_push (parms, TREE_VALUE (init));
8d08fdba 1952 }
8d08fdba 1953 else
c166b898 1954 parms = make_tree_vector_single (init);
8d08fdba 1955
238e471c
VV
1956 if (exp == current_class_ref && current_function_decl
1957 && DECL_HAS_IN_CHARGE_PARM_P (current_function_decl))
1958 {
1959 /* Delegating constructor. */
1960 tree complete;
1961 tree base;
c4ce224c
JM
1962 tree elt; unsigned i;
1963
1964 /* Unshare the arguments for the second call. */
cd9cf97b 1965 releasing_vec parms2;
9771b263 1966 FOR_EACH_VEC_SAFE_ELT (parms, i, elt)
c4ce224c
JM
1967 {
1968 elt = break_out_target_exprs (elt);
9771b263 1969 vec_safe_push (parms2, elt);
c4ce224c 1970 }
238e471c 1971 complete = build_special_member_call (exp, complete_ctor_identifier,
c4ce224c
JM
1972 &parms2, binfo, flags,
1973 complain);
1974 complete = fold_build_cleanup_point_expr (void_type_node, complete);
c4ce224c 1975
238e471c
VV
1976 base = build_special_member_call (exp, base_ctor_identifier,
1977 &parms, binfo, flags,
1978 complain);
c4ce224c 1979 base = fold_build_cleanup_point_expr (void_type_node, base);
eb0dbdc7 1980 rval = build_if_in_charge (complete, base);
238e471c
VV
1981 }
1982 else
1983 {
d6ef53f2
NS
1984 tree ctor_name = (true_exp == exp
1985 ? complete_ctor_identifier : base_ctor_identifier);
1986
238e471c
VV
1987 rval = build_special_member_call (exp, ctor_name, &parms, binfo, flags,
1988 complain);
c0cdf62c 1989 }
c166b898
ILT
1990
1991 if (parms != NULL)
1992 release_tree_vector (parms);
1993
fa2200cb
JM
1994 if (exp == true_exp && TREE_CODE (rval) == CALL_EXPR)
1995 {
1996 tree fn = get_callee_fndecl (rval);
a76c13bf 1997 if (fn && DECL_DECLARED_CONSTEXPR_P (fn))
fa2200cb 1998 {
3e605b20 1999 tree e = maybe_constant_init (rval, exp);
fa2200cb
JM
2000 if (TREE_CONSTANT (e))
2001 rval = build2 (INIT_EXPR, type, exp, e);
2002 }
2003 }
2004
2005 /* FIXME put back convert_to_void? */
25eb19ff 2006 if (TREE_SIDE_EFFECTS (rval))
fa2200cb 2007 finish_expr_stmt (rval);
8d08fdba
MS
2008}
2009
2010/* This function is responsible for initializing EXP with INIT
2011 (if any).
2012
2013 BINFO is the binfo of the type for who we are performing the
2014 initialization. For example, if W is a virtual base class of A and B,
2015 and C : A, B.
2016 If we are initializing B, then W must contain B's W vtable, whereas
2017 were we initializing C, W must contain C's W vtable.
2018
2019 TRUE_EXP is nonzero if it is the true expression being initialized.
2020 In this case, it may be EXP, or may just contain EXP. The reason we
2021 need this is because if EXP is a base element of TRUE_EXP, we
2022 don't necessarily know by looking at EXP where its virtual
2023 baseclass fields should really be pointing. But we do know
2024 from TRUE_EXP. In constructors, we don't know anything about
2025 the value being initialized.
2026
9f880ef9
MM
2027 FLAGS is just passed to `build_new_method_call'. See that function
2028 for its description. */
8d08fdba
MS
2029
2030static void
5ade1ed2
DG
2031expand_aggr_init_1 (tree binfo, tree true_exp, tree exp, tree init, int flags,
2032 tsubst_flags_t complain)
8d08fdba
MS
2033{
2034 tree type = TREE_TYPE (exp);
8d08fdba 2035
50bc768d 2036 gcc_assert (init != error_mark_node && type != error_mark_node);
38e01f9e 2037 gcc_assert (building_stmt_list_p ());
8d08fdba
MS
2038
2039 /* Use a function returning the desired type to initialize EXP for us.
2040 If the function is a constructor, and its first argument is
2041 NULL_TREE, know that it was meant for us--just slide exp on
2042 in and expand the constructor. Constructors now come
2043 as TARGET_EXPRs. */
faf5394a 2044
5a6ccc94 2045 if (init && VAR_P (exp)
3b2db49f 2046 && COMPOUND_LITERAL_P (init))
faf5394a 2047 {
9771b263 2048 vec<tree, va_gc> *cleanups = NULL;
f1dedc31 2049 /* If store_init_value returns NULL_TREE, the INIT has been
3b2db49f 2050 recorded as the DECL_INITIAL for EXP. That means there's
f1dedc31 2051 nothing more we have to do. */
b25dd954 2052 init = store_init_value (exp, init, &cleanups, flags);
25ebb82a
RH
2053 if (init)
2054 finish_expr_stmt (init);
b25dd954 2055 gcc_assert (!cleanups);
faf5394a
MS
2056 return;
2057 }
2058
f388b7be 2059 /* List-initialization from {} becomes value-initialization for non-aggregate
49b5925f
JM
2060 classes with default constructors. Handle this here when we're
2061 initializing a base, so protected access works. */
2062 if (exp != true_exp && init && TREE_CODE (init) == TREE_LIST)
f388b7be
JM
2063 {
2064 tree elt = TREE_VALUE (init);
2065 if (DIRECT_LIST_INIT_P (elt)
2066 && CONSTRUCTOR_ELTS (elt) == 0
2067 && CLASSTYPE_NON_AGGREGATE (type)
2068 && TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
2069 init = void_type_node;
2070 }
2071
fd97a96a
JM
2072 /* If an explicit -- but empty -- initializer list was present,
2073 that's value-initialization. */
2074 if (init == void_type_node)
2075 {
c2b3ec18
JM
2076 /* If the type has data but no user-provided ctor, we need to zero
2077 out the object. */
2078 if (!type_has_user_provided_constructor (type)
dbcd32f8 2079 && !is_really_empty_class (type, /*ignore_vptr*/true))
fd97a96a 2080 {
1fb0b801
JM
2081 tree field_size = NULL_TREE;
2082 if (exp != true_exp && CLASSTYPE_AS_BASE (type) != type)
2083 /* Don't clobber already initialized virtual bases. */
2084 field_size = TYPE_SIZE (CLASSTYPE_AS_BASE (type));
2085 init = build_zero_init_1 (type, NULL_TREE, /*static_storage_p=*/false,
2086 field_size);
fd97a96a
JM
2087 init = build2 (INIT_EXPR, type, exp, init);
2088 finish_expr_stmt (init);
fd97a96a 2089 }
1fb0b801 2090
fd97a96a 2091 /* If we don't need to mess with the constructor at all,
1fb0b801
JM
2092 then we're done. */
2093 if (! type_build_ctor_call (type))
2094 return;
2095
2096 /* Otherwise fall through and call the constructor. */
fd97a96a
JM
2097 init = NULL_TREE;
2098 }
2099
9e9ff709
MS
2100 /* We know that expand_default_init can handle everything we want
2101 at this point. */
5ade1ed2 2102 expand_default_init (binfo, true_exp, exp, init, flags, complain);
8d08fdba
MS
2103}
2104
9e1e64ec 2105/* Report an error if TYPE is not a user-defined, class type. If
be99da77 2106 OR_ELSE is nonzero, give an error message. */
e92cc029 2107
be99da77 2108int
9e1e64ec 2109is_class_type (tree type, int or_else)
be99da77
MS
2110{
2111 if (type == error_mark_node)
2112 return 0;
2113
9e1e64ec 2114 if (! CLASS_TYPE_P (type))
be99da77
MS
2115 {
2116 if (or_else)
9e1e64ec 2117 error ("%qT is not a class type", type);
be99da77
MS
2118 return 0;
2119 }
2120 return 1;
2121}
2122
a5ac359a
MM
2123/* Build a reference to a member of an aggregate. This is not a C++
2124 `&', but really something which can have its address taken, and
2125 then act as a pointer to member, for example TYPE :: FIELD can have
2126 its address taken by saying & TYPE :: FIELD. ADDRESS_P is true if
2127 this expression is the operand of "&".
8d08fdba
MS
2128
2129 @@ Prints out lousy diagnostics for operator <typename>
2130 @@ fields.
2131
51c184be 2132 @@ This function should be rewritten and placed in search.c. */
e92cc029 2133
8d08fdba 2134tree
a378996b
PC
2135build_offset_ref (tree type, tree member, bool address_p,
2136 tsubst_flags_t complain)
8d08fdba 2137{
8d245821 2138 tree decl;
fc378698 2139 tree basebinfo = NULL_TREE;
8d08fdba 2140
5f311aec 2141 /* class templates can come in as TEMPLATE_DECLs here. */
d4f0f205
MM
2142 if (TREE_CODE (member) == TEMPLATE_DECL)
2143 return member;
93cdc044 2144
627bc938
JM
2145 if (dependent_scope_p (type) || type_dependent_expression_p (member))
2146 return build_qualified_name (NULL_TREE, type, member,
2d660b7f 2147 /*template_p=*/false);
5566b478 2148
d4f0f205 2149 gcc_assert (TYPE_P (type));
9e1e64ec 2150 if (! is_class_type (type, 1))
c833d2be
NS
2151 return error_mark_node;
2152
d4f0f205
MM
2153 gcc_assert (DECL_P (member) || BASELINK_P (member));
2154 /* Callers should call mark_used before this point. */
3146f36f 2155 gcc_assert (!DECL_P (member) || TREE_USED (member));
be99da77 2156
627bc938 2157 type = TYPE_MAIN_VARIANT (type);
01628e54 2158 if (!COMPLETE_OR_OPEN_TYPE_P (complete_type (type)))
8d08fdba 2159 {
a378996b
PC
2160 if (complain & tf_error)
2161 error ("incomplete type %qT does not have member %qD", type, member);
a5ac359a
MM
2162 return error_mark_node;
2163 }
2164
d4f0f205 2165 /* Entities other than non-static members need no further
3db45ab5 2166 processing. */
a5ac359a 2167 if (TREE_CODE (member) == TYPE_DECL)
d4f0f205 2168 return member;
5a6ccc94 2169 if (VAR_P (member) || TREE_CODE (member) == CONST_DECL)
d4f0f205 2170 return convert_from_reference (member);
a5ac359a
MM
2171
2172 if (TREE_CODE (member) == FIELD_DECL && DECL_C_BIT_FIELD (member))
2173 {
a378996b
PC
2174 if (complain & tf_error)
2175 error ("invalid pointer to bit-field %qD", member);
a5ac359a
MM
2176 return error_mark_node;
2177 }
2178
d4f0f205
MM
2179 /* Set up BASEBINFO for member lookup. */
2180 decl = maybe_dummy_object (type, &basebinfo);
2181
aa52c1ff 2182 /* A lot of this logic is now handled in lookup_member. */
a5ac359a 2183 if (BASELINK_P (member))
8d08fdba 2184 {
8d08fdba 2185 /* Go from the TREE_BASELINK to the member function info. */
7304fcb4 2186 tree t = BASELINK_FUNCTIONS (member);
8d08fdba 2187
50ad9642 2188 if (TREE_CODE (t) != TEMPLATE_ID_EXPR && !really_overloaded_fn (t))
8d08fdba 2189 {
f4f206f4 2190 /* Get rid of a potential OVERLOAD around it. */
848bf88d 2191 t = OVL_FIRST (t);
2c73f9f5 2192
b54f5338
KL
2193 /* Unique functions are handled easily. */
2194
2195 /* For non-static member of base class, we need a special rule
2196 for access checking [class.protected]:
2197
2198 If the access is to form a pointer to member, the
2199 nested-name-specifier shall name the derived class
2200 (or any class derived from that class). */
080384d6 2201 bool ok;
b54f5338
KL
2202 if (address_p && DECL_P (t)
2203 && DECL_NONSTATIC_MEMBER_P (t))
080384d6
JM
2204 ok = perform_or_defer_access_check (TYPE_BINFO (type), t, t,
2205 complain);
b54f5338 2206 else
080384d6
JM
2207 ok = perform_or_defer_access_check (basebinfo, t, t,
2208 complain);
2209 if (!ok)
2210 return error_mark_node;
848b92e1
JM
2211 if (DECL_STATIC_FUNCTION_P (t))
2212 return t;
a5ac359a
MM
2213 member = t;
2214 }
2215 else
7304fcb4 2216 TREE_TYPE (member) = unknown_type_node;
8d08fdba 2217 }
b54f5338 2218 else if (address_p && TREE_CODE (member) == FIELD_DECL)
080384d6
JM
2219 {
2220 /* We need additional test besides the one in
2221 check_accessibility_of_qualified_id in case it is
2222 a pointer to non-static member. */
2223 if (!perform_or_defer_access_check (TYPE_BINFO (type), member, member,
2224 complain))
2225 return error_mark_node;
2226 }
8d08fdba 2227
a5ac359a 2228 if (!address_p)
8d08fdba 2229 {
a5ac359a
MM
2230 /* If MEMBER is non-static, then the program has fallen afoul of
2231 [expr.prim]:
8d08fdba 2232
d20b7173
MP
2233 An id-expression that denotes a non-static data member or
2234 non-static member function of a class can only be used:
8d08fdba 2235
a5ac359a
MM
2236 -- as part of a class member access (_expr.ref_) in which the
2237 object-expression refers to the member's class or a class
2238 derived from that class, or
b7484fbe 2239
a5ac359a
MM
2240 -- to form a pointer to member (_expr.unary.op_), or
2241
d20b7173
MP
2242 -- in the body of a non-static member function of that class or
2243 of a class derived from that class (_class.mfct.non-static_), or
a5ac359a
MM
2244
2245 -- in a mem-initializer for a constructor for that class or for
2246 a class derived from that class (_class.base.init_). */
2247 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (member))
2248 {
39a13be5 2249 /* Build a representation of the qualified name suitable
e9525111
MM
2250 for use as the operand to "&" -- even though the "&" is
2251 not actually present. */
f293ce4b 2252 member = build2 (OFFSET_REF, TREE_TYPE (member), decl, member);
a5ac359a
MM
2253 /* In Microsoft mode, treat a non-static member function as if
2254 it were a pointer-to-member. */
2255 if (flag_ms_extensions)
2256 {
a5ac359a 2257 PTRMEM_OK_P (member) = 1;
a378996b 2258 return cp_build_addr_expr (member, complain);
a5ac359a 2259 }
a378996b
PC
2260 if (complain & tf_error)
2261 error ("invalid use of non-static member function %qD",
2262 TREE_OPERAND (member, 1));
07471dfb 2263 return error_mark_node;
a5ac359a
MM
2264 }
2265 else if (TREE_CODE (member) == FIELD_DECL)
2266 {
a378996b
PC
2267 if (complain & tf_error)
2268 error ("invalid use of non-static data member %qD", member);
a5ac359a
MM
2269 return error_mark_node;
2270 }
2271 return member;
2272 }
8d08fdba 2273
f293ce4b 2274 member = build2 (OFFSET_REF, TREE_TYPE (member), decl, member);
8d245821
MM
2275 PTRMEM_OK_P (member) = 1;
2276 return member;
8d08fdba
MS
2277}
2278
393e756d
MM
2279/* If DECL is a scalar enumeration constant or variable with a
2280 constant initializer, return the initializer (or, its initializers,
69eb4fde
JM
2281 recursively); otherwise, return DECL. If STRICT_P, the
2282 initializer is only returned if DECL is a
90454da1 2283 constant-expression. If RETURN_AGGREGATE_CST_OK_P, it is ok to
8c00059c
PP
2284 return an aggregate constant. If UNSHARE_P, return an unshared
2285 copy of the initializer. */
8d08fdba 2286
393e756d 2287static tree
8c00059c
PP
2288constant_value_1 (tree decl, bool strict_p, bool return_aggregate_cst_ok_p,
2289 bool unshare_p)
8d08fdba 2290{
f513e31f 2291 while (TREE_CODE (decl) == CONST_DECL
fd338b13
JM
2292 || decl_constant_var_p (decl)
2293 || (!strict_p && VAR_P (decl)
2294 && CP_TYPE_CONST_NON_VOLATILE_P (TREE_TYPE (decl))))
b794e321
MM
2295 {
2296 tree init;
fa2200cb
JM
2297 /* If DECL is a static data member in a template
2298 specialization, we must instantiate it here. The
2299 initializer for the static data member is not processed
2300 until needed; we need it now. */
fd5c817a 2301 mark_used (decl, tf_none);
fa2200cb 2302 init = DECL_INITIAL (decl);
d174af6c 2303 if (init == error_mark_node)
88274c4d 2304 {
cdd669f9
JJ
2305 if (TREE_CODE (decl) == CONST_DECL
2306 || DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl))
88274c4d
JM
2307 /* Treat the error as a constant to avoid cascading errors on
2308 excessively recursive template instantiation (c++/9335). */
2309 return init;
2310 else
2311 return decl;
2312 }
73ce7fcb
JJ
2313 /* Initializers in templates are generally expanded during
2314 instantiation, so before that for const int i(2)
2315 INIT is a TREE_LIST with the actual initializer as
2316 TREE_VALUE. */
2317 if (processing_template_decl
2318 && init
2319 && TREE_CODE (init) == TREE_LIST
2320 && TREE_CHAIN (init) == NULL_TREE)
2321 init = TREE_VALUE (init);
d1dfa20d
JM
2322 /* Instantiate a non-dependent initializer for user variables. We
2323 mustn't do this for the temporary for an array compound literal;
2324 trying to instatiate the initializer will keep creating new
2325 temporaries until we crash. Probably it's not useful to do it for
2326 other artificial variables, either. */
2327 if (!DECL_ARTIFICIAL (decl))
2328 init = instantiate_non_dependent_or_null (init);
d174af6c 2329 if (!init
b794e321 2330 || !TREE_TYPE (init)
8152661b 2331 || !TREE_CONSTANT (init)
69eb4fde 2332 || (!return_aggregate_cst_ok_p
90454da1
PC
2333 /* Unless RETURN_AGGREGATE_CST_OK_P is true, do not
2334 return an aggregate constant (of which string
2335 literals are a special case), as we do not want
2336 to make inadvertent copies of such entities, and
2337 we must be sure that their addresses are the
2338 same everywhere. */
8152661b
JM
2339 && (TREE_CODE (init) == CONSTRUCTOR
2340 || TREE_CODE (init) == STRING_CST)))
b794e321 2341 break;
62f9ab0d 2342 /* Don't return a CONSTRUCTOR for a variable with partial run-time
5a5da480
JJ
2343 initialization, since it doesn't represent the entire value.
2344 Similarly for VECTOR_CSTs created by cp_folding those
2345 CONSTRUCTORs. */
2346 if ((TREE_CODE (init) == CONSTRUCTOR
2347 || TREE_CODE (init) == VECTOR_CST)
62f9ab0d
JM
2348 && !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl))
2349 break;
6443c7c0
MP
2350 /* If the variable has a dynamic initializer, don't use its
2351 DECL_INITIAL which doesn't reflect the real value. */
2352 if (VAR_P (decl)
2353 && TREE_STATIC (decl)
2354 && !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl)
2355 && DECL_NONTRIVIALLY_INITIALIZED_P (decl))
2356 break;
8c00059c 2357 decl = init;
b794e321 2358 }
8c00059c 2359 return unshare_p ? unshare_expr (decl) : decl;
8a784e4a 2360}
a1652802 2361
69eb4fde
JM
2362/* If DECL is a CONST_DECL, or a constant VAR_DECL initialized by constant
2363 of integral or enumeration type, or a constexpr variable of scalar type,
2364 then return that value. These are those variables permitted in constant
2365 expressions by [5.19/1]. */
a1652802 2366
8a784e4a 2367tree
69eb4fde 2368scalar_constant_value (tree decl)
8a784e4a 2369{
69eb4fde 2370 return constant_value_1 (decl, /*strict_p=*/true,
8c00059c
PP
2371 /*return_aggregate_cst_ok_p=*/false,
2372 /*unshare_p=*/true);
393e756d 2373}
c8094d83 2374
8c00059c
PP
2375/* Like scalar_constant_value, but can also return aggregate initializers.
2376 If UNSHARE_P, return an unshared copy of the initializer. */
393e756d
MM
2377
2378tree
8c00059c 2379decl_really_constant_value (tree decl, bool unshare_p /*= true*/)
393e756d 2380{
69eb4fde 2381 return constant_value_1 (decl, /*strict_p=*/true,
8c00059c
PP
2382 /*return_aggregate_cst_ok_p=*/true,
2383 /*unshare_p=*/unshare_p);
90454da1
PC
2384}
2385
8c00059c 2386/* A more relaxed version of decl_really_constant_value, used by the
69eb4fde 2387 common C/C++ code. */
90454da1
PC
2388
2389tree
8c00059c 2390decl_constant_value (tree decl, bool unshare_p)
90454da1 2391{
69eb4fde 2392 return constant_value_1 (decl, /*strict_p=*/processing_template_decl,
8c00059c
PP
2393 /*return_aggregate_cst_ok_p=*/true,
2394 /*unshare_p=*/unshare_p);
2395}
2396
2397tree
2398decl_constant_value (tree decl)
2399{
2400 return decl_constant_value (decl, /*unshare_p=*/true);
8d08fdba
MS
2401}
2402\f
8d08fdba 2403/* Common subroutines of build_new and build_vec_delete. */
8d08fdba 2404\f
63c9a190
MM
2405/* Build and return a NEW_EXPR. If NELTS is non-NULL, TYPE[NELTS] is
2406 the type of the object being allocated; otherwise, it's just TYPE.
2407 INIT is the initializer, if any. USE_GLOBAL_NEW is true if the
2408 user explicitly wrote "::operator new". PLACEMENT, if non-NULL, is
c166b898
ILT
2409 a vector of arguments to be provided as arguments to a placement
2410 new operator. This routine performs no semantic checks; it just
2411 creates and returns a NEW_EXPR. */
a0d5fba7 2412
63c9a190 2413static tree
87d3f828
PC
2414build_raw_new_expr (location_t loc, vec<tree, va_gc> *placement, tree type,
2415 tree nelts, vec<tree, va_gc> *init, int use_global_new)
743f140d 2416{
c166b898 2417 tree init_list;
63c9a190 2418 tree new_expr;
3db45ab5 2419
c166b898
ILT
2420 /* If INIT is NULL, the we want to store NULL_TREE in the NEW_EXPR.
2421 If INIT is not NULL, then we want to store VOID_ZERO_NODE. This
2422 permits us to distinguish the case of a missing initializer "new
2423 int" from an empty initializer "new int()". */
2424 if (init == NULL)
2425 init_list = NULL_TREE;
9771b263 2426 else if (init->is_empty ())
632f2871 2427 init_list = void_node;
c166b898 2428 else
335a120f 2429 init_list = build_tree_list_vec (init);
c166b898 2430
87d3f828
PC
2431 new_expr = build4_loc (loc, NEW_EXPR, build_pointer_type (type),
2432 build_tree_list_vec (placement), type, nelts,
2433 init_list);
63c9a190
MM
2434 NEW_EXPR_USE_GLOBAL (new_expr) = use_global_new;
2435 TREE_SIDE_EFFECTS (new_expr) = 1;
2436
2437 return new_expr;
743f140d
PB
2438}
2439
9d809e8f
FC
2440/* Diagnose uninitialized const members or reference members of type
2441 TYPE. USING_NEW is used to disambiguate the diagnostic between a
40bb78ad
FC
2442 new expression without a new-initializer and a declaration. Returns
2443 the error count. */
9d809e8f 2444
40bb78ad 2445static int
9d809e8f 2446diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin,
40bb78ad 2447 bool using_new, bool complain)
9d809e8f
FC
2448{
2449 tree field;
40bb78ad 2450 int error_count = 0;
9d809e8f 2451
10ab8f62 2452 if (type_has_user_provided_constructor (type))
40bb78ad 2453 return 0;
10ab8f62 2454
910ad8de 2455 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
9d809e8f
FC
2456 {
2457 tree field_type;
2458
2459 if (TREE_CODE (field) != FIELD_DECL)
2460 continue;
2461
2462 field_type = strip_array_types (TREE_TYPE (field));
2463
1c682d06
FC
2464 if (type_has_user_provided_constructor (field_type))
2465 continue;
2466
9f613f06 2467 if (TYPE_REF_P (field_type))
9d809e8f 2468 {
40bb78ad
FC
2469 ++ error_count;
2470 if (complain)
2471 {
0e02d8e3
PC
2472 if (DECL_CONTEXT (field) == origin)
2473 {
2474 if (using_new)
2475 error ("uninitialized reference member in %q#T "
2476 "using %<new%> without new-initializer", origin);
2477 else
2478 error ("uninitialized reference member in %q#T", origin);
2479 }
40bb78ad 2480 else
0e02d8e3
PC
2481 {
2482 if (using_new)
2483 error ("uninitialized reference member in base %q#T "
2484 "of %q#T using %<new%> without new-initializer",
2485 DECL_CONTEXT (field), origin);
2486 else
2487 error ("uninitialized reference member in base %q#T "
2488 "of %q#T", DECL_CONTEXT (field), origin);
2489 }
40bb78ad 2490 inform (DECL_SOURCE_LOCATION (field),
816551fe 2491 "%q#D should be initialized", field);
40bb78ad 2492 }
9d809e8f
FC
2493 }
2494
2495 if (CP_TYPE_CONST_P (field_type))
2496 {
40bb78ad
FC
2497 ++ error_count;
2498 if (complain)
2499 {
0e02d8e3
PC
2500 if (DECL_CONTEXT (field) == origin)
2501 {
2502 if (using_new)
2503 error ("uninitialized const member in %q#T "
2504 "using %<new%> without new-initializer", origin);
2505 else
2506 error ("uninitialized const member in %q#T", origin);
2507 }
40bb78ad 2508 else
0e02d8e3
PC
2509 {
2510 if (using_new)
2511 error ("uninitialized const member in base %q#T "
2512 "of %q#T using %<new%> without new-initializer",
2513 DECL_CONTEXT (field), origin);
2514 else
2515 error ("uninitialized const member in base %q#T "
2516 "of %q#T", DECL_CONTEXT (field), origin);
2517 }
40bb78ad 2518 inform (DECL_SOURCE_LOCATION (field),
816551fe 2519 "%q#D should be initialized", field);
40bb78ad 2520 }
9d809e8f
FC
2521 }
2522
2523 if (CLASS_TYPE_P (field_type))
40bb78ad
FC
2524 error_count
2525 += diagnose_uninitialized_cst_or_ref_member_1 (field_type, origin,
2526 using_new, complain);
9d809e8f 2527 }
40bb78ad 2528 return error_count;
9d809e8f
FC
2529}
2530
40bb78ad
FC
2531int
2532diagnose_uninitialized_cst_or_ref_member (tree type, bool using_new, bool complain)
9d809e8f 2533{
40bb78ad 2534 return diagnose_uninitialized_cst_or_ref_member_1 (type, type, using_new, complain);
9d809e8f
FC
2535}
2536
7d5e76c8
JM
2537/* Call __cxa_bad_array_new_length to indicate that the size calculation
2538 overflowed. Pretend it returns sizetype so that it plays nicely in the
2539 COND_EXPR. */
2540
2541tree
2542throw_bad_array_new_length (void)
2543{
4b4b2e58
NS
2544 if (!fn)
2545 {
2546 tree name = get_identifier ("__cxa_throw_bad_array_new_length");
2547
87e3d7cf 2548 fn = get_global_binding (name);
4b4b2e58
NS
2549 if (!fn)
2550 fn = push_throw_library_fn
2551 (name, build_function_type_list (sizetype, NULL_TREE));
2552 }
7d5e76c8
JM
2553
2554 return build_cxx_call (fn, 0, NULL, tf_warning_or_error);
2555}
2556
e2f5cc96
MS
2557/* Attempt to verify that the argument, OPER, of a placement new expression
2558 refers to an object sufficiently large for an object of TYPE or an array
2559 of NELTS of such objects when NELTS is non-null, and issue a warning when
2560 it does not. SIZE specifies the size needed to construct the object or
2561 array and captures the result of NELTS * sizeof (TYPE). (SIZE could be
2562 greater when the array under construction requires a cookie to store
2563 NELTS. GCC's placement new expression stores the cookie when invoking
2564 a user-defined placement new operator function but not the default one.
2565 Placement new expressions with user-defined placement new operator are
2566 not diagnosed since we don't know how they use the buffer (this could
2567 be a future extension). */
2568static void
2569warn_placement_new_too_small (tree type, tree nelts, tree size, tree oper)
2570{
f9d0ca40 2571 location_t loc = cp_expr_loc_or_input_loc (oper);
e2f5cc96 2572
e2f5cc96
MS
2573 STRIP_NOPS (oper);
2574
2575 /* Using a function argument or a (non-array) variable as an argument
2576 to placement new is not checked since it's unknown what it might
2577 point to. */
2578 if (TREE_CODE (oper) == PARM_DECL
86287716 2579 || VAR_P (oper)
e2f5cc96
MS
2580 || TREE_CODE (oper) == COMPONENT_REF)
2581 return;
2582
2583 /* Evaluate any constant expressions. */
2584 size = fold_non_dependent_expr (size);
2585
de05c19d
MS
2586 access_ref ref;
2587 ref.eval = [](tree x){ return fold_non_dependent_expr (x); };
2588 ref.trail1special = warn_placement_new < 2;
2589 tree objsize = compute_objsize (oper, 1, &ref);
2590 if (!objsize)
2591 return;
e2f5cc96 2592
de05c19d
MS
2593 offset_int bytes_avail = wi::to_offset (objsize);
2594 offset_int bytes_need;
e2f5cc96 2595
de05c19d
MS
2596 if (CONSTANT_CLASS_P (size))
2597 bytes_need = wi::to_offset (size);
2598 else if (nelts && CONSTANT_CLASS_P (nelts))
2599 bytes_need = (wi::to_offset (nelts)
2600 * wi::to_offset (TYPE_SIZE_UNIT (type)));
2601 else if (tree_fits_uhwi_p (TYPE_SIZE_UNIT (type)))
2602 bytes_need = wi::to_offset (TYPE_SIZE_UNIT (type));
2603 else
46cb9332 2604 {
de05c19d
MS
2605 /* The type is a VLA. */
2606 return;
46cb9332 2607 }
e2f5cc96 2608
de05c19d
MS
2609 if (bytes_avail >= bytes_need)
2610 return;
e2f5cc96 2611
de05c19d
MS
2612 /* True when the size to mention in the warning is exact as opposed
2613 to "at least N". */
2614 const bool exact_size = (ref.offrng[0] == ref.offrng[1]
2615 || ref.sizrng[1] - ref.offrng[0] == 0);
2616
2617 tree opertype = ref.ref ? TREE_TYPE (ref.ref) : TREE_TYPE (oper);
2618 bool warned = false;
2619 if (nelts)
2620 nelts = fold_for_warn (nelts);
2621 if (nelts)
2622 if (CONSTANT_CLASS_P (nelts))
2623 warned = warning_at (loc, OPT_Wplacement_new_,
2624 (exact_size
2625 ? G_("placement new constructing an object "
2626 "of type %<%T [%wu]%> and size %qwu "
2627 "in a region of type %qT and size %qwi")
2628 : G_("placement new constructing an object "
2629 "of type %<%T [%wu]%> and size %qwu "
2630 "in a region of type %qT and size "
2631 "at most %qwu")),
2632 type, tree_to_uhwi (nelts),
2633 bytes_need.to_uhwi (),
2634 opertype, bytes_avail.to_uhwi ());
2635 else
2636 warned = warning_at (loc, OPT_Wplacement_new_,
2637 (exact_size
2638 ? G_("placement new constructing an array "
2639 "of objects of type %qT and size %qwu "
2640 "in a region of type %qT and size %qwi")
2641 : G_("placement new constructing an array "
2642 "of objects of type %qT and size %qwu "
2643 "in a region of type %qT and size "
2644 "at most %qwu")),
2645 type, bytes_need.to_uhwi (), opertype,
2646 bytes_avail.to_uhwi ());
2647 else
2648 warned = warning_at (loc, OPT_Wplacement_new_,
2649 (exact_size
2650 ? G_("placement new constructing an object "
2651 "of type %qT and size %qwu in a region "
2652 "of type %qT and size %qwi")
2653 : G_("placement new constructing an object "
2654 "of type %qT "
2655 "and size %qwu in a region of type %qT "
2656 "and size at most %qwu")),
2657 type, bytes_need.to_uhwi (), opertype,
2658 bytes_avail.to_uhwi ());
2659
2660 if (!warned || !ref.ref)
2661 return;
e2f5cc96 2662
de05c19d
MS
2663 if (ref.offrng[0] == 0 || !ref.offset_bounded ())
2664 /* Avoid mentioning the offset when its lower bound is zero
2665 or when it's impossibly large. */
2666 inform (DECL_SOURCE_LOCATION (ref.ref),
2667 "%qD declared here", ref.ref);
2668 else if (ref.offrng[0] == ref.offrng[1])
2669 inform (DECL_SOURCE_LOCATION (ref.ref),
2670 "at offset %wi from %qD declared here",
2671 ref.offrng[0].to_shwi (), ref.ref);
2672 else
2673 inform (DECL_SOURCE_LOCATION (ref.ref),
2674 "at offset [%wi, %wi] from %qD declared here",
2675 ref.offrng[0].to_shwi (), ref.offrng[1].to_shwi (), ref.ref);
e2f5cc96
MS
2676}
2677
af63ba4b
JM
2678/* True if alignof(T) > __STDCPP_DEFAULT_NEW_ALIGNMENT__. */
2679
2680bool
2681type_has_new_extended_alignment (tree t)
2682{
2e1c20b1
JJ
2683 return (aligned_new_threshold
2684 && TYPE_ALIGN_UNIT (t) > (unsigned)aligned_new_threshold);
af63ba4b
JM
2685}
2686
2ec69f56
JM
2687/* Return the alignment we expect malloc to guarantee. This should just be
2688 MALLOC_ABI_ALIGNMENT, but that macro defaults to only BITS_PER_WORD for some
2689 reason, so don't let the threshold be smaller than max_align_t_align. */
2690
2691unsigned
2692malloc_alignment ()
2693{
2694 return MAX (max_align_t_align(), MALLOC_ABI_ALIGNMENT);
2695}
2696
ece3b7e6 2697/* Determine whether an allocation function is a namespace-scope
cf9847d2 2698 non-replaceable placement new function. See DR 1748. */
8bee092e
JJ
2699static bool
2700std_placement_new_fn_p (tree alloc_fn)
ece3b7e6 2701{
8f2b097e 2702 if (DECL_NAMESPACE_SCOPE_P (alloc_fn))
ece3b7e6
VV
2703 {
2704 tree first_arg = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (alloc_fn)));
2705 if ((TREE_VALUE (first_arg) == ptr_type_node)
2706 && TREE_CHAIN (first_arg) == void_list_node)
2707 return true;
2708 }
2709 return false;
2710}
2711
8e007055
JJ
2712/* For element type ELT_TYPE, return the appropriate type of the heap object
2713 containing such element(s). COOKIE_SIZE is NULL or the size of cookie
2714 in bytes. FULL_SIZE is NULL if it is unknown how big the heap allocation
2715 will be, otherwise size of the heap object. If COOKIE_SIZE is NULL,
2716 return array type ELT_TYPE[FULL_SIZE / sizeof(ELT_TYPE)], otherwise return
2717 struct { size_t[COOKIE_SIZE/sizeof(size_t)]; ELT_TYPE[N]; }
2718 where N is nothing (flexible array member) if FULL_SIZE is NULL, otherwise
2719 it is computed such that the size of the struct fits into FULL_SIZE. */
2720
2721tree
2722build_new_constexpr_heap_type (tree elt_type, tree cookie_size, tree full_size)
2723{
2724 gcc_assert (cookie_size == NULL_TREE || tree_fits_uhwi_p (cookie_size));
2725 gcc_assert (full_size == NULL_TREE || tree_fits_uhwi_p (full_size));
2726 unsigned HOST_WIDE_INT csz = cookie_size ? tree_to_uhwi (cookie_size) : 0;
2727 tree itype2 = NULL_TREE;
2728 if (full_size)
2729 {
2730 unsigned HOST_WIDE_INT fsz = tree_to_uhwi (full_size);
2731 gcc_assert (fsz >= csz);
2732 fsz -= csz;
2733 fsz /= int_size_in_bytes (elt_type);
2734 itype2 = build_index_type (size_int (fsz - 1));
2735 if (!cookie_size)
2736 return build_cplus_array_type (elt_type, itype2);
2737 }
2738 else
2739 gcc_assert (cookie_size);
2740 csz /= int_size_in_bytes (sizetype);
2741 tree itype1 = build_index_type (size_int (csz - 1));
2742 tree atype1 = build_cplus_array_type (sizetype, itype1);
2743 tree atype2 = build_cplus_array_type (elt_type, itype2);
2744 tree rtype = cxx_make_type (RECORD_TYPE);
2745 TYPE_NAME (rtype) = heap_identifier;
2746 tree fld1 = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE, atype1);
2747 tree fld2 = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE, atype2);
2748 DECL_FIELD_CONTEXT (fld1) = rtype;
2749 DECL_FIELD_CONTEXT (fld2) = rtype;
2750 DECL_ARTIFICIAL (fld1) = true;
2751 DECL_ARTIFICIAL (fld2) = true;
2752 TYPE_FIELDS (rtype) = fld1;
2753 DECL_CHAIN (fld1) = fld2;
2754 layout_type (rtype);
2755 return rtype;
2756}
2757
2758/* Help the constexpr code to find the right type for the heap variable
2759 by adding a NOP_EXPR around ALLOC_CALL if needed for cookie_size.
2760 Return ALLOC_CALL or ALLOC_CALL cast to a pointer to
2761 struct { size_t[cookie_size/sizeof(size_t)]; elt_type[]; }. */
2762
2763static tree
2764maybe_wrap_new_for_constexpr (tree alloc_call, tree elt_type, tree cookie_size)
2765{
b04445d4 2766 if (cxx_dialect < cxx20)
8e007055
JJ
2767 return alloc_call;
2768
2769 if (current_function_decl != NULL_TREE
2770 && !DECL_DECLARED_CONSTEXPR_P (current_function_decl))
2771 return alloc_call;
2772
2773 tree call_expr = extract_call_expr (alloc_call);
2774 if (call_expr == error_mark_node)
2775 return alloc_call;
2776
2777 tree alloc_call_fndecl = cp_get_callee_fndecl_nofold (call_expr);
2778 if (alloc_call_fndecl == NULL_TREE
2779 || !IDENTIFIER_NEW_OP_P (DECL_NAME (alloc_call_fndecl))
2780 || CP_DECL_CONTEXT (alloc_call_fndecl) != global_namespace)
2781 return alloc_call;
2782
2783 tree rtype = build_new_constexpr_heap_type (elt_type, cookie_size,
2784 NULL_TREE);
2785 return build_nop (build_pointer_type (rtype), alloc_call);
2786}
2787
63c9a190
MM
2788/* Generate code for a new-expression, including calling the "operator
2789 new" function, initializing the object, and, if an exception occurs
2790 during construction, cleaning up. The arguments are as for
685c8340
MS
2791 build_raw_new_expr. This may change PLACEMENT and INIT.
2792 TYPE is the type of the object being constructed, possibly an array
2793 of NELTS elements when NELTS is non-null (in "new T[NELTS]", T may
2794 be an array of the form U[inner], with the whole expression being
2795 "new U[NELTS][inner]"). */
a0d5fba7 2796
834c6dff 2797static tree
9771b263
DN
2798build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
2799 vec<tree, va_gc> **init, bool globally_qualified_p,
c166b898 2800 tsubst_flags_t complain)
a0d5fba7 2801{
d746e87d
MM
2802 tree size, rval;
2803 /* True iff this is a call to "operator new[]" instead of just
c8094d83 2804 "operator new". */
d746e87d 2805 bool array_p = false;
9207099b
JM
2806 /* If ARRAY_P is true, the element type of the array. This is never
2807 an ARRAY_TYPE; for something like "new int[3][4]", the
d746e87d 2808 ELT_TYPE is "int". If ARRAY_P is false, this is the same type as
9207099b 2809 TYPE. */
d746e87d 2810 tree elt_type;
f4f4610e
MM
2811 /* The type of the new-expression. (This type is always a pointer
2812 type.) */
2813 tree pointer_type;
25357d1e 2814 tree non_const_pointer_type;
685c8340 2815 /* The most significant array bound in int[OUTER_NELTS][inner]. */
a48cccea 2816 tree outer_nelts = NULL_TREE;
685c8340
MS
2817 /* For arrays with a non-constant number of elements, a bounds checks
2818 on the NELTS parameter to avoid integer overflow at runtime. */
4a84253c 2819 tree outer_nelts_check = NULL_TREE;
4ebc46e9 2820 bool outer_nelts_from_type = false;
685c8340 2821 /* Number of the "inner" elements in "new T[OUTER_NELTS][inner]". */
807e902e 2822 offset_int inner_nelts_count = 1;
f4f4610e 2823 tree alloc_call, alloc_expr;
685c8340 2824 /* Size of the inner array elements (those with constant dimensions). */
807e902e 2825 offset_int inner_size;
f4f4610e
MM
2826 /* The address returned by the call to "operator new". This node is
2827 a VAR_DECL and is therefore reusable. */
2828 tree alloc_node;
46ff5047 2829 tree alloc_fn;
8b5e2ce4 2830 tree cookie_expr, init_expr;
089d6ea7 2831 int nothrow, check_new;
834c6dff
MM
2832 /* If non-NULL, the number of extra bytes to allocate at the
2833 beginning of the storage allocated for an array-new expression in
2834 order to store the number of elements. */
2835 tree cookie_size = NULL_TREE;
c166b898 2836 tree placement_first;
a9de800a 2837 tree placement_expr = NULL_TREE;
3f41ffd8
MM
2838 /* True if the function we are calling is a placement allocation
2839 function. */
2840 bool placement_allocation_fn_p;
f4f4610e 2841 /* True if the storage must be initialized, either by a constructor
34cd5ae7 2842 or due to an explicit new-initializer. */
f4f4610e
MM
2843 bool is_initialized;
2844 /* The address of the thing allocated, not including any cookie. In
2845 particular, if an array cookie is in use, DATA_ADDR is the
2846 address of the first array element. This node is a VAR_DECL, and
2847 is therefore reusable. */
2848 tree data_addr;
6de9cd9a 2849 tree init_preeval_expr = NULL_TREE;
b75bf8b1 2850 tree orig_type = type;
a0d5fba7 2851
058b15c1 2852 if (nelts)
a0d5fba7 2853 {
058b15c1 2854 outer_nelts = nelts;
d746e87d 2855 array_p = true;
a0d5fba7 2856 }
9207099b 2857 else if (TREE_CODE (type) == ARRAY_TYPE)
d746e87d 2858 {
4ebc46e9
FW
2859 /* Transforms new (T[N]) to new T[N]. The former is a GNU
2860 extension for variable N. (This also covers new T where T is
2861 a VLA typedef.) */
9207099b
JM
2862 array_p = true;
2863 nelts = array_type_nelts_top (type);
2864 outer_nelts = nelts;
2865 type = TREE_TYPE (type);
4ebc46e9 2866 outer_nelts_from_type = true;
d746e87d 2867 }
834c6dff 2868
ea219e6e 2869 /* Lots of logic below depends on whether we have a constant number of
cda0a029 2870 elements, so go ahead and fold it now. */
e56f6629 2871 const_tree cst_outer_nelts = fold_non_dependent_expr (outer_nelts, complain);
cda0a029 2872
8d08fdba
MS
2873 /* If our base type is an array, then make sure we know how many elements
2874 it has. */
d746e87d
MM
2875 for (elt_type = type;
2876 TREE_CODE (elt_type) == ARRAY_TYPE;
2877 elt_type = TREE_TYPE (elt_type))
4ebc46e9
FW
2878 {
2879 tree inner_nelts = array_type_nelts_top (elt_type);
2880 tree inner_nelts_cst = maybe_constant_value (inner_nelts);
e1f10dd9 2881 if (TREE_CODE (inner_nelts_cst) == INTEGER_CST)
4a84253c 2882 {
4a669ac3 2883 wi::overflow_type overflow;
807e902e
KZ
2884 offset_int result = wi::mul (wi::to_offset (inner_nelts_cst),
2885 inner_nelts_count, SIGNED, &overflow);
9be0ac8c 2886 if (overflow)
4a84253c
FW
2887 {
2888 if (complain & tf_error)
2889 error ("integer overflow in array size");
2890 nelts = error_mark_node;
2891 }
2892 inner_nelts_count = result;
2893 }
2894 else
4ebc46e9
FW
2895 {
2896 if (complain & tf_error)
2897 {
f9d0ca40 2898 error_at (cp_expr_loc_or_input_loc (inner_nelts),
b75bf8b1 2899 "array size in new-expression must be constant");
4ebc46e9
FW
2900 cxx_constant_value(inner_nelts);
2901 }
2902 nelts = error_mark_node;
2903 }
2904 if (nelts != error_mark_node)
2905 nelts = cp_build_binary_op (input_location,
2906 MULT_EXPR, nelts,
2907 inner_nelts_cst,
2908 complain);
2909 }
2910
02a32ab4
RS
2911 if (!verify_type_context (input_location, TCTX_ALLOCATION, elt_type,
2912 !(complain & tf_error)))
2913 return error_mark_node;
2914
4ebc46e9
FW
2915 if (variably_modified_type_p (elt_type, NULL_TREE) && (complain & tf_error))
2916 {
b75bf8b1 2917 error ("variably modified type not allowed in new-expression");
4ebc46e9
FW
2918 return error_mark_node;
2919 }
2920
2921 if (nelts == error_mark_node)
2922 return error_mark_node;
2923
2924 /* Warn if we performed the (T[N]) to T[N] transformation and N is
2925 variable. */
2926 if (outer_nelts_from_type
ea219e6e 2927 && !TREE_CONSTANT (cst_outer_nelts))
4ebc46e9
FW
2928 {
2929 if (complain & tf_warning_or_error)
b75bf8b1 2930 {
f9d0ca40 2931 pedwarn (cp_expr_loc_or_input_loc (outer_nelts), OPT_Wvla,
24f12823 2932 typedef_variant_p (orig_type)
324ff1a0 2933 ? G_("non-constant array new length must be specified "
a9c697b8 2934 "directly, not by %<typedef%>")
24f12823
VR
2935 : G_("non-constant array new length must be specified "
2936 "without parentheses around the type-id"));
b75bf8b1 2937 }
4ebc46e9
FW
2938 else
2939 return error_mark_node;
2940 }
5566b478 2941
50e10fa8 2942 if (VOID_TYPE_P (elt_type))
e1cd6e56 2943 {
5ade1ed2 2944 if (complain & tf_error)
a9c697b8 2945 error ("invalid type %<void%> for %<new%>");
e1cd6e56
MS
2946 return error_mark_node;
2947 }
2948
f620e64a 2949 if (is_std_init_list (elt_type) && !cp_unevaluated_operand)
04eb9c55 2950 warning (OPT_Winit_list_lifetime,
a9c697b8 2951 "%<new%> of %<initializer_list%> does not "
04eb9c55
JM
2952 "extend the lifetime of the underlying array");
2953
2df663cc 2954 if (abstract_virtuals_error_sfinae (ACU_NEW, elt_type, complain))
a7a64a77 2955 return error_mark_node;
8926095f 2956
95552437 2957 is_initialized = (type_build_ctor_call (elt_type) || *init != NULL);
b87d79e6 2958
eca7fc57 2959 if (*init == NULL && cxx_dialect < cxx11)
9d809e8f 2960 {
40bb78ad 2961 bool maybe_uninitialized_error = false;
9d809e8f
FC
2962 /* A program that calls for default-initialization [...] of an
2963 entity of reference type is ill-formed. */
2964 if (CLASSTYPE_REF_FIELDS_NEED_INIT (elt_type))
40bb78ad 2965 maybe_uninitialized_error = true;
9d809e8f
FC
2966
2967 /* A new-expression that creates an object of type T initializes
2968 that object as follows:
2969 - If the new-initializer is omitted:
2970 -- If T is a (possibly cv-qualified) non-POD class type
2971 (or array thereof), the object is default-initialized (8.5).
2972 [...]
2973 -- Otherwise, the object created has indeterminate
2974 value. If T is a const-qualified type, or a (possibly
2975 cv-qualified) POD class type (or array thereof)
2976 containing (directly or indirectly) a member of
2977 const-qualified type, the program is ill-formed; */
2978
2979 if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (elt_type))
40bb78ad 2980 maybe_uninitialized_error = true;
9d809e8f 2981
40bb78ad
FC
2982 if (maybe_uninitialized_error
2983 && diagnose_uninitialized_cst_or_ref_member (elt_type,
2984 /*using_new=*/true,
2985 complain & tf_error))
2986 return error_mark_node;
9d809e8f
FC
2987 }
2988
c166b898 2989 if (CP_TYPE_CONST_P (elt_type) && *init == NULL
6132bdd7 2990 && default_init_uninitialized_part (elt_type))
f4f4610e 2991 {
5ade1ed2
DG
2992 if (complain & tf_error)
2993 error ("uninitialized const in %<new%> of %q#T", elt_type);
f4f4610e
MM
2994 return error_mark_node;
2995 }
2996
d746e87d
MM
2997 size = size_in_bytes (elt_type);
2998 if (array_p)
4a84253c
FW
2999 {
3000 /* Maximum available size in bytes. Half of the address space
3001 minus the cookie size. */
807e902e
KZ
3002 offset_int max_size
3003 = wi::set_bit_in_zero <offset_int> (TYPE_PRECISION (sizetype) - 1);
4a84253c 3004 /* Maximum number of outer elements which can be allocated. */
807e902e 3005 offset_int max_outer_nelts;
4a84253c
FW
3006 tree max_outer_nelts_tree;
3007
3008 gcc_assert (TREE_CODE (size) == INTEGER_CST);
3009 cookie_size = targetm.cxx.get_cookie_size (elt_type);
3010 gcc_assert (TREE_CODE (cookie_size) == INTEGER_CST);
807e902e 3011 gcc_checking_assert (wi::ltu_p (wi::to_offset (cookie_size), max_size));
c65cb8d1 3012 /* Unconditionally subtract the cookie size. This decreases the
4a84253c
FW
3013 maximum object size and is safe even if we choose not to use
3014 a cookie after all. */
807e902e 3015 max_size -= wi::to_offset (cookie_size);
4a669ac3 3016 wi::overflow_type overflow;
807e902e
KZ
3017 inner_size = wi::mul (wi::to_offset (size), inner_nelts_count, SIGNED,
3018 &overflow);
3019 if (overflow || wi::gtu_p (inner_size, max_size))
4a84253c
FW
3020 {
3021 if (complain & tf_error)
28a8cef1
MS
3022 {
3023 cst_size_error error;
3024 if (overflow)
3025 error = cst_size_overflow;
3026 else
3027 {
3028 error = cst_size_too_big;
3029 size = size_binop (MULT_EXPR, size,
3030 wide_int_to_tree (sizetype,
3031 inner_nelts_count));
3032 size = cp_fully_fold (size);
3033 }
3034 invalid_array_size_error (input_location, error, size,
3035 /*name=*/NULL_TREE);
3036 }
4a84253c
FW
3037 return error_mark_node;
3038 }
807e902e
KZ
3039
3040 max_outer_nelts = wi::udiv_trunc (max_size, inner_size);
807e902e 3041 max_outer_nelts_tree = wide_int_to_tree (sizetype, max_outer_nelts);
4a84253c 3042
cda0a029 3043 size = size_binop (MULT_EXPR, size, fold_convert (sizetype, nelts));
685c8340 3044
ea219e6e 3045 if (TREE_CODE (cst_outer_nelts) == INTEGER_CST)
685c8340 3046 {
ea219e6e 3047 if (tree_int_cst_lt (max_outer_nelts_tree, cst_outer_nelts))
685c8340
MS
3048 {
3049 /* When the array size is constant, check it at compile time
3050 to make sure it doesn't exceed the implementation-defined
3051 maximum, as required by C++ 14 (in C++ 11 this requirement
3052 isn't explicitly stated but it's enforced anyway -- see
3053 grokdeclarator in cp/decl.c). */
3054 if (complain & tf_error)
28a8cef1
MS
3055 {
3056 size = cp_fully_fold (size);
3057 invalid_array_size_error (input_location, cst_size_too_big,
3058 size, NULL_TREE);
3059 }
685c8340
MS
3060 return error_mark_node;
3061 }
3062 }
3063 else
3064 {
3065 /* When a runtime check is necessary because the array size
3066 isn't constant, keep only the top-most seven bits (starting
3067 with the most significant non-zero bit) of the maximum size
3068 to compare the array size against, to simplify encoding the
3069 constant maximum size in the instruction stream. */
3070
3071 unsigned shift = (max_outer_nelts.get_precision ()) - 7
3072 - wi::clz (max_outer_nelts);
8de73453 3073 max_outer_nelts = (max_outer_nelts >> shift) << shift;
685c8340
MS
3074
3075 outer_nelts_check = fold_build2 (LE_EXPR, boolean_type_node,
3076 outer_nelts,
3077 max_outer_nelts_tree);
3078 }
4a84253c 3079 }
a28e3c7f 3080
af63ba4b
JM
3081 tree align_arg = NULL_TREE;
3082 if (type_has_new_extended_alignment (elt_type))
3083 align_arg = build_int_cst (align_type_node, TYPE_ALIGN_UNIT (elt_type));
3084
63c9a190
MM
3085 alloc_fn = NULL_TREE;
3086
c166b898
ILT
3087 /* If PLACEMENT is a single simple pointer type not passed by
3088 reference, prepare to capture it in a temporary variable. Do
3089 this now, since PLACEMENT will change in the calls below. */
c166b898 3090 placement_first = NULL_TREE;
9771b263 3091 if (vec_safe_length (*placement) == 1
50e10fa8 3092 && (TYPE_PTR_P (TREE_TYPE ((**placement)[0]))))
9771b263 3093 placement_first = (**placement)[0];
c166b898 3094
e2f5cc96
MS
3095 bool member_new_p = false;
3096
e92cc029 3097 /* Allocate the object. */
bfecd57c
JJ
3098 tree fnname;
3099 tree fns;
6de9cd9a 3100
88a819be 3101 fnname = ovl_op_identifier (false, array_p ? VEC_NEW_EXPR : NEW_EXPR);
71b71b96 3102
bfecd57c
JJ
3103 member_new_p = !globally_qualified_p
3104 && CLASS_TYPE_P (elt_type)
3105 && (array_p
3106 ? TYPE_HAS_ARRAY_NEW_OPERATOR (elt_type)
3107 : TYPE_HAS_NEW_OPERATOR (elt_type));
a3d536f1 3108
bfecd57c
JJ
3109 if (member_new_p)
3110 {
3111 /* Use a class-specific operator new. */
3112 /* If a cookie is required, add some extra space. */
3113 if (array_p && TYPE_VEC_NEW_USES_COOKIE (elt_type))
3114 size = size_binop (PLUS_EXPR, size, cookie_size);
3115 else
b1e5b86c 3116 {
bfecd57c
JJ
3117 cookie_size = NULL_TREE;
3118 /* No size arithmetic necessary, so the size check is
3119 not needed. */
3120 if (outer_nelts_check != NULL && inner_size == 1)
3121 outer_nelts_check = NULL_TREE;
3122 }
3123 /* Perform the overflow check. */
3124 tree errval = TYPE_MAX_VALUE (sizetype);
3125 if (cxx_dialect >= cxx11 && flag_exceptions)
3126 errval = throw_bad_array_new_length ();
3127 if (outer_nelts_check != NULL_TREE)
3128 size = fold_build3 (COND_EXPR, sizetype, outer_nelts_check,
3129 size, errval);
3130 /* Create the argument list. */
3131 vec_safe_insert (*placement, 0, size);
3132 /* Do name-lookup to find the appropriate operator. */
098cf31a 3133 fns = lookup_fnfields (elt_type, fnname, /*protect=*/2, complain);
bfecd57c 3134 if (fns == NULL_TREE)
b1e5b86c 3135 {
bfecd57c
JJ
3136 if (complain & tf_error)
3137 error ("no suitable %qD found in class %qT", fnname, elt_type);
6961a592
GB
3138 return error_mark_node;
3139 }
bfecd57c 3140 if (TREE_CODE (fns) == TREE_LIST)
dd125026
JJ
3141 {
3142 if (complain & tf_error)
bfecd57c
JJ
3143 {
3144 error ("request for member %qD is ambiguous", fnname);
3145 print_candidates (fns);
3146 }
dd125026
JJ
3147 return error_mark_node;
3148 }
bfecd57c
JJ
3149 tree dummy = build_dummy_object (elt_type);
3150 alloc_call = NULL_TREE;
3151 if (align_arg)
3152 {
3153 vec<tree, va_gc> *align_args
3154 = vec_copy_and_insert (*placement, align_arg, 1);
3155 alloc_call
3156 = build_new_method_call (dummy, fns, &align_args,
3157 /*conversion_path=*/NULL_TREE,
3158 LOOKUP_NORMAL, &alloc_fn, tf_none);
3159 /* If no matching function is found and the allocated object type
3160 has new-extended alignment, the alignment argument is removed
3161 from the argument list, and overload resolution is performed
3162 again. */
3163 if (alloc_call == error_mark_node)
3164 alloc_call = NULL_TREE;
3165 }
3166 if (!alloc_call)
3167 alloc_call = build_new_method_call (dummy, fns, placement,
3168 /*conversion_path=*/NULL_TREE,
3169 LOOKUP_NORMAL,
3170 &alloc_fn, complain);
360f866c 3171 }
8d08fdba
MS
3172 else
3173 {
bfecd57c
JJ
3174 /* Use a global operator new. */
3175 /* See if a cookie might be required. */
3176 if (!(array_p && TYPE_VEC_NEW_USES_COOKIE (elt_type)))
089d6ea7 3177 {
bfecd57c
JJ
3178 cookie_size = NULL_TREE;
3179 /* No size arithmetic necessary, so the size check is
3180 not needed. */
3181 if (outer_nelts_check != NULL && inner_size == 1)
3182 outer_nelts_check = NULL_TREE;
089d6ea7 3183 }
125e6594 3184
bfecd57c
JJ
3185 alloc_call = build_operator_new_call (fnname, placement,
3186 &size, &cookie_size,
3187 align_arg, outer_nelts_check,
3188 &alloc_fn, complain);
8d08fdba
MS
3189 }
3190
96790071 3191 if (alloc_call == error_mark_node)
2bb5d995
JM
3192 return error_mark_node;
3193
63c9a190
MM
3194 gcc_assert (alloc_fn != NULL_TREE);
3195
2ec69f56
JM
3196 /* Now, check to see if this function is actually a placement
3197 allocation function. This can happen even when PLACEMENT is NULL
3198 because we might have something like:
3199
3200 struct S { void* operator new (size_t, int i = 0); };
3201
3202 A call to `new S' will get this allocation function, even though
3203 there is no explicit placement argument. If there is more than
3204 one argument, or there are variable arguments, then this is a
3205 placement allocation function. */
3206 placement_allocation_fn_p
3207 = (type_num_arguments (TREE_TYPE (alloc_fn)) > 1
3208 || varargs_function_p (alloc_fn));
3209
af63ba4b 3210 if (warn_aligned_new
2ec69f56
JM
3211 && !placement_allocation_fn_p
3212 && TYPE_ALIGN (elt_type) > malloc_alignment ()
af63ba4b
JM
3213 && (warn_aligned_new > 1
3214 || CP_DECL_CONTEXT (alloc_fn) == global_namespace)
3215 && !aligned_allocation_fn_p (alloc_fn))
3216 {
097f82ec 3217 auto_diagnostic_group d;
34d57a10
JW
3218 if (warning (OPT_Waligned_new_, "%<new%> of type %qT with extended "
3219 "alignment %d", elt_type, TYPE_ALIGN_UNIT (elt_type)))
3220 {
3221 inform (input_location, "uses %qD, which does not have an alignment "
3222 "parameter", alloc_fn);
3223 if (!aligned_new_threshold)
3224 inform (input_location, "use %<-faligned-new%> to enable C++17 "
3225 "over-aligned new support");
3226 }
af63ba4b
JM
3227 }
3228
c166b898
ILT
3229 /* If we found a simple case of PLACEMENT_EXPR above, then copy it
3230 into a temporary variable. */
a9de800a 3231 if (!processing_template_decl
a9de800a
JJ
3232 && TREE_CODE (alloc_call) == CALL_EXPR
3233 && call_expr_nargs (alloc_call) == 2
3234 && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (alloc_call, 0))) == INTEGER_TYPE
50e10fa8 3235 && TYPE_PTR_P (TREE_TYPE (CALL_EXPR_ARG (alloc_call, 1))))
a9de800a 3236 {
e2f5cc96 3237 tree placement = CALL_EXPR_ARG (alloc_call, 1);
a9de800a 3238
e2f5cc96
MS
3239 if (placement_first != NULL_TREE
3240 && (INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (TREE_TYPE (placement)))
3241 || VOID_TYPE_P (TREE_TYPE (TREE_TYPE (placement)))))
a9de800a 3242 {
c166b898 3243 placement_expr = get_target_expr (placement_first);
a9de800a 3244 CALL_EXPR_ARG (alloc_call, 1)
cda0a029 3245 = fold_convert (TREE_TYPE (placement), placement_expr);
e2f5cc96
MS
3246 }
3247
3248 if (!member_new_p
3249 && VOID_TYPE_P (TREE_TYPE (TREE_TYPE (CALL_EXPR_ARG (alloc_call, 1)))))
3250 {
3251 /* Attempt to make the warning point at the operator new argument. */
3252 if (placement_first)
3253 placement = placement_first;
3254
3255 warn_placement_new_too_small (orig_type, nelts, size, placement);
a9de800a
JJ
3256 }
3257 }
3258
8e007055
JJ
3259 if (cookie_size)
3260 alloc_call = maybe_wrap_new_for_constexpr (alloc_call, elt_type,
3261 cookie_size);
3262
a6111661
JM
3263 /* In the simple case, we can stop now. */
3264 pointer_type = build_pointer_type (type);
3265 if (!cookie_size && !is_initialized)
4d7a65ea 3266 return build_nop (pointer_type, alloc_call);
a6111661 3267
10ee5386
JM
3268 /* Store the result of the allocation call in a variable so that we can
3269 use it more than once. */
3270 alloc_expr = get_target_expr (alloc_call);
a6111661
JM
3271 alloc_node = TARGET_EXPR_SLOT (alloc_expr);
3272
3273 /* Strip any COMPOUND_EXPRs from ALLOC_CALL. */
c8094d83 3274 while (TREE_CODE (alloc_call) == COMPOUND_EXPR)
a6111661 3275 alloc_call = TREE_OPERAND (alloc_call, 1);
089d6ea7 3276
a6111661
JM
3277 /* Preevaluate the placement args so that we don't reevaluate them for a
3278 placement delete. */
3279 if (placement_allocation_fn_p)
3280 {
6de9cd9a
DN
3281 tree inits;
3282 stabilize_call (alloc_call, &inits);
a6111661 3283 if (inits)
f293ce4b
RS
3284 alloc_expr = build2 (COMPOUND_EXPR, TREE_TYPE (alloc_expr), inits,
3285 alloc_expr);
a6111661
JM
3286 }
3287
047f64a3
JM
3288 /* unless an allocation function is declared with an empty excep-
3289 tion-specification (_except.spec_), throw(), it indicates failure to
3290 allocate storage by throwing a bad_alloc exception (clause _except_,
3291 _lib.bad.alloc_); it returns a non-null pointer otherwise If the allo-
3292 cation function is declared with an empty exception-specification,
3293 throw(), it returns null to indicate failure to allocate storage and a
3294 non-null pointer otherwise.
3295
3296 So check for a null exception spec on the op new we just called. */
3297
46ff5047 3298 nothrow = TYPE_NOTHROW_P (TREE_TYPE (alloc_fn));
8bee092e
JJ
3299 check_new
3300 = flag_check_new || (nothrow && !std_placement_new_fn_p (alloc_fn));
047f64a3 3301
089d6ea7 3302 if (cookie_size)
8d08fdba 3303 {
96790071 3304 tree cookie;
46e995e0 3305 tree cookie_ptr;
b5119fa1 3306 tree size_ptr_type;
f4f4610e
MM
3307
3308 /* Adjust so we're pointing to the start of the object. */
5d49b6a7 3309 data_addr = fold_build_pointer_plus (alloc_node, cookie_size);
96790071 3310
834c6dff 3311 /* Store the number of bytes allocated so that we can know how
3461fba7
NS
3312 many elements to destroy later. We use the last sizeof
3313 (size_t) bytes to store the number of elements. */
10ee5386 3314 cookie_ptr = size_binop (MINUS_EXPR, cookie_size, size_in_bytes (sizetype));
5d49b6a7
RG
3315 cookie_ptr = fold_build_pointer_plus_loc (input_location,
3316 alloc_node, cookie_ptr);
b5119fa1 3317 size_ptr_type = build_pointer_type (sizetype);
10ee5386 3318 cookie_ptr = fold_convert (size_ptr_type, cookie_ptr);
04757a2a 3319 cookie = cp_build_fold_indirect_ref (cookie_ptr);
1f84ec23 3320
f293ce4b 3321 cookie_expr = build2 (MODIFY_EXPR, sizetype, cookie, nelts);
46e995e0
PB
3322
3323 if (targetm.cxx.cookie_has_size ())
3324 {
3325 /* Also store the element size. */
5d49b6a7 3326 cookie_ptr = fold_build_pointer_plus (cookie_ptr,
db3927fb 3327 fold_build1_loc (input_location,
5d49b6a7
RG
3328 NEGATE_EXPR, sizetype,
3329 size_in_bytes (sizetype)));
b2ec1738 3330
04757a2a 3331 cookie = cp_build_fold_indirect_ref (cookie_ptr);
f293ce4b 3332 cookie = build2 (MODIFY_EXPR, sizetype, cookie,
10ee5386 3333 size_in_bytes (elt_type));
f293ce4b
RS
3334 cookie_expr = build2 (COMPOUND_EXPR, TREE_TYPE (cookie_expr),
3335 cookie, cookie_expr);
46e995e0 3336 }
8d08fdba 3337 }
96790071 3338 else
8b5e2ce4
JM
3339 {
3340 cookie_expr = NULL_TREE;
3341 data_addr = alloc_node;
3342 }
8d08fdba 3343
10ee5386 3344 /* Now use a pointer to the type we've actually allocated. */
25357d1e
JM
3345
3346 /* But we want to operate on a non-const version to start with,
3347 since we'll be modifying the elements. */
3348 non_const_pointer_type = build_pointer_type
a3360e77 3349 (cp_build_qualified_type (type, cp_type_quals (type) & ~TYPE_QUAL_CONST));
25357d1e
JM
3350
3351 data_addr = fold_convert (non_const_pointer_type, data_addr);
9207099b 3352 /* Any further uses of alloc_node will want this type, too. */
25357d1e 3353 alloc_node = fold_convert (non_const_pointer_type, alloc_node);
10ee5386 3354
6de9cd9a
DN
3355 /* Now initialize the allocated object. Note that we preevaluate the
3356 initialization expression, apart from the actual constructor call or
3357 assignment--we do this because we want to delay the allocation as long
3358 as possible in order to minimize the size of the exception region for
3359 placement delete. */
f4f4610e 3360 if (is_initialized)
8d08fdba 3361 {
6de9cd9a 3362 bool stable;
844ae01d 3363 bool explicit_value_init_p = false;
6de9cd9a 3364
9771b263 3365 if (*init != NULL && (*init)->is_empty ())
6de9cd9a 3366 {
c166b898 3367 *init = NULL;
844ae01d
JM
3368 explicit_value_init_p = true;
3369 }
b84f4651 3370
38e10026 3371 if (processing_template_decl)
a67e7daa 3372 {
38e10026
MP
3373 /* Avoid an ICE when converting to a base in build_simple_base_path.
3374 We'll throw this all away anyway, and build_new will create
3375 a NEW_EXPR. */
3376 tree t = fold_convert (build_pointer_type (elt_type), data_addr);
a67e7daa
JM
3377 /* build_value_init doesn't work in templates, and we don't need
3378 the initializer anyway since we're going to throw it away and
3379 rebuild it at instantiation time, so just build up a single
3380 constructor call to get any appropriate diagnostics. */
38e10026 3381 init_expr = cp_build_fold_indirect_ref (t);
95552437 3382 if (type_build_ctor_call (elt_type))
a67e7daa
JM
3383 init_expr = build_special_member_call (init_expr,
3384 complete_ctor_identifier,
3385 init, elt_type,
3386 LOOKUP_NORMAL,
3387 complain);
3388 stable = stabilize_init (init_expr, &init_preeval_expr);
3389 }
3390 else if (array_p)
844ae01d 3391 {
25357d1e 3392 tree vecinit = NULL_TREE;
73a2b8dd
MP
3393 const size_t len = vec_safe_length (*init);
3394 if (len == 1 && DIRECT_LIST_INIT_P ((**init)[0]))
25357d1e 3395 {
9771b263 3396 vecinit = (**init)[0];
1f65a8c8
JM
3397 if (CONSTRUCTOR_NELTS (vecinit) == 0)
3398 /* List-value-initialization, leave it alone. */;
25357d1e
JM
3399 else
3400 {
1f65a8c8
JM
3401 tree arraytype, domain;
3402 if (TREE_CONSTANT (nelts))
3403 domain = compute_array_index_type (NULL_TREE, nelts,
3404 complain);
3405 else
7d5e76c8
JM
3406 /* We'll check the length at runtime. */
3407 domain = NULL_TREE;
1f65a8c8 3408 arraytype = build_cplus_array_type (type, domain);
b1c59b31
MP
3409 /* If we have new char[4]{"foo"}, we have to reshape
3410 so that the STRING_CST isn't wrapped in { }. */
3411 vecinit = reshape_init (arraytype, vecinit, complain);
3412 /* The middle end doesn't cope with the location wrapper
3413 around a STRING_CST. */
3414 STRIP_ANY_LOCATION_WRAPPER (vecinit);
1f65a8c8 3415 vecinit = digest_init (arraytype, vecinit, complain);
25357d1e 3416 }
25357d1e
JM
3417 }
3418 else if (*init)
5ade1ed2
DG
3419 {
3420 if (complain & tf_error)
3ec16e36
AO
3421 error ("parenthesized initializer in array new");
3422 return error_mark_node;
5ade1ed2 3423 }
6de9cd9a 3424 init_expr
b73a4704
JM
3425 = build_vec_init (data_addr,
3426 cp_build_binary_op (input_location,
3427 MINUS_EXPR, outer_nelts,
3428 integer_one_node,
3429 complain),
3430 vecinit,
3431 explicit_value_init_p,
3432 /*from_array=*/0,
3433 complain);
6de9cd9a
DN
3434
3435 /* An array initialization is stable because the initialization
3436 of each element is a full-expression, so the temporaries don't
3437 leak out. */
3438 stable = true;
3439 }
f30efcb7 3440 else
8d08fdba 3441 {
04757a2a 3442 init_expr = cp_build_fold_indirect_ref (data_addr);
9207099b 3443
95552437 3444 if (type_build_ctor_call (type) && !explicit_value_init_p)
b84f4651
MM
3445 {
3446 init_expr = build_special_member_call (init_expr,
3447 complete_ctor_identifier,
3448 init, elt_type,
5ade1ed2 3449 LOOKUP_NORMAL,
0e5def81 3450 complain|tf_no_cleanup);
844ae01d
JM
3451 }
3452 else if (explicit_value_init_p)
3453 {
1d7bc790
NS
3454 /* Something like `new int()'. NO_CLEANUP is needed so
3455 we don't try and build a (possibly ill-formed)
3456 destructor. */
3457 tree val = build_value_init (type, complain | tf_no_cleanup);
a67e7daa
JM
3458 if (val == error_mark_node)
3459 return error_mark_node;
3460 init_expr = build2 (INIT_EXPR, type, init_expr, val);
b84f4651 3461 }
8dc2b103 3462 else
b84f4651 3463 {
c166b898
ILT
3464 tree ie;
3465
b84f4651 3466 /* We are processing something like `new int (10)', which
c20f7e99 3467 means allocate an int, and initialize it with 10.
3db45ab5 3468
c20f7e99 3469 In C++20, also handle `new A(1, 2)'. */
b04445d4 3470 if (cxx_dialect >= cxx20
c20f7e99
MP
3471 && AGGREGATE_TYPE_P (type)
3472 && (*init)->length () > 1)
3473 {
73a2b8dd 3474 ie = build_constructor_from_vec (init_list_type_node, *init);
c20f7e99
MP
3475 CONSTRUCTOR_IS_DIRECT_INIT (ie) = true;
3476 CONSTRUCTOR_IS_PAREN_INIT (ie) = true;
3477 ie = digest_init (type, ie, complain);
3478 }
3479 else
3480 ie = build_x_compound_expr_from_vec (*init, "new initializer",
3481 complain);
4f2e1536
MP
3482 init_expr = cp_build_modify_expr (input_location, init_expr,
3483 INIT_EXPR, ie, complain);
b84f4651 3484 }
817a77e4
JM
3485 /* If the initializer uses C++14 aggregate NSDMI that refer to the
3486 object being initialized, replace them now and don't try to
3487 preevaluate. */
3488 bool had_placeholder = false;
2166aeb3 3489 if (!processing_template_decl
817a77e4
JM
3490 && TREE_CODE (init_expr) == INIT_EXPR)
3491 TREE_OPERAND (init_expr, 1)
3492 = replace_placeholders (TREE_OPERAND (init_expr, 1),
3493 TREE_OPERAND (init_expr, 0),
3494 &had_placeholder);
3495 stable = (!had_placeholder
3496 && stabilize_init (init_expr, &init_preeval_expr));
96790071
JM
3497 }
3498
3499 if (init_expr == error_mark_node)
3500 return error_mark_node;
1f109f0f 3501
20c39572
JM
3502 /* If any part of the object initialization terminates by throwing an
3503 exception and a suitable deallocation function can be found, the
3504 deallocation function is called to free the memory in which the
3505 object was being constructed, after which the exception continues
3506 to propagate in the context of the new-expression. If no
3507 unambiguous matching deallocation function can be found,
3508 propagating the exception does not cause the object's memory to be
3509 freed. */
bfecd57c 3510 if (flag_exceptions)
1f109f0f 3511 {
d746e87d 3512 enum tree_code dcode = array_p ? VEC_DELETE_EXPR : DELETE_EXPR;
96790071 3513 tree cleanup;
a7d87521 3514
5355deec 3515 /* The Standard is unclear here, but the right thing to do
f4f4610e
MM
3516 is to use the same method for finding deallocation
3517 functions that we use for finding allocation functions. */
10ee5386
JM
3518 cleanup = (build_op_delete_call
3519 (dcode,
9207099b 3520 alloc_node,
10ee5386
JM
3521 size,
3522 globally_qualified_p,
3523 placement_allocation_fn_p ? alloc_call : NULL_TREE,
4b978f96
PC
3524 alloc_fn,
3525 complain));
2bb14213 3526
6de9cd9a
DN
3527 if (!cleanup)
3528 /* We're done. */;
3529 else if (stable)
3530 /* This is much simpler if we were able to preevaluate all of
3531 the arguments to the constructor call. */
d665b6e5
MLI
3532 {
3533 /* CLEANUP is compiler-generated, so no diagnostics. */
3534 TREE_NO_WARNING (cleanup) = true;
3535 init_expr = build2 (TRY_CATCH_EXPR, void_type_node,
3536 init_expr, cleanup);
3537 /* Likewise, this try-catch is compiler-generated. */
3538 TREE_NO_WARNING (init_expr) = true;
3539 }
6de9cd9a
DN
3540 else
3541 /* Ack! First we allocate the memory. Then we set our sentry
3542 variable to true, and expand a cleanup that deletes the
3543 memory if sentry is true. Then we run the constructor, and
3544 finally clear the sentry.
3545
3546 We need to do this because we allocate the space first, so
3547 if there are any temporaries with cleanups in the
3548 constructor args and we weren't able to preevaluate them, we
3549 need this EH region to extend until end of full-expression
3550 to preserve nesting. */
da4768fe 3551 {
96790071 3552 tree end, sentry, begin;
2face519
JM
3553
3554 begin = get_target_expr (boolean_true_node);
659e5a7a 3555 CLEANUP_EH_ONLY (begin) = 1;
2face519 3556
659e5a7a
JM
3557 sentry = TARGET_EXPR_SLOT (begin);
3558
d665b6e5
MLI
3559 /* CLEANUP is compiler-generated, so no diagnostics. */
3560 TREE_NO_WARNING (cleanup) = true;
3561
659e5a7a 3562 TARGET_EXPR_CLEANUP (begin)
f293ce4b 3563 = build3 (COND_EXPR, void_type_node, sentry,
632f2871 3564 cleanup, void_node);
2face519 3565
f293ce4b
RS
3566 end = build2 (MODIFY_EXPR, TREE_TYPE (sentry),
3567 sentry, boolean_false_node);
2face519 3568
96790071 3569 init_expr
f293ce4b
RS
3570 = build2 (COMPOUND_EXPR, void_type_node, begin,
3571 build2 (COMPOUND_EXPR, void_type_node, init_expr,
3572 end));
d665b6e5
MLI
3573 /* Likewise, this is compiler-generated. */
3574 TREE_NO_WARNING (init_expr) = true;
da4768fe 3575 }
1f109f0f 3576 }
f4f4610e 3577 }
8b5e2ce4
JM
3578 else
3579 init_expr = NULL_TREE;
3580
3581 /* Now build up the return value in reverse order. */
96790071 3582
8b5e2ce4 3583 rval = data_addr;
2face519 3584
8b5e2ce4 3585 if (init_expr)
f293ce4b 3586 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), init_expr, rval);
8b5e2ce4 3587 if (cookie_expr)
f293ce4b 3588 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), cookie_expr, rval);
8b5e2ce4 3589
10ee5386 3590 if (rval == data_addr)
8b5e2ce4
JM
3591 /* If we don't have an initializer or a cookie, strip the TARGET_EXPR
3592 and return the call (which doesn't need to be adjusted). */
3593 rval = TARGET_EXPR_INITIAL (alloc_expr);
3594 else
d18c083e 3595 {
8b5e2ce4
JM
3596 if (check_new)
3597 {
ba47d38d
AH
3598 tree ifexp = cp_build_binary_op (input_location,
3599 NE_EXPR, alloc_node,
6d96d7ff 3600 nullptr_node,
5ade1ed2 3601 complain);
4cbc4bd7
PC
3602 rval = build_conditional_expr (input_location, ifexp, rval,
3603 alloc_node, complain);
8b5e2ce4 3604 }
d18c083e 3605
8b5e2ce4
JM
3606 /* Perform the allocation before anything else, so that ALLOC_NODE
3607 has been initialized before we start using it. */
f293ce4b 3608 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), alloc_expr, rval);
8b5e2ce4 3609 }
51c184be 3610
6de9cd9a 3611 if (init_preeval_expr)
f293ce4b 3612 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), init_preeval_expr, rval);
6de9cd9a 3613
d04a575f 3614 /* A new-expression is never an lvalue. */
bb19d4af 3615 gcc_assert (!obvalue_p (rval));
058dcc25 3616
25357d1e 3617 return convert (pointer_type, rval);
8d08fdba 3618}
63c9a190 3619
c166b898
ILT
3620/* Generate a representation for a C++ "new" expression. *PLACEMENT
3621 is a vector of placement-new arguments (or NULL if none). If NELTS
3622 is NULL, TYPE is the type of the storage to be allocated. If NELTS
3623 is not NULL, then this is an array-new allocation; TYPE is the type
3624 of the elements in the array and NELTS is the number of elements in
3625 the array. *INIT, if non-NULL, is the initializer for the new
3626 object, or an empty vector to indicate an initializer of "()". If
3627 USE_GLOBAL_NEW is true, then the user explicitly wrote "::new"
3628 rather than just "new". This may change PLACEMENT and INIT. */
63c9a190
MM
3629
3630tree
87d3f828
PC
3631build_new (location_t loc, vec<tree, va_gc> **placement, tree type,
3632 tree nelts, vec<tree, va_gc> **init, int use_global_new,
3633 tsubst_flags_t complain)
63c9a190
MM
3634{
3635 tree rval;
9771b263 3636 vec<tree, va_gc> *orig_placement = NULL;
c166b898 3637 tree orig_nelts = NULL_TREE;
9771b263 3638 vec<tree, va_gc> *orig_init = NULL;
63c9a190 3639
c166b898 3640 if (type == error_mark_node)
63c9a190
MM
3641 return error_mark_node;
3642
9a642cca 3643 if (nelts == NULL_TREE
c19267cb
JM
3644 /* Don't do auto deduction where it might affect mangling. */
3645 && (!processing_template_decl || at_function_scope_p ()))
86a09a9e
JM
3646 {
3647 tree auto_node = type_uses_auto (type);
2e5748d2
JM
3648 if (auto_node)
3649 {
9a642cca 3650 tree d_init = NULL_TREE;
009bb506
MP
3651 const size_t len = vec_safe_length (*init);
3652 /* E.g. new auto(x) must have exactly one element, or
3653 a {} initializer will have one element. */
3654 if (len == 1)
9a642cca
JM
3655 {
3656 d_init = (**init)[0];
3657 d_init = resolve_nondeduced_context (d_init, complain);
3658 }
009bb506
MP
3659 /* For the rest, e.g. new A(1, 2, 3), create a list. */
3660 else if (len > 1)
3661 {
3662 unsigned int n;
3663 tree t;
3664 tree *pp = &d_init;
3665 FOR_EACH_VEC_ELT (**init, n, t)
3666 {
3667 t = resolve_nondeduced_context (t, complain);
3668 *pp = build_tree_list (NULL_TREE, t);
3669 pp = &TREE_CHAIN (*pp);
3670 }
3671 }
87ca4015 3672 type = do_auto_deduction (type, d_init, auto_node, complain);
2e5748d2 3673 }
86a09a9e
JM
3674 }
3675
63c9a190
MM
3676 if (processing_template_decl)
3677 {
3678 if (dependent_type_p (type)
c166b898 3679 || any_type_dependent_arguments_p (*placement)
63c9a190 3680 || (nelts && type_dependent_expression_p (nelts))
879b0a1d 3681 || (nelts && *init)
c166b898 3682 || any_type_dependent_arguments_p (*init))
87d3f828 3683 return build_raw_new_expr (loc, *placement, type, nelts, *init,
63c9a190 3684 use_global_new);
c166b898
ILT
3685
3686 orig_placement = make_tree_vector_copy (*placement);
3687 orig_nelts = nelts;
a4bbf910 3688 if (*init)
817a77e4
JM
3689 {
3690 orig_init = make_tree_vector_copy (*init);
3691 /* Also copy any CONSTRUCTORs in *init, since reshape_init and
3692 digest_init clobber them in place. */
3693 for (unsigned i = 0; i < orig_init->length(); ++i)
3694 {
3695 tree e = (**init)[i];
3696 if (TREE_CODE (e) == CONSTRUCTOR)
3697 (**init)[i] = copy_node (e);
3698 }
3699 }
c166b898
ILT
3700
3701 make_args_non_dependent (*placement);
63c9a190
MM
3702 if (nelts)
3703 nelts = build_non_dependent_expr (nelts);
c166b898 3704 make_args_non_dependent (*init);
63c9a190
MM
3705 }
3706
3707 if (nelts)
3708 {
87d3f828 3709 location_t nelts_loc = cp_expr_loc_or_loc (nelts, loc);
63c9a190 3710 if (!build_expr_type_conversion (WANT_INT | WANT_ENUM, nelts, false))
5ade1ed2
DG
3711 {
3712 if (complain & tf_error)
87d3f828 3713 permerror (nelts_loc,
f5fc32e4 3714 "size in array new must have integral type");
5ade1ed2
DG
3715 else
3716 return error_mark_node;
3717 }
685c8340
MS
3718
3719 /* Try to determine the constant value only for the purposes
3720 of the diagnostic below but continue to use the original
3721 value and handle const folding later. */
e56f6629 3722 const_tree cst_nelts = fold_non_dependent_expr (nelts, complain);
685c8340
MS
3723
3724 /* The expression in a noptr-new-declarator is erroneous if it's of
3725 non-class type and its value before converting to std::size_t is
3726 less than zero. ... If the expression is a constant expression,
3727 the program is ill-fomed. */
ea219e6e 3728 if (TREE_CODE (cst_nelts) == INTEGER_CST
87d3f828 3729 && !valid_array_size_p (nelts_loc, cst_nelts, NULL_TREE,
28a8cef1
MS
3730 complain & tf_error))
3731 return error_mark_node;
685c8340 3732
03a904b5 3733 nelts = mark_rvalue_use (nelts);
4b978f96 3734 nelts = cp_save_expr (cp_convert (sizetype, nelts, complain));
63c9a190
MM
3735 }
3736
3737 /* ``A reference cannot be created by the new operator. A reference
3738 is not an object (8.2.2, 8.4.3), so a pointer to it could not be
3739 returned by new.'' ARM 5.3.3 */
9f613f06 3740 if (TYPE_REF_P (type))
63c9a190 3741 {
5ade1ed2 3742 if (complain & tf_error)
87d3f828 3743 error_at (loc, "new cannot be applied to a reference type");
5ade1ed2
DG
3744 else
3745 return error_mark_node;
63c9a190
MM
3746 type = TREE_TYPE (type);
3747 }
3748
3749 if (TREE_CODE (type) == FUNCTION_TYPE)
3750 {
5ade1ed2 3751 if (complain & tf_error)
87d3f828 3752 error_at (loc, "new cannot be applied to a function type");
63c9a190
MM
3753 return error_mark_node;
3754 }
3755
73a2b8dd 3756 /* P1009: Array size deduction in new-expressions. */
81de459e 3757 const bool array_p = TREE_CODE (type) == ARRAY_TYPE;
ae48b74c
MP
3758 if (*init
3759 /* If ARRAY_P, we have to deduce the array bound. For C++20 paren-init,
3760 we have to process the parenthesized-list. But don't do it for (),
3761 which is value-initialization, and INIT should stay empty. */
3762 && (array_p || (cxx_dialect >= cxx20 && nelts && !(*init)->is_empty ())))
73a2b8dd
MP
3763 {
3764 /* This means we have 'new T[]()'. */
3765 if ((*init)->is_empty ())
3766 {
3767 tree ctor = build_constructor (init_list_type_node, NULL);
3768 CONSTRUCTOR_IS_DIRECT_INIT (ctor) = true;
3769 vec_safe_push (*init, ctor);
3770 }
3771 tree &elt = (**init)[0];
3772 /* The C++20 'new T[](e_0, ..., e_k)' case allowed by P0960. */
3773 if (!DIRECT_LIST_INIT_P (elt) && cxx_dialect >= cxx20)
3774 {
81de459e
MP
3775 tree ctor = build_constructor_from_vec (init_list_type_node, *init);
3776 CONSTRUCTOR_IS_DIRECT_INIT (ctor) = true;
3777 CONSTRUCTOR_IS_PAREN_INIT (ctor) = true;
3778 elt = ctor;
3779 /* We've squashed all the vector elements into the first one;
3780 truncate the rest. */
3781 (*init)->truncate (1);
73a2b8dd
MP
3782 }
3783 /* Otherwise we should have 'new T[]{e_0, ..., e_k}'. */
81de459e
MP
3784 if (array_p && !TYPE_DOMAIN (type))
3785 {
3786 /* We need to reshape before deducing the bounds to handle code like
3787
3788 struct S { int x, y; };
3789 new S[]{1, 2, 3, 4};
3790
3791 which should deduce S[2]. But don't change ELT itself: we want to
3792 pass a list-initializer to build_new_1, even for STRING_CSTs. */
3793 tree e = elt;
3794 if (BRACE_ENCLOSED_INITIALIZER_P (e))
3795 e = reshape_init (type, e, complain);
3796 cp_complete_array_type (&type, e, /*do_default*/false);
3797 }
73a2b8dd
MP
3798 }
3799
57ccb546
MM
3800 /* The type allocated must be complete. If the new-type-id was
3801 "T[N]" then we are just checking that "T" is complete here, but
3802 that is equivalent, since the value of "N" doesn't matter. */
309714d4 3803 if (!complete_type_or_maybe_complain (type, NULL_TREE, complain))
39fb9d72
DB
3804 return error_mark_node;
3805
5ade1ed2 3806 rval = build_new_1 (placement, type, nelts, init, use_global_new, complain);
63c9a190
MM
3807 if (rval == error_mark_node)
3808 return error_mark_node;
3809
3810 if (processing_template_decl)
c166b898 3811 {
87d3f828 3812 tree ret = build_raw_new_expr (loc, orig_placement, type, orig_nelts,
c166b898
ILT
3813 orig_init, use_global_new);
3814 release_tree_vector (orig_placement);
3815 release_tree_vector (orig_init);
3816 return ret;
3817 }
63c9a190
MM
3818
3819 /* Wrap it in a NOP_EXPR so warn_if_unused_value doesn't complain. */
87d3f828 3820 rval = build1_loc (loc, NOP_EXPR, TREE_TYPE (rval), rval);
63c9a190
MM
3821 TREE_NO_WARNING (rval) = 1;
3822
3823 return rval;
3824}
8d08fdba 3825\f
f30432d7 3826static tree
04e4997a 3827build_vec_delete_1 (location_t loc, tree base, tree maxindex, tree type,
574cfaa4
JM
3828 special_function_kind auto_delete_vec,
3829 int use_global_delete, tsubst_flags_t complain)
f30432d7
MS
3830{
3831 tree virtual_size;
e92cc029 3832 tree ptype = build_pointer_type (type = complete_type (type));
c9b0866a 3833 tree size_exp;
f30432d7
MS
3834
3835 /* Temporary variables used by the loop. */
3836 tree tbase, tbase_init;
3837
3838 /* This is the body of the loop that implements the deletion of a
3839 single element, and moves temp variables to next elements. */
3840 tree body;
3841
3842 /* This is the LOOP_EXPR that governs the deletion of the elements. */
c7b62f14 3843 tree loop = 0;
f30432d7
MS
3844
3845 /* This is the thing that governs what to do after the loop has run. */
3846 tree deallocate_expr = 0;
3847
3848 /* This is the BIND_EXPR which holds the outermost iterator of the
3849 loop. It is convenient to set this variable up and test it before
3850 executing any other code in the loop.
3851 This is also the containing expression returned by this function. */
3852 tree controller = NULL_TREE;
5be014d5 3853 tree tmp;
f30432d7 3854
b2153b98 3855 /* We should only have 1-D arrays here. */
8dc2b103 3856 gcc_assert (TREE_CODE (type) != ARRAY_TYPE);
b2153b98 3857
574cfaa4
JM
3858 if (base == error_mark_node || maxindex == error_mark_node)
3859 return error_mark_node;
3860
04e4997a 3861 if (!verify_type_context (loc, TCTX_DEALLOCATION, type,
02a32ab4
RS
3862 !(complain & tf_error)))
3863 return error_mark_node;
3864
c9b0866a
PC
3865 if (!COMPLETE_TYPE_P (type))
3866 {
097f82ec
DM
3867 if (complain & tf_warning)
3868 {
3869 auto_diagnostic_group d;
04e4997a
PC
3870 if (warning_at (loc, OPT_Wdelete_incomplete,
3871 "possible problem detected in invocation of "
3872 "operator %<delete []%>"))
097f82ec
DM
3873 {
3874 cxx_incomplete_type_diagnostic (base, type, DK_WARNING);
04e4997a
PC
3875 inform (loc, "neither the destructor nor the "
3876 "class-specific operator %<delete []%> will be called, "
3877 "even if they are declared when the class is defined");
097f82ec
DM
3878 }
3879 }
20b06add
JM
3880 /* This size won't actually be used. */
3881 size_exp = size_one_node;
3882 goto no_destructor;
c9b0866a
PC
3883 }
3884
3885 size_exp = size_in_bytes (type);
3886
eca7fc57 3887 if (! MAYBE_CLASS_TYPE_P (type))
c7b62f14 3888 goto no_destructor;
eca7fc57
JM
3889 else if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
3890 {
3891 /* Make sure the destructor is callable. */
3892 if (type_build_dtor_call (type))
3893 {
04e4997a 3894 tmp = build_delete (loc, ptype, base, sfk_complete_destructor,
eca7fc57
JM
3895 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1,
3896 complain);
3897 if (tmp == error_mark_node)
3898 return error_mark_node;
3899 }
3900 goto no_destructor;
3901 }
f30432d7 3902
708cae97 3903 /* The below is short by the cookie size. */
fed3cef0 3904 virtual_size = size_binop (MULT_EXPR, size_exp,
cda0a029 3905 fold_convert (sizetype, maxindex));
f30432d7 3906
46e8c075 3907 tbase = create_temporary_var (ptype);
8e007055 3908 DECL_INITIAL (tbase)
04e4997a 3909 = fold_build_pointer_plus_loc (loc, fold_convert (ptype, base),
8e007055 3910 virtual_size);
04e4997a 3911 tbase_init = build_stmt (loc, DECL_EXPR, tbase);
8e007055 3912 controller = build3 (BIND_EXPR, void_type_node, tbase, NULL_TREE, NULL_TREE);
f30432d7 3913 TREE_SIDE_EFFECTS (controller) = 1;
f30432d7 3914
f293ce4b 3915 body = build1 (EXIT_EXPR, void_type_node,
5cd88d68
RS
3916 build2 (EQ_EXPR, boolean_type_node, tbase,
3917 fold_convert (ptype, base)));
04e4997a 3918 tmp = fold_build1_loc (loc, NEGATE_EXPR, sizetype, size_exp);
5d49b6a7 3919 tmp = fold_build_pointer_plus (tbase, tmp);
04e4997a 3920 tmp = cp_build_modify_expr (loc, tbase, NOP_EXPR, tmp, complain);
574cfaa4
JM
3921 if (tmp == error_mark_node)
3922 return error_mark_node;
04e4997a
PC
3923 body = build_compound_expr (loc, body, tmp);
3924 tmp = build_delete (loc, ptype, tbase, sfk_complete_destructor,
574cfaa4
JM
3925 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1,
3926 complain);
3927 if (tmp == error_mark_node)
3928 return error_mark_node;
04e4997a 3929 body = build_compound_expr (loc, body, tmp);
f30432d7 3930
f293ce4b 3931 loop = build1 (LOOP_EXPR, void_type_node, body);
04e4997a 3932 loop = build_compound_expr (loc, tbase_init, loop);
f30432d7
MS
3933
3934 no_destructor:
e79a6b40
JM
3935 /* Delete the storage if appropriate. */
3936 if (auto_delete_vec == sfk_deleting_destructor)
f30432d7
MS
3937 {
3938 tree base_tbd;
3939
708cae97 3940 /* The below is short by the cookie size. */
fed3cef0 3941 virtual_size = size_binop (MULT_EXPR, size_exp,
cda0a029 3942 fold_convert (sizetype, maxindex));
f30432d7
MS
3943
3944 if (! TYPE_VEC_NEW_USES_COOKIE (type))
3945 /* no header */
3946 base_tbd = base;
3947 else
3948 {
834c6dff
MM
3949 tree cookie_size;
3950
46e995e0 3951 cookie_size = targetm.cxx.get_cookie_size (type);
04e4997a 3952 base_tbd = cp_build_binary_op (loc,
574cfaa4
JM
3953 MINUS_EXPR,
3954 cp_convert (string_type_node,
4b978f96 3955 base, complain),
574cfaa4
JM
3956 cookie_size,
3957 complain);
3958 if (base_tbd == error_mark_node)
3959 return error_mark_node;
4b978f96 3960 base_tbd = cp_convert (ptype, base_tbd, complain);
e92cc029 3961 /* True size with header. */
834c6dff 3962 virtual_size = size_binop (PLUS_EXPR, virtual_size, cookie_size);
f30432d7 3963 }
86f45d2c 3964
e79a6b40
JM
3965 deallocate_expr = build_op_delete_call (VEC_DELETE_EXPR,
3966 base_tbd, virtual_size,
3967 use_global_delete & 1,
3968 /*placement=*/NULL_TREE,
4b978f96
PC
3969 /*alloc_fn=*/NULL_TREE,
3970 complain);
f30432d7
MS
3971 }
3972
c7b62f14 3973 body = loop;
4924293a
PP
3974 if (deallocate_expr == error_mark_node)
3975 return error_mark_node;
3976 else if (!deallocate_expr)
c7b62f14
NS
3977 ;
3978 else if (!body)
3979 body = deallocate_expr;
f30432d7 3980 else
4e8e460b 3981 /* The delete operator must be called, even if a destructor
ee392fc2
NS
3982 throws. */
3983 body = build2 (TRY_FINALLY_EXPR, void_type_node, body, deallocate_expr);
c8094d83 3984
c7b62f14
NS
3985 if (!body)
3986 body = integer_zero_node;
c8094d83 3987
f30432d7 3988 /* Outermost wrapper: If pointer is null, punt. */
04e4997a 3989 tree cond = build2_loc (loc, NE_EXPR, boolean_type_node, base,
03ca8fb3 3990 fold_convert (TREE_TYPE (base), nullptr_node));
03a616ac
JJ
3991 /* This is a compiler generated comparison, don't emit
3992 e.g. -Wnonnull-compare warning for it. */
03ca8fb3 3993 TREE_NO_WARNING (cond) = 1;
04e4997a 3994 body = build3_loc (loc, COND_EXPR, void_type_node,
03ca8fb3 3995 cond, body, integer_zero_node);
d5bcd6d4 3996 COND_EXPR_IS_VEC_DELETE (body) = true;
f30432d7
MS
3997 body = build1 (NOP_EXPR, void_type_node, body);
3998
3999 if (controller)
4000 {
4001 TREE_OPERAND (controller, 1) = body;
4e8dca1c 4002 body = controller;
f30432d7 4003 }
4e8dca1c
JM
4004
4005 if (TREE_CODE (base) == SAVE_EXPR)
4006 /* Pre-evaluate the SAVE_EXPR outside of the BIND_EXPR. */
f293ce4b 4007 body = build2 (COMPOUND_EXPR, void_type_node, base, body);
4e8dca1c 4008
574cfaa4 4009 return convert_to_void (body, ICV_CAST, complain);
f30432d7
MS
4010}
4011
c8094d83 4012/* Create an unnamed variable of the indicated TYPE. */
c395453c 4013
f1dedc31 4014tree
362efdc1 4015create_temporary_var (tree type)
8a72a046 4016{
f1dedc31 4017 tree decl;
c8094d83 4018
c2255bc4
AH
4019 decl = build_decl (input_location,
4020 VAR_DECL, NULL_TREE, type);
f1dedc31
MM
4021 TREE_USED (decl) = 1;
4022 DECL_ARTIFICIAL (decl) = 1;
f1dedc31 4023 DECL_IGNORED_P (decl) = 1;
b35d4555 4024 DECL_CONTEXT (decl) = current_function_decl;
f1dedc31 4025
f1dedc31 4026 return decl;
8a72a046
MM
4027}
4028
f1dedc31
MM
4029/* Create a new temporary variable of the indicated TYPE, initialized
4030 to INIT.
8a72a046 4031
f1dedc31
MM
4032 It is not entered into current_binding_level, because that breaks
4033 things when it comes time to do final cleanups (which take place
4034 "outside" the binding contour of the function). */
4035
fe5b5c36 4036tree
362efdc1 4037get_temp_regvar (tree type, tree init)
f30432d7 4038{
f1dedc31 4039 tree decl;
8a72a046 4040
f1dedc31 4041 decl = create_temporary_var (type);
350fae66 4042 add_decl_expr (decl);
c8094d83 4043
4f2e1536
MP
4044 finish_expr_stmt (cp_build_modify_expr (input_location, decl, INIT_EXPR,
4045 init, tf_warning_or_error));
8a72a046 4046
f1dedc31 4047 return decl;
f30432d7
MS
4048}
4049
024f2d89
JM
4050/* Subroutine of build_vec_init. Returns true if assigning to an array of
4051 INNER_ELT_TYPE from INIT is trivial. */
4052
4053static bool
4054vec_copy_assign_is_trivial (tree inner_elt_type, tree init)
4055{
4056 tree fromtype = inner_elt_type;
72b3e203 4057 if (lvalue_p (init))
024f2d89
JM
4058 fromtype = cp_build_reference_type (fromtype, /*rval*/false);
4059 return is_trivially_xible (MODIFY_EXPR, inner_elt_type, fromtype);
4060}
4061
5a68fae7
JM
4062/* Subroutine of build_vec_init: Check that the array has at least N
4063 elements. Other parameters are local variables in build_vec_init. */
4064
4065void
4066finish_length_check (tree atype, tree iterator, tree obase, unsigned n)
4067{
4068 tree nelts = build_int_cst (ptrdiff_type_node, n - 1);
4069 if (TREE_CODE (atype) != ARRAY_TYPE)
4070 {
4071 if (flag_exceptions)
4072 {
4073 tree c = fold_build2 (LT_EXPR, boolean_type_node, iterator,
4074 nelts);
4075 c = build3 (COND_EXPR, void_type_node, c,
4076 throw_bad_array_new_length (), void_node);
4077 finish_expr_stmt (c);
4078 }
4079 /* Don't check an array new when -fno-exceptions. */
4080 }
f34ebeb2
ML
4081 else if (sanitize_flags_p (SANITIZE_BOUNDS)
4082 && current_function_decl != NULL_TREE)
5a68fae7
JM
4083 {
4084 /* Make sure the last element of the initializer is in bounds. */
4085 finish_expr_stmt
4086 (ubsan_instrument_bounds
4087 (input_location, obase, &nelts, /*ignore_off_by_one*/false));
4088 }
4089}
4090
f1dedc31
MM
4091/* `build_vec_init' returns tree structure that performs
4092 initialization of a vector of aggregate types.
8d08fdba 4093
9207099b
JM
4094 BASE is a reference to the vector, of ARRAY_TYPE, or a pointer
4095 to the first element, of POINTER_TYPE.
a48cccea 4096 MAXINDEX is the maximum index of the array (one less than the
9207099b 4097 number of elements). It is only used if BASE is a pointer or
a48cccea 4098 TYPE_DOMAIN (TREE_TYPE (BASE)) == NULL_TREE.
b84f4651 4099
8d08fdba
MS
4100 INIT is the (possibly NULL) initializer.
4101
844ae01d
JM
4102 If EXPLICIT_VALUE_INIT_P is true, then INIT must be NULL. All
4103 elements in the array are value-initialized.
b84f4651 4104
8d08fdba
MS
4105 FROM_ARRAY is 0 if we should init everything with INIT
4106 (i.e., every element initialized from INIT).
4107 FROM_ARRAY is 1 if we should index into INIT in parallel
4108 with initialization of DECL.
4109 FROM_ARRAY is 2 if we should index into INIT in parallel,
4110 but use assignment instead of initialization. */
4111
4112tree
3db45ab5 4113build_vec_init (tree base, tree maxindex, tree init,
844ae01d 4114 bool explicit_value_init_p,
5ade1ed2 4115 int from_array, tsubst_flags_t complain)
8d08fdba
MS
4116{
4117 tree rval;
8a72a046 4118 tree base2 = NULL_TREE;
e833cb11 4119 tree itype = NULL_TREE;
8a72a046 4120 tree iterator;
9207099b 4121 /* The type of BASE. */
f30efcb7 4122 tree atype = TREE_TYPE (base);
f1dedc31 4123 /* The type of an element in the array. */
f30efcb7 4124 tree type = TREE_TYPE (atype);
c8094d83 4125 /* The element type reached after removing all outer array
b5af3133
MM
4126 types. */
4127 tree inner_elt_type;
f1dedc31
MM
4128 /* The type of a pointer to an element in the array. */
4129 tree ptype;
4130 tree stmt_expr;
4131 tree compound_stmt;
4132 int destroy_temps;
f5984164 4133 tree try_block = NULL_TREE;
faa9232d 4134 HOST_WIDE_INT num_initialized_elts = 0;
2a3398e1 4135 bool is_global;
fa2200cb 4136 tree obase = base;
f91352dc 4137 bool xvalue = false;
574cfaa4 4138 bool errors = false;
f9d0ca40 4139 location_t loc = (init ? cp_expr_loc_or_input_loc (init)
5a68fae7 4140 : location_of (base));
c8094d83 4141
9207099b 4142 if (TREE_CODE (atype) == ARRAY_TYPE && TYPE_DOMAIN (atype))
a48cccea
JM
4143 maxindex = array_type_nelts (atype);
4144
ddffee68 4145 if (maxindex == NULL_TREE || maxindex == error_mark_node)
8d08fdba
MS
4146 return error_mark_node;
4147
cda0a029 4148 maxindex = maybe_constant_value (maxindex);
844ae01d 4149 if (explicit_value_init_p)
b84f4651
MM
4150 gcc_assert (!init);
4151
9207099b 4152 inner_elt_type = strip_array_types (type);
567ef749
JM
4153
4154 /* Look through the TARGET_EXPR around a compound literal. */
4155 if (init && TREE_CODE (init) == TARGET_EXPR
5a4d8044
JM
4156 && TREE_CODE (TARGET_EXPR_INITIAL (init)) == CONSTRUCTOR
4157 && from_array != 2)
567ef749
JM
4158 init = TARGET_EXPR_INITIAL (init);
4159
0655c6d5
JM
4160 bool direct_init = false;
4161 if (from_array && init && BRACE_ENCLOSED_INITIALIZER_P (init)
4162 && CONSTRUCTOR_NELTS (init) == 1)
4163 {
4164 tree elt = CONSTRUCTOR_ELT (init, 0)->value;
4165 if (TREE_CODE (TREE_TYPE (elt)) == ARRAY_TYPE)
4166 {
4167 direct_init = DIRECT_LIST_INIT_P (init);
4168 init = elt;
4169 }
4170 }
4171
5a68fae7 4172 /* If we have a braced-init-list or string constant, make sure that the array
7d5e76c8 4173 is big enough for all the initializers. */
5a68fae7
JM
4174 bool length_check = (init
4175 && (TREE_CODE (init) == STRING_CST
4176 || (TREE_CODE (init) == CONSTRUCTOR
4177 && CONSTRUCTOR_NELTS (init) > 0))
46621807 4178 && !TREE_CONSTANT (maxindex));
7d5e76c8 4179
c8a3d889 4180 if (init
25357d1e 4181 && TREE_CODE (atype) == ARRAY_TYPE
06b76c7f 4182 && TREE_CONSTANT (maxindex)
c8a3d889 4183 && (from_array == 2
024f2d89 4184 ? vec_copy_assign_is_trivial (inner_elt_type, init)
c8a3d889 4185 : !TYPE_NEEDS_CONSTRUCTING (type))
f30efcb7 4186 && ((TREE_CODE (init) == CONSTRUCTOR
d1a73b0b
JM
4187 && (BRACE_ENCLOSED_INITIALIZER_P (init)
4188 || (same_type_ignoring_top_level_qualifiers_p
4189 (atype, TREE_TYPE (init))))
f30efcb7
JM
4190 /* Don't do this if the CONSTRUCTOR might contain something
4191 that might throw and require us to clean up. */
9771b263 4192 && (vec_safe_is_empty (CONSTRUCTOR_ELTS (init))
b5af3133 4193 || ! TYPE_HAS_NONTRIVIAL_DESTRUCTOR (inner_elt_type)))
f30efcb7
JM
4194 || from_array))
4195 {
c32097d8 4196 /* Do non-default initialization of trivial arrays resulting from
f30efcb7
JM
4197 brace-enclosed initializers. In this case, digest_init and
4198 store_constructor will handle the semantics for us. */
4199
a47c2f62
JM
4200 if (BRACE_ENCLOSED_INITIALIZER_P (init))
4201 init = digest_init (atype, init, complain);
f293ce4b 4202 stmt_expr = build2 (INIT_EXPR, atype, base, init);
f30efcb7
JM
4203 return stmt_expr;
4204 }
4205
4b978f96 4206 maxindex = cp_convert (ptrdiff_type_node, maxindex, complain);
cda0a029
JM
4207 maxindex = fold_simple (maxindex);
4208
9207099b
JM
4209 if (TREE_CODE (atype) == ARRAY_TYPE)
4210 {
4211 ptype = build_pointer_type (type);
89fcabaf
PC
4212 base = decay_conversion (base, complain);
4213 if (base == error_mark_node)
4214 return error_mark_node;
4b978f96 4215 base = cp_convert (ptype, base, complain);
9207099b
JM
4216 }
4217 else
4218 ptype = atype;
8d08fdba 4219
f1dedc31 4220 /* The code we are generating looks like:
303b7406 4221 ({
f1dedc31 4222 T* t1 = (T*) base;
f30efcb7 4223 T* rval = t1;
f1dedc31
MM
4224 ptrdiff_t iterator = maxindex;
4225 try {
4977bab6 4226 for (; iterator != -1; --iterator) {
f30efcb7
JM
4227 ... initialize *t1 ...
4228 ++t1;
4977bab6 4229 }
f1dedc31 4230 } catch (...) {
0cbd7506 4231 ... destroy elements that were constructed ...
f1dedc31 4232 }
303b7406
NS
4233 rval;
4234 })
c8094d83 4235
f1dedc31
MM
4236 We can omit the try and catch blocks if we know that the
4237 initialization will never throw an exception, or if the array
f30efcb7 4238 elements do not have destructors. We can omit the loop completely if
c8094d83 4239 the elements of the array do not have constructors.
f1dedc31
MM
4240
4241 We actually wrap the entire body of the above in a STMT_EXPR, for
c8094d83 4242 tidiness.
f1dedc31
MM
4243
4244 When copying from array to another, when the array elements have
4245 only trivial copy constructors, we should use __builtin_memcpy
4246 rather than generating a loop. That way, we could take advantage
3b426391 4247 of whatever cleverness the back end has for dealing with copies
f1dedc31
MM
4248 of blocks of memory. */
4249
2a3398e1 4250 is_global = begin_init_stmts (&stmt_expr, &compound_stmt);
f2c5f623 4251 destroy_temps = stmts_are_full_exprs_p ();
ae499cce 4252 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
f30efcb7 4253 rval = get_temp_regvar (ptype, base);
f1dedc31 4254 base = get_temp_regvar (ptype, rval);
8a72a046 4255 iterator = get_temp_regvar (ptrdiff_type_node, maxindex);
8d08fdba 4256
5a4d8044
JM
4257 /* If initializing one array from another, initialize element by
4258 element. We rely upon the below calls to do the argument
4259 checking. Evaluate the initializer before entering the try block. */
4260 if (from_array && init && TREE_CODE (init) != CONSTRUCTOR)
4261 {
f91352dc
JM
4262 if (lvalue_kind (init) & clk_rvalueref)
4263 xvalue = true;
89fcabaf
PC
4264 base2 = decay_conversion (init, complain);
4265 if (base2 == error_mark_node)
4266 return error_mark_node;
5a4d8044
JM
4267 itype = TREE_TYPE (base2);
4268 base2 = get_temp_regvar (itype, base2);
4269 itype = TREE_TYPE (itype);
4270 }
4271
8a72a046 4272 /* Protect the entire array initialization so that we can destroy
f30efcb7
JM
4273 the partially constructed array if an exception is thrown.
4274 But don't do this if we're assigning. */
4275 if (flag_exceptions && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
4276 && from_array != 2)
ed5511d9
MM
4277 {
4278 try_block = begin_try_block ();
ed5511d9 4279 }
8a72a046 4280
c0014b07
JM
4281 /* Should we try to create a constant initializer? */
4282 bool try_const = (TREE_CODE (atype) == ARRAY_TYPE
4283 && TREE_CONSTANT (maxindex)
a02f26f6
JM
4284 && (init ? TREE_CODE (init) == CONSTRUCTOR
4285 : (type_has_constexpr_default_constructor
4286 (inner_elt_type)))
c0014b07
JM
4287 && (literal_type_p (inner_elt_type)
4288 || TYPE_HAS_CONSTEXPR_CTOR (inner_elt_type)));
4289 vec<constructor_elt, va_gc> *const_vec = NULL;
4290 bool saw_non_const = false;
4291 /* If we're initializing a static array, we want to do static
4292 initialization of any elements with constant initializers even if
4293 some are non-constant. */
4294 bool do_static_init = (DECL_P (obase) && TREE_STATIC (obase));
4295
3bc63227 4296 bool empty_list = false;
1f65a8c8
JM
4297 if (init && BRACE_ENCLOSED_INITIALIZER_P (init)
4298 && CONSTRUCTOR_NELTS (init) == 0)
3bc63227
JM
4299 /* Skip over the handling of non-empty init lists. */
4300 empty_list = true;
1f65a8c8 4301
fa2200cb
JM
4302 /* Maybe pull out constant value when from_array? */
4303
1f65a8c8 4304 else if (init != NULL_TREE && TREE_CODE (init) == CONSTRUCTOR)
8d08fdba 4305 {
c32097d8 4306 /* Do non-default initialization of non-trivial arrays resulting from
f30efcb7 4307 brace-enclosed initializers. */
4038c495 4308 unsigned HOST_WIDE_INT idx;
fa2200cb 4309 tree field, elt;
b25dd954
JM
4310 /* If the constructor already has the array type, it's been through
4311 digest_init, so we shouldn't try to do anything more. */
4312 bool digested = same_type_p (atype, TREE_TYPE (init));
094fe153
JM
4313 from_array = 0;
4314
7d5e76c8 4315 if (length_check)
5a68fae7 4316 finish_length_check (atype, iterator, obase, CONSTRUCTOR_NELTS (init));
7d5e76c8 4317
fa2200cb 4318 if (try_const)
c0014b07 4319 vec_alloc (const_vec, CONSTRUCTOR_NELTS (init));
fa2200cb
JM
4320
4321 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (init), idx, field, elt)
8d08fdba 4322 {
f1dedc31 4323 tree baseref = build1 (INDIRECT_REF, type, base);
fa2200cb 4324 tree one_init;
8d08fdba 4325
8a72a046 4326 num_initialized_elts++;
8d08fdba 4327
67c03833 4328 current_stmt_tree ()->stmts_are_full_exprs_p = 1;
b25dd954
JM
4329 if (digested)
4330 one_init = build2 (INIT_EXPR, type, baseref, elt);
4331 else if (MAYBE_CLASS_TYPE_P (type) || TREE_CODE (type) == ARRAY_TYPE)
fa2200cb 4332 one_init = build_aggr_init (baseref, elt, 0, complain);
8a72a046 4333 else
4f2e1536
MP
4334 one_init = cp_build_modify_expr (input_location, baseref,
4335 NOP_EXPR, elt, complain);
574cfaa4
JM
4336 if (one_init == error_mark_node)
4337 errors = true;
fa2200cb
JM
4338 if (try_const)
4339 {
f84aded8
MP
4340 if (!field)
4341 field = size_int (idx);
c0014b07 4342 tree e = maybe_constant_init (one_init);
fa2200cb
JM
4343 if (reduced_constant_expression_p (e))
4344 {
c0014b07 4345 CONSTRUCTOR_APPEND_ELT (const_vec, field, e);
fa2200cb
JM
4346 if (do_static_init)
4347 one_init = NULL_TREE;
4348 else
4349 one_init = build2 (INIT_EXPR, type, baseref, e);
fa2200cb
JM
4350 }
4351 else
4352 {
4353 if (do_static_init)
f11c7048
JJ
4354 {
4355 tree value = build_zero_init (TREE_TYPE (e), NULL_TREE,
4356 true);
4357 if (value)
c0014b07 4358 CONSTRUCTOR_APPEND_ELT (const_vec, field, value);
f11c7048 4359 }
fa2200cb
JM
4360 saw_non_const = true;
4361 }
4362 }
4363
4364 if (one_init)
4365 finish_expr_stmt (one_init);
67c03833 4366 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
8a72a046 4367
e51fbec3
MP
4368 one_init = cp_build_unary_op (PREINCREMENT_EXPR, base, false,
4369 complain);
574cfaa4
JM
4370 if (one_init == error_mark_node)
4371 errors = true;
4372 else
4373 finish_expr_stmt (one_init);
4374
e51fbec3 4375 one_init = cp_build_unary_op (PREDECREMENT_EXPR, iterator, false,
574cfaa4
JM
4376 complain);
4377 if (one_init == error_mark_node)
4378 errors = true;
4379 else
4380 finish_expr_stmt (one_init);
8d08fdba 4381 }
8d08fdba 4382
3bc63227
JM
4383 /* Any elements without explicit initializers get T{}. */
4384 empty_list = true;
8d08fdba 4385 }
5a68fae7
JM
4386 else if (init && TREE_CODE (init) == STRING_CST)
4387 {
4388 /* Check that the array is at least as long as the string. */
4389 if (length_check)
4390 finish_length_check (atype, iterator, obase,
4391 TREE_STRING_LENGTH (init));
4392 tree length = build_int_cst (ptrdiff_type_node,
4393 TREE_STRING_LENGTH (init));
4394
4395 /* Copy the string to the first part of the array. */
4396 tree alias_set = build_int_cst (build_pointer_type (type), 0);
4397 tree lhs = build2 (MEM_REF, TREE_TYPE (init), base, alias_set);
4398 tree stmt = build2 (MODIFY_EXPR, void_type_node, lhs, init);
4399 finish_expr_stmt (stmt);
4400
4401 /* Adjust the counter and pointer. */
4402 stmt = cp_build_binary_op (loc, MINUS_EXPR, iterator, length, complain);
4403 stmt = build2 (MODIFY_EXPR, void_type_node, iterator, stmt);
4404 finish_expr_stmt (stmt);
4405
4406 stmt = cp_build_binary_op (loc, PLUS_EXPR, base, length, complain);
4407 stmt = build2 (MODIFY_EXPR, void_type_node, base, stmt);
4408 finish_expr_stmt (stmt);
4409
4410 /* And set the rest of the array to NUL. */
4411 from_array = 0;
4412 explicit_value_init_p = true;
4413 }
8a72a046 4414 else if (from_array)
8d08fdba 4415 {
8a72a046 4416 if (init)
5a4d8044 4417 /* OK, we set base2 above. */;
95552437 4418 else if (CLASS_TYPE_P (type)
8a72a046
MM
4419 && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
4420 {
5ade1ed2
DG
4421 if (complain & tf_error)
4422 error ("initializer ends prematurely");
574cfaa4 4423 errors = true;
8a72a046
MM
4424 }
4425 }
8d08fdba 4426
8a72a046
MM
4427 /* Now, default-initialize any remaining elements. We don't need to
4428 do that if a) the type does not need constructing, or b) we've
094fe153
JM
4429 already initialized all the elements.
4430
4431 We do need to keep going if we're copying an array. */
4432
a02f26f6
JM
4433 if (try_const && !init)
4434 /* With a constexpr default constructor, which we checked for when
4435 setting try_const above, default-initialization is equivalent to
4436 value-initialization, and build_value_init gives us something more
4437 friendly to maybe_constant_init. */
4438 explicit_value_init_p = true;
094fe153 4439 if (from_array
1f65a8c8 4440 || ((type_build_ctor_call (type) || init || explicit_value_init_p)
9541ffee 4441 && ! (tree_fits_shwi_p (maxindex)
05bccae2 4442 && (num_initialized_elts
9439e9a1 4443 == tree_to_shwi (maxindex) + 1))))
8a72a046 4444 {
5453bfed 4445 /* If the ITERATOR is lesser or equal to -1, then we don't have to loop;
8a72a046 4446 we've already initialized all the elements. */
4977bab6 4447 tree for_stmt;
f1dedc31 4448 tree elt_init;
b84f4651 4449 tree to;
f1dedc31 4450
3f43ac31 4451 for_stmt = begin_for_stmt (NULL_TREE, NULL_TREE);
17a9e380 4452 finish_init_stmt (for_stmt);
5453bfed 4453 finish_for_cond (build2 (GT_EXPR, boolean_type_node, iterator,
aab384ae 4454 build_int_cst (TREE_TYPE (iterator), -1)),
170a8bd6 4455 for_stmt, false, 0);
e51fbec3 4456 elt_init = cp_build_unary_op (PREDECREMENT_EXPR, iterator, false,
574cfaa4
JM
4457 complain);
4458 if (elt_init == error_mark_node)
4459 errors = true;
4460 finish_for_expr (elt_init, for_stmt);
8d08fdba 4461
b84f4651
MM
4462 to = build1 (INDIRECT_REF, type, base);
4463
ced2fb08
JM
4464 /* If the initializer is {}, then all elements are initialized from T{}.
4465 But for non-classes, that's the same as value-initialization. */
4466 if (empty_list)
4467 {
4468 if (cxx_dialect >= cxx11 && AGGREGATE_TYPE_P (type))
4469 {
08227658 4470 init = build_constructor (init_list_type_node, NULL);
ced2fb08
JM
4471 }
4472 else
4473 {
4474 init = NULL_TREE;
4475 explicit_value_init_p = true;
4476 }
4477 }
4478
8d08fdba
MS
4479 if (from_array)
4480 {
8d08fdba
MS
4481 tree from;
4482
4483 if (base2)
f91352dc
JM
4484 {
4485 from = build1 (INDIRECT_REF, itype, base2);
4486 if (xvalue)
4487 from = move (from);
70f40fea
JJ
4488 if (direct_init)
4489 from = build_tree_list (NULL_TREE, from);
f91352dc 4490 }
8d08fdba
MS
4491 else
4492 from = NULL_TREE;
4493
e278212e
PC
4494 if (TREE_CODE (type) == ARRAY_TYPE)
4495 elt_init = build_vec_init (to, NULL_TREE, from, /*val_init*/false,
4496 from_array, complain);
4497 else if (from_array == 2)
4f2e1536
MP
4498 elt_init = cp_build_modify_expr (input_location, to, NOP_EXPR,
4499 from, complain);
95552437 4500 else if (type_build_ctor_call (type))
5ade1ed2 4501 elt_init = build_aggr_init (to, from, 0, complain);
8d08fdba 4502 else if (from)
4f2e1536 4503 elt_init = cp_build_modify_expr (input_location, to, NOP_EXPR, from,
5ade1ed2 4504 complain);
8d08fdba 4505 else
8dc2b103 4506 gcc_unreachable ();
8d08fdba
MS
4507 }
4508 else if (TREE_CODE (type) == ARRAY_TYPE)
4509 {
16b53405 4510 if (init && !BRACE_ENCLOSED_INITIALIZER_P (init))
0186f684
AO
4511 {
4512 if ((complain & tf_error))
4513 error_at (loc, "array must be initialized "
4514 "with a brace-enclosed initializer");
4515 elt_init = error_mark_node;
4516 }
4517 else
4518 elt_init = build_vec_init (build1 (INDIRECT_REF, type, base),
4519 0, init,
4520 explicit_value_init_p,
4521 0, complain);
f1dedc31 4522 }
844ae01d 4523 else if (explicit_value_init_p)
309714d4
JM
4524 {
4525 elt_init = build_value_init (type, complain);
574cfaa4 4526 if (elt_init != error_mark_node)
309714d4
JM
4527 elt_init = build2 (INIT_EXPR, type, to, elt_init);
4528 }
f1dedc31 4529 else
844ae01d 4530 {
1f65a8c8
JM
4531 gcc_assert (type_build_ctor_call (type) || init);
4532 if (CLASS_TYPE_P (type))
4533 elt_init = build_aggr_init (to, init, 0, complain);
4534 else
4535 {
4536 if (TREE_CODE (init) == TREE_LIST)
4537 init = build_x_compound_expr_from_list (init, ELK_INIT,
4538 complain);
143aa5cc
PC
4539 elt_init = (init == error_mark_node
4540 ? error_mark_node
4541 : build2 (INIT_EXPR, type, to, init));
1f65a8c8 4542 }
844ae01d 4543 }
c8094d83 4544
574cfaa4
JM
4545 if (elt_init == error_mark_node)
4546 errors = true;
4547
c0014b07
JM
4548 if (try_const)
4549 {
a02f26f6 4550 /* FIXME refs to earlier elts */
c0014b07
JM
4551 tree e = maybe_constant_init (elt_init);
4552 if (reduced_constant_expression_p (e))
4553 {
4554 if (initializer_zerop (e))
4555 /* Don't fill the CONSTRUCTOR with zeros. */
4556 e = NULL_TREE;
4557 if (do_static_init)
4558 elt_init = NULL_TREE;
4559 }
4560 else
4561 {
4562 saw_non_const = true;
4563 if (do_static_init)
4564 e = build_zero_init (TREE_TYPE (e), NULL_TREE, true);
a02f26f6
JM
4565 else
4566 e = NULL_TREE;
c0014b07
JM
4567 }
4568
4569 if (e)
4570 {
faa9232d
JJ
4571 HOST_WIDE_INT last = tree_to_shwi (maxindex);
4572 if (num_initialized_elts <= last)
c0014b07
JM
4573 {
4574 tree field = size_int (num_initialized_elts);
faa9232d
JJ
4575 if (num_initialized_elts != last)
4576 field = build2 (RANGE_EXPR, sizetype, field,
4577 size_int (last));
c0014b07
JM
4578 CONSTRUCTOR_APPEND_ELT (const_vec, field, e);
4579 }
4580 }
4581 }
4582
2a3398e1 4583 current_stmt_tree ()->stmts_are_full_exprs_p = 1;
0186f684 4584 if (elt_init && !errors)
c0014b07 4585 finish_expr_stmt (elt_init);
2a3398e1 4586 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
8d08fdba 4587
e51fbec3 4588 finish_expr_stmt (cp_build_unary_op (PREINCREMENT_EXPR, base, false,
5ade1ed2 4589 complain));
8d08fdba 4590 if (base2)
e51fbec3 4591 finish_expr_stmt (cp_build_unary_op (PREINCREMENT_EXPR, base2, false,
5ade1ed2 4592 complain));
0fac6b0b 4593
4977bab6 4594 finish_for_stmt (for_stmt);
8d08fdba 4595 }
8a72a046
MM
4596
4597 /* Make sure to cleanup any partially constructed elements. */
f30efcb7
JM
4598 if (flag_exceptions && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
4599 && from_array != 2)
f1dedc31
MM
4600 {
4601 tree e;
ba47d38d
AH
4602 tree m = cp_build_binary_op (input_location,
4603 MINUS_EXPR, maxindex, iterator,
5ade1ed2 4604 complain);
b2153b98
KL
4605
4606 /* Flatten multi-dimensional array since build_vec_delete only
4607 expects one-dimensional array. */
4608 if (TREE_CODE (type) == ARRAY_TYPE)
ba47d38d
AH
4609 m = cp_build_binary_op (input_location,
4610 MULT_EXPR, m,
99c4346a
JM
4611 /* Avoid mixing signed and unsigned. */
4612 convert (TREE_TYPE (m),
4613 array_type_nelts_total (type)),
5ade1ed2 4614 complain);
8d08fdba 4615
ed5511d9 4616 finish_cleanup_try_block (try_block);
04e4997a 4617 e = build_vec_delete_1 (input_location, rval, m,
e79a6b40 4618 inner_elt_type, sfk_complete_destructor,
574cfaa4
JM
4619 /*use_global_delete=*/0, complain);
4620 if (e == error_mark_node)
4621 errors = true;
f1dedc31
MM
4622 finish_cleanup (e, try_block);
4623 }
4624
303b7406
NS
4625 /* The value of the array initialization is the array itself, RVAL
4626 is a pointer to the first element. */
325c3691 4627 finish_stmt_expr_expr (rval, stmt_expr);
f1dedc31 4628
2a3398e1 4629 stmt_expr = finish_init_stmts (is_global, stmt_expr, compound_stmt);
303b7406 4630
5fb4d142
JM
4631 current_stmt_tree ()->stmts_are_full_exprs_p = destroy_temps;
4632
4633 if (errors)
4634 return error_mark_node;
c0014b07
JM
4635
4636 if (try_const)
4637 {
4638 if (!saw_non_const)
4639 {
4640 tree const_init = build_constructor (atype, const_vec);
4641 return build2 (INIT_EXPR, atype, obase, const_init);
4642 }
4643 else if (do_static_init && !vec_safe_is_empty (const_vec))
4644 DECL_INITIAL (obase) = build_constructor (atype, const_vec);
4645 else
4646 vec_free (const_vec);
4647 }
5fb4d142 4648
9207099b
JM
4649 /* Now make the result have the correct type. */
4650 if (TREE_CODE (atype) == ARRAY_TYPE)
4651 {
4652 atype = build_pointer_type (atype);
4653 stmt_expr = build1 (NOP_EXPR, atype, stmt_expr);
04757a2a 4654 stmt_expr = cp_build_fold_indirect_ref (stmt_expr);
311fa510 4655 TREE_NO_WARNING (stmt_expr) = 1;
9207099b 4656 }
c8094d83 4657
f1dedc31 4658 return stmt_expr;
8d08fdba
MS
4659}
4660
86f45d2c
MM
4661/* Call the DTOR_KIND destructor for EXP. FLAGS are as for
4662 build_delete. */
298d6f60
MM
4663
4664static tree
574cfaa4
JM
4665build_dtor_call (tree exp, special_function_kind dtor_kind, int flags,
4666 tsubst_flags_t complain)
298d6f60 4667{
86f45d2c 4668 tree name;
86f45d2c
MM
4669 switch (dtor_kind)
4670 {
4671 case sfk_complete_destructor:
4672 name = complete_dtor_identifier;
4673 break;
4674
4675 case sfk_base_destructor:
4676 name = base_dtor_identifier;
4677 break;
4678
4679 case sfk_deleting_destructor:
4680 name = deleting_dtor_identifier;
4681 break;
4682
4683 default:
8dc2b103 4684 gcc_unreachable ();
86f45d2c 4685 }
4d20f490
JM
4686
4687 return build_special_member_call (exp, name,
4688 /*args=*/NULL,
4689 /*binfo=*/TREE_TYPE (exp),
4690 flags,
4691 complain);
298d6f60
MM
4692}
4693
8d08fdba
MS
4694/* Generate a call to a destructor. TYPE is the type to cast ADDR to.
4695 ADDR is an expression which yields the store to be destroyed.
86f45d2c
MM
4696 AUTO_DELETE is the name of the destructor to call, i.e., either
4697 sfk_complete_destructor, sfk_base_destructor, or
4698 sfk_deleting_destructor.
8d08fdba
MS
4699
4700 FLAGS is the logical disjunction of zero or more LOOKUP_
ade3dc07 4701 flags. See cp-tree.h for more info. */
e92cc029 4702
8d08fdba 4703tree
04e4997a
PC
4704build_delete (location_t loc, tree otype, tree addr,
4705 special_function_kind auto_delete,
574cfaa4 4706 int flags, int use_global_delete, tsubst_flags_t complain)
8d08fdba 4707{
8d08fdba 4708 tree expr;
8d08fdba
MS
4709
4710 if (addr == error_mark_node)
4711 return error_mark_node;
4712
eca7fc57
JM
4713 tree type = TYPE_MAIN_VARIANT (otype);
4714
8d08fdba
MS
4715 /* Can happen when CURRENT_EXCEPTION_OBJECT gets its type
4716 set to `error_mark_node' before it gets properly cleaned up. */
4717 if (type == error_mark_node)
4718 return error_mark_node;
4719
9f613f06 4720 if (TYPE_PTR_P (type))
eca7fc57 4721 type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
8d08fdba 4722
eca7fc57
JM
4723 if (TREE_CODE (type) == ARRAY_TYPE)
4724 {
4725 if (TYPE_DOMAIN (type) == NULL_TREE)
4726 {
4727 if (complain & tf_error)
04e4997a 4728 error_at (loc, "unknown array size in delete");
eca7fc57
JM
4729 return error_mark_node;
4730 }
04e4997a 4731 return build_vec_delete (loc, addr, array_type_nelts (type),
eca7fc57
JM
4732 auto_delete, use_global_delete, complain);
4733 }
03a904b5 4734
9cbc7d65
JM
4735 bool deleting = (auto_delete == sfk_deleting_destructor);
4736 gcc_assert (deleting == !(flags & LOOKUP_DESTRUCTOR));
4737
eca7fc57 4738 if (TYPE_PTR_P (otype))
8d08fdba 4739 {
eca7fc57 4740 addr = mark_rvalue_use (addr);
23b4deba 4741
b1e5b86c
GB
4742 /* We don't want to warn about delete of void*, only other
4743 incomplete types. Deleting other incomplete types
4744 invokes undefined behavior, but it is not ill-formed, so
4745 compile to something that would even do The Right Thing
4746 (TM) should the type have a trivial dtor and no delete
4747 operator. */
4748 if (!VOID_TYPE_P (type))
8d08fdba 4749 {
b1e5b86c 4750 complete_type (type);
02a32ab4 4751 if (deleting
04e4997a 4752 && !verify_type_context (loc, TCTX_DEALLOCATION, type,
02a32ab4
RS
4753 !(complain & tf_error)))
4754 return error_mark_node;
4755
b1e5b86c
GB
4756 if (!COMPLETE_TYPE_P (type))
4757 {
097f82ec 4758 if (complain & tf_warning)
71205d17 4759 {
097f82ec 4760 auto_diagnostic_group d;
04e4997a
PC
4761 if (warning_at (loc, OPT_Wdelete_incomplete,
4762 "possible problem detected in invocation of "
4763 "%<operator delete%>"))
097f82ec
DM
4764 {
4765 cxx_incomplete_type_diagnostic (addr, type, DK_WARNING);
04e4997a 4766 inform (loc,
a9c697b8
MS
4767 "neither the destructor nor the class-specific "
4768 "%<operator delete%> will be called, even if "
4769 "they are declared when the class is defined");
097f82ec 4770 }
71205d17 4771 }
b1e5b86c 4772 }
9cbc7d65 4773 else if (deleting && warn_delnonvdtor
e2ab8a0f
JW
4774 && MAYBE_CLASS_TYPE_P (type) && !CLASSTYPE_FINAL (type)
4775 && TYPE_POLYMORPHIC_P (type))
014ab419 4776 {
b2cf76f3 4777 tree dtor = CLASSTYPE_DESTRUCTOR (type);
014ab419
JW
4778 if (!dtor || !DECL_VINDEX (dtor))
4779 {
4780 if (CLASSTYPE_PURE_VIRTUALS (type))
04e4997a
PC
4781 warning_at (loc, OPT_Wdelete_non_virtual_dtor,
4782 "deleting object of abstract class type %qT"
4783 " which has non-virtual destructor"
4784 " will cause undefined behavior", type);
014ab419 4785 else
04e4997a
PC
4786 warning_at (loc, OPT_Wdelete_non_virtual_dtor,
4787 "deleting object of polymorphic class type %qT"
4788 " which has non-virtual destructor"
4789 " might cause undefined behavior", type);
014ab419
JW
4790 }
4791 }
8d08fdba 4792 }
2986ae00 4793
f4f206f4 4794 /* Throw away const and volatile on target type of addr. */
4b978f96 4795 addr = convert_force (build_pointer_type (type), addr, 0, complain);
8d08fdba 4796 }
8d08fdba
MS
4797 else
4798 {
4799 /* Don't check PROTECT here; leave that decision to the
4800 destructor. If the destructor is accessible, call it,
4801 else report error. */
574cfaa4
JM
4802 addr = cp_build_addr_expr (addr, complain);
4803 if (addr == error_mark_node)
4804 return error_mark_node;
8d08fdba 4805
4b978f96 4806 addr = convert_force (build_pointer_type (type), addr, 0, complain);
8d08fdba
MS
4807 }
4808
9cbc7d65
JM
4809 if (deleting)
4810 /* We will use ADDR multiple times so we must save it. */
4811 addr = save_expr (addr);
eca7fc57 4812
cdc18417
JM
4813 bool virtual_p = false;
4814 if (type_build_dtor_call (type))
4815 {
4816 if (CLASSTYPE_LAZY_DESTRUCTOR (type))
4817 lazily_declare_fn (sfk_destructor, type);
4818 virtual_p = DECL_VIRTUAL_P (CLASSTYPE_DESTRUCTOR (type));
4819 }
8d08fdba 4820
9cbc7d65
JM
4821 tree head = NULL_TREE;
4822 tree do_delete = NULL_TREE;
a6bb6b07 4823 bool destroying_delete = false;
9cbc7d65
JM
4824
4825 if (!deleting)
4826 {
4827 /* Leave do_delete null. */
4828 }
cdc18417
JM
4829 /* For `::delete x', we must not use the deleting destructor
4830 since then we would not be sure to get the global `operator
4831 delete'. */
9cbc7d65 4832 else if (use_global_delete)
cdc18417 4833 {
cdc18417
JM
4834 head = get_target_expr (build_headof (addr));
4835 /* Delete the object. */
4836 do_delete = build_op_delete_call (DELETE_EXPR,
4837 head,
4838 cxx_sizeof_nowarn (type),
4839 /*global_p=*/true,
4840 /*placement=*/NULL_TREE,
4841 /*alloc_fn=*/NULL_TREE,
4842 complain);
4843 /* Otherwise, treat this like a complete object destructor
4844 call. */
4845 auto_delete = sfk_complete_destructor;
8d08fdba 4846 }
cdc18417
JM
4847 /* If the destructor is non-virtual, there is no deleting
4848 variant. Instead, we must explicitly call the appropriate
4849 `operator delete' here. */
9cbc7d65 4850 else if (!virtual_p)
8d08fdba 4851 {
cdc18417
JM
4852 /* Build the call. */
4853 do_delete = build_op_delete_call (DELETE_EXPR,
4854 addr,
4855 cxx_sizeof_nowarn (type),
4856 /*global_p=*/false,
4857 /*placement=*/NULL_TREE,
4858 /*alloc_fn=*/NULL_TREE,
4859 complain);
4860 /* Call the complete object destructor. */
4861 auto_delete = sfk_complete_destructor;
a6bb6b07
JM
4862 if (do_delete != error_mark_node)
4863 {
4864 tree fn = get_callee_fndecl (do_delete);
4865 destroying_delete = destroying_delete_p (fn);
4866 }
cdc18417 4867 }
9cbc7d65 4868 else if (TYPE_GETS_REG_DELETE (type))
cdc18417
JM
4869 {
4870 /* Make sure we have access to the member op delete, even though
4871 we'll actually be calling it from the destructor. */
4872 build_op_delete_call (DELETE_EXPR, addr, cxx_sizeof_nowarn (type),
4873 /*global_p=*/false,
4874 /*placement=*/NULL_TREE,
4875 /*alloc_fn=*/NULL_TREE,
4876 complain);
4877 }
700f8a87 4878
a6bb6b07 4879 if (!destroying_delete && type_build_dtor_call (type))
cdc18417
JM
4880 expr = build_dtor_call (cp_build_fold_indirect_ref (addr),
4881 auto_delete, flags, complain);
4882 else
4883 expr = build_trivial_dtor_call (addr);
4884 if (expr == error_mark_node)
4885 return error_mark_node;
ade3dc07 4886
9cbc7d65 4887 if (!deleting)
04e4997a
PC
4888 {
4889 protected_set_expr_location (expr, loc);
4890 return expr;
4891 }
9cbc7d65 4892
4924293a
PP
4893 if (do_delete == error_mark_node)
4894 return error_mark_node;
8412b939 4895
cdc18417
JM
4896 if (do_delete && !TREE_SIDE_EFFECTS (expr))
4897 expr = do_delete;
4898 else if (do_delete)
4899 /* The delete operator must be called, regardless of whether
4900 the destructor throws.
8d08fdba 4901
cdc18417
JM
4902 [expr.delete]/7 The deallocation function is called
4903 regardless of whether the destructor for the object or some
4904 element of the array throws an exception. */
4905 expr = build2 (TRY_FINALLY_EXPR, void_type_node, expr, do_delete);
8d08fdba 4906
cdc18417
JM
4907 /* We need to calculate this before the dtor changes the vptr. */
4908 if (head)
4909 expr = build2 (COMPOUND_EXPR, void_type_node, head, expr);
8d08fdba 4910
9cbc7d65
JM
4911 /* Handle deleting a null pointer. */
4912 warning_sentinel s (warn_address);
04e4997a 4913 tree ifexp = cp_build_binary_op (loc, NE_EXPR, addr,
9cbc7d65
JM
4914 nullptr_node, complain);
4915 ifexp = cp_fully_fold (ifexp);
4916
4917 if (ifexp == error_mark_node)
4918 return error_mark_node;
4919 /* This is a compiler generated comparison, don't emit
4920 e.g. -Wnonnull-compare warning for it. */
4921 else if (TREE_CODE (ifexp) == NE_EXPR)
4922 TREE_NO_WARNING (ifexp) = 1;
cdc18417 4923
9cbc7d65 4924 if (!integer_nonzerop (ifexp))
cdc18417
JM
4925 expr = build3 (COND_EXPR, void_type_node, ifexp, expr, void_node);
4926
04e4997a 4927 protected_set_expr_location (expr, loc);
cdc18417 4928 return expr;
ade3dc07 4929}
8d08fdba 4930
ade3dc07
JM
4931/* At the beginning of a destructor, push cleanups that will call the
4932 destructors for our base classes and members.
2a2480e1 4933
a29e1034 4934 Called from begin_destructor_body. */
8d08fdba 4935
ade3dc07 4936void
edaf3e03 4937push_base_cleanups (void)
ade3dc07 4938{
fa743e8c
NS
4939 tree binfo, base_binfo;
4940 int i;
ade3dc07
JM
4941 tree member;
4942 tree expr;
9771b263 4943 vec<tree, va_gc> *vbases;
8d08fdba 4944
ade3dc07 4945 /* Run destructors for all virtual baseclasses. */
45e2bf2e
NS
4946 if (!ABSTRACT_CLASS_TYPE_P (current_class_type)
4947 && CLASSTYPE_VBASECLASSES (current_class_type))
ade3dc07 4948 {
ade3dc07 4949 tree cond = (condition_conversion
f293ce4b
RS
4950 (build2 (BIT_AND_EXPR, integer_type_node,
4951 current_in_charge_parm,
4952 integer_two_node)));
8d08fdba 4953
58c42dc2 4954 /* The CLASSTYPE_VBASECLASSES vector is in initialization
ade3dc07 4955 order, which is also the right order for pushing cleanups. */
9ba5ff0f 4956 for (vbases = CLASSTYPE_VBASECLASSES (current_class_type), i = 0;
9771b263 4957 vec_safe_iterate (vbases, i, &base_binfo); i++)
8d08fdba 4958 {
eca7fc57 4959 if (type_build_dtor_call (BINFO_TYPE (base_binfo)))
8d08fdba 4960 {
c8094d83 4961 expr = build_special_member_call (current_class_ref,
4ba126e4 4962 base_dtor_identifier,
c166b898 4963 NULL,
9ba5ff0f 4964 base_binfo,
c8094d83 4965 (LOOKUP_NORMAL
5ade1ed2 4966 | LOOKUP_NONVIRTUAL),
eca7fc57
JM
4967 tf_warning_or_error);
4968 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo)))
4969 {
4970 expr = build3 (COND_EXPR, void_type_node, cond,
632f2871 4971 expr, void_node);
eca7fc57
JM
4972 finish_decl_cleanup (NULL_TREE, expr);
4973 }
8d08fdba
MS
4974 }
4975 }
ade3dc07
JM
4976 }
4977
ade3dc07 4978 /* Take care of the remaining baseclasses. */
fa743e8c
NS
4979 for (binfo = TYPE_BINFO (current_class_type), i = 0;
4980 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
ade3dc07 4981 {
eca7fc57
JM
4982 if (BINFO_VIRTUAL_P (base_binfo)
4983 || !type_build_dtor_call (BINFO_TYPE (base_binfo)))
ade3dc07
JM
4984 continue;
4985
c8094d83 4986 expr = build_special_member_call (current_class_ref,
4ba126e4 4987 base_dtor_identifier,
c166b898 4988 NULL, base_binfo,
5ade1ed2
DG
4989 LOOKUP_NORMAL | LOOKUP_NONVIRTUAL,
4990 tf_warning_or_error);
eca7fc57
JM
4991 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo)))
4992 finish_decl_cleanup (NULL_TREE, expr);
ade3dc07
JM
4993 }
4994
57ece258
JM
4995 /* Don't automatically destroy union members. */
4996 if (TREE_CODE (current_class_type) == UNION_TYPE)
4997 return;
4998
ade3dc07 4999 for (member = TYPE_FIELDS (current_class_type); member;
910ad8de 5000 member = DECL_CHAIN (member))
ade3dc07 5001 {
57ece258
JM
5002 tree this_type = TREE_TYPE (member);
5003 if (this_type == error_mark_node
2e5d2970
VR
5004 || TREE_CODE (member) != FIELD_DECL
5005 || DECL_ARTIFICIAL (member))
ade3dc07 5006 continue;
04056396 5007 if (ANON_AGGR_TYPE_P (this_type))
57ece258 5008 continue;
eca7fc57 5009 if (type_build_dtor_call (this_type))
ade3dc07 5010 {
c8094d83
MS
5011 tree this_member = (build_class_member_access_expr
5012 (current_class_ref, member,
50ad9642 5013 /*access_path=*/NULL_TREE,
5ade1ed2
DG
5014 /*preserve_reference=*/false,
5015 tf_warning_or_error));
04e4997a 5016 expr = build_delete (input_location, this_type, this_member,
ade3dc07
JM
5017 sfk_complete_destructor,
5018 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_NORMAL,
574cfaa4 5019 0, tf_warning_or_error);
eca7fc57
JM
5020 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (this_type))
5021 finish_decl_cleanup (NULL_TREE, expr);
ade3dc07 5022 }
8d08fdba
MS
5023 }
5024}
5025
8d08fdba
MS
5026/* Build a C++ vector delete expression.
5027 MAXINDEX is the number of elements to be deleted.
5028 ELT_SIZE is the nominal size of each element in the vector.
5029 BASE is the expression that should yield the store to be deleted.
8d08fdba
MS
5030 This function expands (or synthesizes) these calls itself.
5031 AUTO_DELETE_VEC says whether the container (vector) should be deallocated.
8d08fdba
MS
5032
5033 This also calls delete for virtual baseclasses of elements of the vector.
5034
5035 Update: MAXINDEX is no longer needed. The size can be extracted from the
5036 start of the vector for pointers, and from the type for arrays. We still
5037 use MAXINDEX for arrays because it happens to already have one of the
5038 values we'd have to extract. (We could use MAXINDEX with pointers to
5039 confirm the size, and trap if the numbers differ; not clear that it'd
5040 be worth bothering.) */
e92cc029 5041
8d08fdba 5042tree
04e4997a 5043build_vec_delete (location_t loc, tree base, tree maxindex,
574cfaa4
JM
5044 special_function_kind auto_delete_vec,
5045 int use_global_delete, tsubst_flags_t complain)
8d08fdba 5046{
f30432d7 5047 tree type;
49b7aacb
JM
5048 tree rval;
5049 tree base_init = NULL_TREE;
8d08fdba 5050
f30432d7 5051 type = TREE_TYPE (base);
c407792d 5052
50e10fa8 5053 if (TYPE_PTR_P (type))
8d08fdba
MS
5054 {
5055 /* Step back one from start of vector, and read dimension. */
834c6dff 5056 tree cookie_addr;
726a989a 5057 tree size_ptr_type = build_pointer_type (sizetype);
834c6dff 5058
3c784bca 5059 base = mark_rvalue_use (base);
6742d92b 5060 if (TREE_SIDE_EFFECTS (base))
49b7aacb
JM
5061 {
5062 base_init = get_target_expr (base);
5063 base = TARGET_EXPR_SLOT (base_init);
5064 }
708cae97 5065 type = strip_array_types (TREE_TYPE (type));
04e4997a 5066 cookie_addr = fold_build1_loc (loc, NEGATE_EXPR,
db3927fb 5067 sizetype, TYPE_SIZE_UNIT (sizetype));
5d49b6a7
RG
5068 cookie_addr = fold_build_pointer_plus (fold_convert (size_ptr_type, base),
5069 cookie_addr);
04757a2a 5070 maxindex = cp_build_fold_indirect_ref (cookie_addr);
8d08fdba 5071 }
f30432d7 5072 else if (TREE_CODE (type) == ARRAY_TYPE)
8d08fdba 5073 {
f4f206f4
KH
5074 /* Get the total number of things in the array, maxindex is a
5075 bad name. */
f30432d7 5076 maxindex = array_type_nelts_total (type);
834c6dff 5077 type = strip_array_types (type);
16b53405 5078 base = decay_conversion (base, complain);
574cfaa4
JM
5079 if (base == error_mark_node)
5080 return error_mark_node;
6742d92b 5081 if (TREE_SIDE_EFFECTS (base))
49b7aacb
JM
5082 {
5083 base_init = get_target_expr (base);
5084 base = TARGET_EXPR_SLOT (base_init);
5085 }
8d08fdba
MS
5086 }
5087 else
5088 {
574cfaa4 5089 if (base != error_mark_node && !(complain & tf_error))
04e4997a
PC
5090 error_at (loc,
5091 "type to vector delete is neither pointer or array type");
8d08fdba
MS
5092 return error_mark_node;
5093 }
8d08fdba 5094
04e4997a 5095 rval = build_vec_delete_1 (loc, base, maxindex, type, auto_delete_vec,
574cfaa4
JM
5096 use_global_delete, complain);
5097 if (base_init && rval != error_mark_node)
f293ce4b 5098 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), base_init, rval);
49b7aacb 5099
04e4997a 5100 protected_set_expr_location (rval, loc);
49b7aacb 5101 return rval;
8d08fdba 5102}
ff502317
BE
5103
5104#include "gt-cp-init.h"