]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cp/init.c
re PR libstdc++/51386 (23_containers/unordered_set/hash_policy/load_factor.cc executi...
[thirdparty/gcc.git] / gcc / cp / init.c
CommitLineData
8d08fdba 1/* Handle initialization things in C++.
d6a8bdff 2 Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
e33eba75
JJ
3 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
4 2011 Free Software Foundation, Inc.
8d08fdba
MS
5 Contributed by Michael Tiemann (tiemann@cygnus.com)
6
f5adbb8d 7This file is part of GCC.
8d08fdba 8
f5adbb8d 9GCC is free software; you can redistribute it and/or modify
8d08fdba 10it under the terms of the GNU General Public License as published by
e77f031d 11the Free Software Foundation; either version 3, or (at your option)
8d08fdba
MS
12any later version.
13
f5adbb8d 14GCC is distributed in the hope that it will be useful,
8d08fdba
MS
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
e77f031d
NC
20along with GCC; see the file COPYING3. If not see
21<http://www.gnu.org/licenses/>. */
8d08fdba 22
e92cc029 23/* High-level class interface. */
8d08fdba
MS
24
25#include "config.h"
8d052bc7 26#include "system.h"
4977bab6
ZW
27#include "coretypes.h"
28#include "tm.h"
8d08fdba 29#include "tree.h"
8d08fdba
MS
30#include "cp-tree.h"
31#include "flags.h"
e8abc66f 32#include "output.h"
46e995e0 33#include "target.h"
8d08fdba 34
2a3398e1
NS
35static bool begin_init_stmts (tree *, tree *);
36static tree finish_init_stmts (bool, tree, tree);
2282d28d 37static void construct_virtual_base (tree, tree);
5ade1ed2
DG
38static void expand_aggr_init_1 (tree, tree, tree, tree, int, tsubst_flags_t);
39static void expand_default_init (tree, tree, tree, tree, int, tsubst_flags_t);
2282d28d 40static void perform_member_init (tree, tree);
362efdc1
NN
41static tree build_builtin_delete_call (tree);
42static int member_init_ok_or_else (tree, tree, tree);
43static void expand_virtual_init (tree, tree);
2282d28d 44static tree sort_mem_initializers (tree, tree);
362efdc1
NN
45static tree initializing_context (tree);
46static void expand_cleanup_for_base (tree, tree);
362efdc1 47static tree dfs_initialize_vtbl_ptrs (tree, void *);
362efdc1
NN
48static tree build_field_list (tree, tree, int *);
49static tree build_vtbl_address (tree);
40bb78ad 50static int diagnose_uninitialized_cst_or_ref_member_1 (tree, tree, bool, bool);
8d08fdba 51
3dbc07b6
MM
52/* We are about to generate some complex initialization code.
53 Conceptually, it is all a single expression. However, we may want
54 to include conditionals, loops, and other such statement-level
55 constructs. Therefore, we build the initialization code inside a
56 statement-expression. This function starts such an expression.
57 STMT_EXPR_P and COMPOUND_STMT_P are filled in by this function;
58 pass them back to finish_init_stmts when the expression is
59 complete. */
60
2a3398e1 61static bool
362efdc1 62begin_init_stmts (tree *stmt_expr_p, tree *compound_stmt_p)
3dbc07b6 63{
38e01f9e 64 bool is_global = !building_stmt_list_p ();
c8094d83 65
2a3398e1 66 *stmt_expr_p = begin_stmt_expr ();
325c3691 67 *compound_stmt_p = begin_compound_stmt (BCS_NO_SCOPE);
2a3398e1
NS
68
69 return is_global;
3dbc07b6
MM
70}
71
72/* Finish out the statement-expression begun by the previous call to
73 begin_init_stmts. Returns the statement-expression itself. */
74
2a3398e1
NS
75static tree
76finish_init_stmts (bool is_global, tree stmt_expr, tree compound_stmt)
c8094d83 77{
7a3397c7 78 finish_compound_stmt (compound_stmt);
c8094d83 79
303b7406 80 stmt_expr = finish_stmt_expr (stmt_expr, true);
3dbc07b6 81
38e01f9e 82 gcc_assert (!building_stmt_list_p () == is_global);
c8094d83 83
3dbc07b6
MM
84 return stmt_expr;
85}
86
87/* Constructors */
88
338d90b8
NS
89/* Called from initialize_vtbl_ptrs via dfs_walk. BINFO is the base
90 which we want to initialize the vtable pointer for, DATA is
91 TREE_LIST whose TREE_VALUE is the this ptr expression. */
7177d104 92
d569399b 93static tree
362efdc1 94dfs_initialize_vtbl_ptrs (tree binfo, void *data)
d569399b 95{
5d5a519f
NS
96 if (!TYPE_CONTAINS_VPTR_P (BINFO_TYPE (binfo)))
97 return dfs_skip_bases;
c8094d83 98
5d5a519f 99 if (!BINFO_PRIMARY_P (binfo) || BINFO_VIRTUAL_P (binfo))
d569399b
MM
100 {
101 tree base_ptr = TREE_VALUE ((tree) data);
7177d104 102
a271590a
PC
103 base_ptr = build_base_path (PLUS_EXPR, base_ptr, binfo, /*nonnull=*/1,
104 tf_warning_or_error);
d569399b
MM
105
106 expand_virtual_init (binfo, base_ptr);
107 }
7177d104 108
d569399b
MM
109 return NULL_TREE;
110}
111
cf2e003b
MM
112/* Initialize all the vtable pointers in the object pointed to by
113 ADDR. */
e92cc029 114
8d08fdba 115void
362efdc1 116initialize_vtbl_ptrs (tree addr)
8d08fdba 117{
cf2e003b
MM
118 tree list;
119 tree type;
120
121 type = TREE_TYPE (TREE_TYPE (addr));
122 list = build_tree_list (type, addr);
d569399b 123
bbd15aac 124 /* Walk through the hierarchy, initializing the vptr in each base
1f5a253a 125 class. We do these in pre-order because we can't find the virtual
3461fba7
NS
126 bases for a class until we've initialized the vtbl for that
127 class. */
5d5a519f 128 dfs_walk_once (TYPE_BINFO (type), dfs_initialize_vtbl_ptrs, NULL, list);
8d08fdba 129}
d569399b 130
17bbb839
MM
131/* Return an expression for the zero-initialization of an object with
132 type T. This expression will either be a constant (in the case
133 that T is a scalar), or a CONSTRUCTOR (in the case that T is an
b43d1bde
PC
134 aggregate), or NULL (in the case that T does not require
135 initialization). In either case, the value can be used as
136 DECL_INITIAL for a decl of the indicated TYPE; it is a valid static
137 initializer. If NELTS is non-NULL, and TYPE is an ARRAY_TYPE, NELTS
138 is the number of elements in the array. If STATIC_STORAGE_P is
139 TRUE, initializers are only generated for entities for which
1cb8292f 140 zero-initialization does not simply mean filling the storage with
e33eba75
JJ
141 zero bytes. FIELD_SIZE, if non-NULL, is the bit size of the field,
142 subfields with bit positions at or above that bit size shouldn't
143 be added. */
94e6e4c4 144
e33eba75
JJ
145static tree
146build_zero_init_1 (tree type, tree nelts, bool static_storage_p,
147 tree field_size)
94e6e4c4 148{
17bbb839
MM
149 tree init = NULL_TREE;
150
151 /* [dcl.init]
152
0fcedd9c 153 To zero-initialize an object of type T means:
17bbb839
MM
154
155 -- if T is a scalar type, the storage is set to the value of zero
0cbd7506 156 converted to T.
17bbb839
MM
157
158 -- if T is a non-union class type, the storage for each nonstatic
0cbd7506 159 data member and each base-class subobject is zero-initialized.
17bbb839
MM
160
161 -- if T is a union type, the storage for its first data member is
0cbd7506 162 zero-initialized.
17bbb839
MM
163
164 -- if T is an array type, the storage for each element is
0cbd7506 165 zero-initialized.
17bbb839
MM
166
167 -- if T is a reference type, no initialization is performed. */
94e6e4c4 168
50bc768d 169 gcc_assert (nelts == NULL_TREE || TREE_CODE (nelts) == INTEGER_CST);
7a1d37e9 170
17bbb839
MM
171 if (type == error_mark_node)
172 ;
173 else if (static_storage_p && zero_init_p (type))
174 /* In order to save space, we do not explicitly build initializers
175 for items that do not need them. GCC's semantics are that
176 items with static storage duration that are not otherwise
177 initialized are initialized to zero. */
178 ;
89401152
PC
179 else if (TYPE_PTR_P (type) || TYPE_PTR_TO_MEMBER_P (type))
180 init = convert (type, nullptr_node);
b8063b29 181 else if (SCALAR_TYPE_P (type))
908e152c 182 init = convert (type, integer_zero_node);
17bbb839
MM
183 else if (CLASS_TYPE_P (type))
184 {
185 tree field;
4038c495 186 VEC(constructor_elt,gc) *v = NULL;
17bbb839 187
17bbb839 188 /* Iterate over the fields, building initializations. */
910ad8de 189 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
17bbb839
MM
190 {
191 if (TREE_CODE (field) != FIELD_DECL)
192 continue;
193
e33eba75
JJ
194 /* Don't add virtual bases for base classes if they are beyond
195 the size of the current field, that means it is present
196 somewhere else in the object. */
197 if (field_size)
198 {
199 tree bitpos = bit_position (field);
200 if (TREE_CODE (bitpos) == INTEGER_CST
201 && !tree_int_cst_lt (bitpos, field_size))
202 continue;
203 }
204
17bbb839
MM
205 /* Note that for class types there will be FIELD_DECLs
206 corresponding to base classes as well. Thus, iterating
207 over TYPE_FIELDs will result in correct initialization of
208 all of the subobjects. */
32a11c08 209 if (!static_storage_p || !zero_init_p (TREE_TYPE (field)))
4038c495 210 {
e33eba75
JJ
211 tree new_field_size
212 = (DECL_FIELD_IS_BASE (field)
213 && DECL_SIZE (field)
214 && TREE_CODE (DECL_SIZE (field)) == INTEGER_CST)
215 ? DECL_SIZE (field) : NULL_TREE;
216 tree value = build_zero_init_1 (TREE_TYPE (field),
217 /*nelts=*/NULL_TREE,
218 static_storage_p,
219 new_field_size);
b43d1bde
PC
220 if (value)
221 CONSTRUCTOR_APPEND_ELT(v, field, value);
4038c495 222 }
17bbb839
MM
223
224 /* For unions, only the first field is initialized. */
225 if (TREE_CODE (type) == UNION_TYPE)
226 break;
227 }
4038c495 228
0fcedd9c
JM
229 /* Build a constructor to contain the initializations. */
230 init = build_constructor (type, v);
17bbb839
MM
231 }
232 else if (TREE_CODE (type) == ARRAY_TYPE)
94e6e4c4 233 {
17bbb839 234 tree max_index;
4038c495 235 VEC(constructor_elt,gc) *v = NULL;
17bbb839 236
17bbb839 237 /* Iterate over the array elements, building initializations. */
6b6c8106 238 if (nelts)
db3927fb
AH
239 max_index = fold_build2_loc (input_location,
240 MINUS_EXPR, TREE_TYPE (nelts),
7866705a 241 nelts, integer_one_node);
6b6c8106
SB
242 else
243 max_index = array_type_nelts (type);
9bdb04a2
AP
244
245 /* If we have an error_mark here, we should just return error mark
246 as we don't know the size of the array yet. */
247 if (max_index == error_mark_node)
248 return error_mark_node;
50bc768d 249 gcc_assert (TREE_CODE (max_index) == INTEGER_CST);
7a1d37e9 250
a8e6c82a
MM
251 /* A zero-sized array, which is accepted as an extension, will
252 have an upper bound of -1. */
253 if (!tree_int_cst_equal (max_index, integer_minus_one_node))
94763647 254 {
4038c495
GB
255 constructor_elt *ce;
256
257 v = VEC_alloc (constructor_elt, gc, 1);
258 ce = VEC_quick_push (constructor_elt, v, NULL);
c8094d83 259
b01f0d13
AP
260 /* If this is a one element array, we just use a regular init. */
261 if (tree_int_cst_equal (size_zero_node, max_index))
4038c495 262 ce->index = size_zero_node;
b01f0d13 263 else
4038c495
GB
264 ce->index = build2 (RANGE_EXPR, sizetype, size_zero_node,
265 max_index);
c8094d83 266
e33eba75
JJ
267 ce->value = build_zero_init_1 (TREE_TYPE (type),
268 /*nelts=*/NULL_TREE,
269 static_storage_p, NULL_TREE);
94763647 270 }
c8094d83 271
4038c495
GB
272 /* Build a constructor to contain the initializations. */
273 init = build_constructor (type, v);
94e6e4c4 274 }
c846e8cd 275 else if (TREE_CODE (type) == VECTOR_TYPE)
e8160c9a 276 init = build_zero_cst (type);
94e6e4c4 277 else
8dc2b103 278 gcc_assert (TREE_CODE (type) == REFERENCE_TYPE);
94e6e4c4 279
17bbb839
MM
280 /* In all cases, the initializer is a constant. */
281 if (init)
51eed280 282 TREE_CONSTANT (init) = 1;
94e6e4c4
AO
283
284 return init;
285}
286
e33eba75
JJ
287/* Return an expression for the zero-initialization of an object with
288 type T. This expression will either be a constant (in the case
289 that T is a scalar), or a CONSTRUCTOR (in the case that T is an
290 aggregate), or NULL (in the case that T does not require
291 initialization). In either case, the value can be used as
292 DECL_INITIAL for a decl of the indicated TYPE; it is a valid static
293 initializer. If NELTS is non-NULL, and TYPE is an ARRAY_TYPE, NELTS
294 is the number of elements in the array. If STATIC_STORAGE_P is
295 TRUE, initializers are only generated for entities for which
296 zero-initialization does not simply mean filling the storage with
297 zero bytes. */
298
299tree
300build_zero_init (tree type, tree nelts, bool static_storage_p)
301{
302 return build_zero_init_1 (type, nelts, static_storage_p, NULL_TREE);
303}
304
0fcedd9c 305/* Return a suitable initializer for value-initializing an object of type
8f540f06 306 TYPE, as described in [dcl.init]. */
0fcedd9c 307
8f540f06 308tree
309714d4 309build_value_init (tree type, tsubst_flags_t complain)
0fcedd9c
JM
310{
311 /* [dcl.init]
312
313 To value-initialize an object of type T means:
314
315 - if T is a class type (clause 9) with a user-provided constructor
316 (12.1), then the default constructor for T is called (and the
317 initialization is ill-formed if T has no accessible default
318 constructor);
319
320 - if T is a non-union class type without a user-provided constructor,
321 then every non-static data member and base-class component of T is
322 value-initialized;92)
323
324 - if T is an array type, then each element is value-initialized;
325
326 - otherwise, the object is zero-initialized.
327
328 A program that calls for default-initialization or
329 value-initialization of an entity of reference type is ill-formed.
330
331 92) Value-initialization for such a class object may be implemented by
332 zero-initializing the object and then calling the default
333 constructor. */
334
95d7bdaa 335 /* The AGGR_INIT_EXPR tweaking below breaks in templates. */
27879147 336 gcc_assert (!processing_template_decl || SCALAR_TYPE_P (type));
95d7bdaa 337
0fcedd9c
JM
338 if (CLASS_TYPE_P (type))
339 {
7b37a0c5
JM
340 /* Instead of the above, only consider the user-providedness of the
341 default constructor itself so value-initializing a class with an
342 explicitly defaulted default constructor and another user-provided
343 constructor works properly (c++std-core-19883). */
344 if (type_has_user_provided_default_constructor (type)
345 || (!TYPE_HAS_DEFAULT_CONSTRUCTOR (type)
346 && type_has_user_provided_constructor (type)))
844ae01d 347 return build_aggr_init_expr
0fcedd9c
JM
348 (type,
349 build_special_member_call (NULL_TREE, complete_ctor_identifier,
c166b898 350 NULL, type, LOOKUP_NORMAL,
362115a9
JM
351 complain),
352 complain);
7b37a0c5 353 else if (TYPE_HAS_COMPLEX_DFLT (type))
8f540f06
JM
354 {
355 /* This is a class that needs constructing, but doesn't have
356 a user-provided constructor. So we need to zero-initialize
357 the object and then call the implicitly defined ctor.
450a927a 358 This will be handled in simplify_aggr_init_expr. */
8f540f06
JM
359 tree ctor = build_special_member_call
360 (NULL_TREE, complete_ctor_identifier,
309714d4 361 NULL, type, LOOKUP_NORMAL, complain);
66403b38 362 ctor = build_aggr_init_expr (type, ctor, complain);
272dc851 363 if (ctor != error_mark_node)
66403b38 364 AGGR_INIT_ZERO_FIRST (ctor) = 1;
8f540f06
JM
365 return ctor;
366 }
fd97a96a 367 }
309714d4 368 return build_value_init_noctor (type, complain);
fd97a96a
JM
369}
370
371/* Like build_value_init, but don't call the constructor for TYPE. Used
372 for base initializers. */
373
374tree
309714d4 375build_value_init_noctor (tree type, tsubst_flags_t complain)
fd97a96a 376{
4ddd8a74
JM
377 /* FIXME the class and array cases should just use digest_init once it is
378 SFINAE-enabled. */
fd97a96a
JM
379 if (CLASS_TYPE_P (type))
380 {
7b37a0c5 381 gcc_assert (!TYPE_HAS_COMPLEX_DFLT (type));
fd97a96a
JM
382
383 if (TREE_CODE (type) != UNION_TYPE)
0fcedd9c 384 {
8f540f06 385 tree field;
0fcedd9c 386 VEC(constructor_elt,gc) *v = NULL;
0fcedd9c
JM
387
388 /* Iterate over the fields, building initializations. */
910ad8de 389 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
0fcedd9c
JM
390 {
391 tree ftype, value;
392
393 if (TREE_CODE (field) != FIELD_DECL)
394 continue;
395
396 ftype = TREE_TYPE (field);
397
0fcedd9c
JM
398 /* We could skip vfields and fields of types with
399 user-defined constructors, but I think that won't improve
400 performance at all; it should be simpler in general just
401 to zero out the entire object than try to only zero the
402 bits that actually need it. */
403
404 /* Note that for class types there will be FIELD_DECLs
405 corresponding to base classes as well. Thus, iterating
406 over TYPE_FIELDs will result in correct initialization of
407 all of the subobjects. */
309714d4 408 value = build_value_init (ftype, complain);
0fcedd9c 409
351ccf20
JM
410 if (value == error_mark_node)
411 return error_mark_node;
412
0fcedd9c
JM
413 if (value)
414 CONSTRUCTOR_APPEND_ELT(v, field, value);
415 }
416
417 /* Build a constructor to contain the zero- initializations. */
8f540f06 418 return build_constructor (type, v);
0fcedd9c
JM
419 }
420 }
421 else if (TREE_CODE (type) == ARRAY_TYPE)
422 {
423 VEC(constructor_elt,gc) *v = NULL;
424
425 /* Iterate over the array elements, building initializations. */
426 tree max_index = array_type_nelts (type);
427
428 /* If we have an error_mark here, we should just return error mark
429 as we don't know the size of the array yet. */
430 if (max_index == error_mark_node)
462aa169 431 {
e2a009c7
JM
432 if (complain & tf_error)
433 error ("cannot value-initialize array of unknown bound %qT",
434 type);
462aa169
JM
435 return error_mark_node;
436 }
0fcedd9c
JM
437 gcc_assert (TREE_CODE (max_index) == INTEGER_CST);
438
439 /* A zero-sized array, which is accepted as an extension, will
440 have an upper bound of -1. */
441 if (!tree_int_cst_equal (max_index, integer_minus_one_node))
442 {
443 constructor_elt *ce;
444
445 v = VEC_alloc (constructor_elt, gc, 1);
446 ce = VEC_quick_push (constructor_elt, v, NULL);
447
448 /* If this is a one element array, we just use a regular init. */
449 if (tree_int_cst_equal (size_zero_node, max_index))
450 ce->index = size_zero_node;
451 else
452 ce->index = build2 (RANGE_EXPR, sizetype, size_zero_node,
453 max_index);
454
309714d4 455 ce->value = build_value_init (TREE_TYPE (type), complain);
9dbd4406 456
351ccf20
JM
457 if (ce->value == error_mark_node)
458 return error_mark_node;
459
4ddd8a74
JM
460 /* We shouldn't have gotten here for anything that would need
461 non-trivial initialization, and gimplify_init_ctor_preeval
462 would need to be fixed to allow it. */
9dbd4406
JM
463 gcc_assert (TREE_CODE (ce->value) != TARGET_EXPR
464 && TREE_CODE (ce->value) != AGGR_INIT_EXPR);
0fcedd9c
JM
465 }
466
467 /* Build a constructor to contain the initializations. */
468 return build_constructor (type, v);
469 }
2b8497cd
JM
470 else if (TREE_CODE (type) == FUNCTION_TYPE)
471 {
472 if (complain & tf_error)
473 error ("value-initialization of function type %qT", type);
474 return error_mark_node;
475 }
351ccf20
JM
476 else if (TREE_CODE (type) == REFERENCE_TYPE)
477 {
478 if (complain & tf_error)
479 error ("value-initialization of reference type %qT", type);
480 return error_mark_node;
481 }
0fcedd9c
JM
482
483 return build_zero_init (type, NULL_TREE, /*static_storage_p=*/false);
484}
485
238e471c
VV
486/* Initialize current class with INIT, a TREE_LIST of
487 arguments for a target constructor. If TREE_LIST is void_type_node,
488 an empty initializer list was given. */
489
490static void
491perform_target_ctor (tree init)
492{
493 tree decl = current_class_ref;
494 tree type = current_class_type;
495
496 finish_expr_stmt (build_aggr_init (decl, init, LOOKUP_NORMAL,
497 tf_warning_or_error));
498 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type))
499 {
500 tree expr = build_delete (type, decl, sfk_complete_destructor,
501 LOOKUP_NORMAL
502 |LOOKUP_NONVIRTUAL
503 |LOOKUP_DESTRUCTOR,
504 0, tf_warning_or_error);
505 if (expr != error_mark_node)
506 finish_eh_cleanup (expr);
507 }
508}
509
2282d28d
MM
510/* Initialize MEMBER, a FIELD_DECL, with INIT, a TREE_LIST of
511 arguments. If TREE_LIST is void_type_node, an empty initializer
512 list was given; if NULL_TREE no initializer was given. */
e92cc029 513
8d08fdba 514static void
2282d28d 515perform_member_init (tree member, tree init)
8d08fdba
MS
516{
517 tree decl;
518 tree type = TREE_TYPE (member);
2282d28d 519
0e5f8a59
JM
520 /* Use the non-static data member initializer if there was no
521 mem-initializer for this field. */
522 if (init == NULL_TREE)
6fd44881 523 {
2598165f 524 if (DECL_LANG_SPECIFIC (member) && DECL_TEMPLATE_INFO (member))
6fd44881
JM
525 /* Do deferred instantiation of the NSDMI. */
526 init = (tsubst_copy_and_build
2598165f
JM
527 (DECL_INITIAL (DECL_TI_TEMPLATE (member)),
528 DECL_TI_ARGS (member),
6fd44881
JM
529 tf_warning_or_error, member, /*function_p=*/false,
530 /*integral_constant_expression_p=*/false));
531 else
e2df21bf
JM
532 {
533 init = DECL_INITIAL (member);
534 /* Strip redundant TARGET_EXPR so we don't need to remap it, and
535 so the aggregate init code below will see a CONSTRUCTOR. */
536 if (init && TREE_CODE (init) == TARGET_EXPR
537 && !VOID_TYPE_P (TREE_TYPE (TARGET_EXPR_INITIAL (init))))
538 init = TARGET_EXPR_INITIAL (init);
539 init = break_out_target_exprs (init);
540 }
6fd44881 541 }
0e5f8a59 542
a9eba00e
PC
543 if (init == error_mark_node)
544 return;
545
2282d28d
MM
546 /* Effective C++ rule 12 requires that all data members be
547 initialized. */
9dbd4406 548 if (warn_ecpp && init == NULL_TREE && TREE_CODE (type) != ARRAY_TYPE)
c5d75364
MLI
549 warning_at (DECL_SOURCE_LOCATION (current_function_decl), OPT_Weffc__,
550 "%qD should be initialized in the member initialization list",
551 member);
2282d28d 552
2282d28d 553 /* Get an lvalue for the data member. */
50ad9642
MM
554 decl = build_class_member_access_expr (current_class_ref, member,
555 /*access_path=*/NULL_TREE,
5ade1ed2
DG
556 /*preserve_reference=*/true,
557 tf_warning_or_error);
2fbfe9b8
MS
558 if (decl == error_mark_node)
559 return;
560
c11e39b0
JW
561 if (warn_init_self && init && TREE_CODE (init) == TREE_LIST
562 && TREE_CHAIN (init) == NULL_TREE)
563 {
564 tree val = TREE_VALUE (init);
565 if (TREE_CODE (val) == COMPONENT_REF && TREE_OPERAND (val, 1) == member
566 && TREE_OPERAND (val, 0) == current_class_ref)
567 warning_at (DECL_SOURCE_LOCATION (current_function_decl),
568 OPT_Wuninitialized, "%qD is initialized with itself",
569 member);
570 }
571
9dbd4406
JM
572 if (init == void_type_node)
573 {
574 /* mem() means value-initialization. */
575 if (TREE_CODE (type) == ARRAY_TYPE)
0f737a30 576 {
9c69dcea 577 init = build_vec_init_expr (type, init, tf_warning_or_error);
4de2f020 578 init = build2 (INIT_EXPR, type, decl, init);
0f737a30
JJ
579 finish_expr_stmt (init);
580 }
9dbd4406
JM
581 else
582 {
48e5d119
PC
583 tree value = build_value_init (type, tf_warning_or_error);
584 if (value == error_mark_node)
585 return;
586 init = build2 (INIT_EXPR, type, decl, value);
351ccf20 587 finish_expr_stmt (init);
9dbd4406 588 }
9dbd4406 589 }
6bdb8141
JM
590 /* Deal with this here, as we will get confused if we try to call the
591 assignment op for an anonymous union. This can happen in a
592 synthesized copy constructor. */
9dbd4406 593 else if (ANON_AGGR_TYPE_P (type))
6bdb8141 594 {
ff9f1a5d
MM
595 if (init)
596 {
f293ce4b 597 init = build2 (INIT_EXPR, type, decl, TREE_VALUE (init));
ff9f1a5d
MM
598 finish_expr_stmt (init);
599 }
6bdb8141 600 }
e2df21bf
JM
601 else if (init
602 && (TREE_CODE (type) == REFERENCE_TYPE
603 /* Pre-digested NSDMI. */
604 || (((TREE_CODE (init) == CONSTRUCTOR
605 && TREE_TYPE (init) == type)
606 /* { } mem-initializer. */
607 || (TREE_CODE (init) == TREE_LIST
608 && TREE_CODE (TREE_VALUE (init)) == CONSTRUCTOR
609 && CONSTRUCTOR_IS_DIRECT_INIT (TREE_VALUE (init))))
610 && (CP_AGGREGATE_TYPE_P (type)
611 || is_std_init_list (type)))))
612 {
613 /* With references and list-initialization, we need to deal with
614 extending temporary lifetimes. 12.2p5: "A temporary bound to a
615 reference member in a constructor’s ctor-initializer (12.6.2)
616 persists until the constructor exits." */
617 unsigned i; tree t;
618 VEC(tree,gc) *cleanups = make_tree_vector ();
619 if (TREE_CODE (init) == TREE_LIST)
620 init = build_x_compound_expr_from_list (init, ELK_MEM_INIT,
621 tf_warning_or_error);
622 if (TREE_TYPE (init) != type)
623 init = digest_init (type, init, tf_warning_or_error);
624 if (init == error_mark_node)
625 return;
f3fae478
JM
626 /* A FIELD_DECL doesn't really have a suitable lifetime, but
627 make_temporary_var_for_ref_to_temp will treat it as automatic and
628 set_up_extended_ref_temp wants to use the decl in a warning. */
2c6f7927 629 init = extend_ref_init_temps (member, init, &cleanups);
e2df21bf
JM
630 if (TREE_CODE (type) == ARRAY_TYPE
631 && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (type)))
632 init = build_vec_init_expr (type, init, tf_warning_or_error);
633 init = build2 (INIT_EXPR, type, decl, init);
634 finish_expr_stmt (init);
635 FOR_EACH_VEC_ELT (tree, cleanups, i, t)
636 push_cleanup (decl, t, false);
637 release_tree_vector (cleanups);
638 }
a0348261
JM
639 else if (type_build_ctor_call (type)
640 || (init && CLASS_TYPE_P (strip_array_types (type))))
8d08fdba 641 {
534ecb17 642 if (TREE_CODE (type) == ARRAY_TYPE)
8d08fdba 643 {
534ecb17
JM
644 if (init)
645 {
dd56ca9f
JM
646 if (TREE_CHAIN (init))
647 init = error_mark_node;
648 else
649 init = TREE_VALUE (init);
f41349a3
JM
650 if (BRACE_ENCLOSED_INITIALIZER_P (init))
651 init = digest_init (type, init, tf_warning_or_error);
534ecb17
JM
652 }
653 if (init == NULL_TREE
654 || same_type_ignoring_top_level_qualifiers_p (type,
655 TREE_TYPE (init)))
656 {
9c69dcea 657 init = build_vec_init_expr (type, init, tf_warning_or_error);
534ecb17
JM
658 init = build2 (INIT_EXPR, type, decl, init);
659 finish_expr_stmt (init);
660 }
661 else
662 error ("invalid initializer for array member %q#D", member);
8d08fdba
MS
663 }
664 else
b87d79e6 665 {
b8bf6ad9
JM
666 int flags = LOOKUP_NORMAL;
667 if (DECL_DEFAULTED_FN (current_function_decl))
668 flags |= LOOKUP_DEFAULTED;
b87d79e6
JM
669 if (CP_TYPE_CONST_P (type)
670 && init == NULL_TREE
6132bdd7 671 && default_init_uninitialized_part (type))
b87d79e6
JM
672 /* TYPE_NEEDS_CONSTRUCTING can be set just because we have a
673 vtable; still give this diagnostic. */
c5d75364
MLI
674 permerror (DECL_SOURCE_LOCATION (current_function_decl),
675 "uninitialized member %qD with %<const%> type %qT",
676 member, type);
b8bf6ad9 677 finish_expr_stmt (build_aggr_init (decl, init, flags,
b87d79e6
JM
678 tf_warning_or_error));
679 }
8d08fdba
MS
680 }
681 else
682 {
683 if (init == NULL_TREE)
684 {
31d1acec 685 tree core_type;
8d08fdba 686 /* member traversal: note it leaves init NULL */
9dbd4406 687 if (TREE_CODE (type) == REFERENCE_TYPE)
c5d75364
MLI
688 permerror (DECL_SOURCE_LOCATION (current_function_decl),
689 "uninitialized reference member %qD",
690 member);
58ec3cc5 691 else if (CP_TYPE_CONST_P (type))
c5d75364
MLI
692 permerror (DECL_SOURCE_LOCATION (current_function_decl),
693 "uninitialized member %qD with %<const%> type %qT",
694 member, type);
31d1acec 695
69f36ba6
JM
696 core_type = strip_array_types (type);
697
012e6a1e
JM
698 if (CLASS_TYPE_P (core_type)
699 && (CLASSTYPE_READONLY_FIELDS_NEED_INIT (core_type)
700 || CLASSTYPE_REF_FIELDS_NEED_INIT (core_type)))
701 diagnose_uninitialized_cst_or_ref_member (core_type,
40bb78ad
FC
702 /*using_new=*/false,
703 /*complain=*/true);
8d08fdba
MS
704 }
705 else if (TREE_CODE (init) == TREE_LIST)
c7b62f14
NS
706 /* There was an explicit member initialization. Do some work
707 in that case. */
d555b1c7
PC
708 init = build_x_compound_expr_from_list (init, ELK_MEM_INIT,
709 tf_warning_or_error);
8d08fdba 710
4f0aa416 711 if (init)
5ade1ed2
DG
712 finish_expr_stmt (cp_build_modify_expr (decl, INIT_EXPR, init,
713 tf_warning_or_error));
8d08fdba 714 }
eb66be0e 715
834c6dff 716 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type))
b7484fbe 717 {
de22184b
MS
718 tree expr;
719
50ad9642
MM
720 expr = build_class_member_access_expr (current_class_ref, member,
721 /*access_path=*/NULL_TREE,
5ade1ed2
DG
722 /*preserve_reference=*/false,
723 tf_warning_or_error);
3ec6bad3 724 expr = build_delete (type, expr, sfk_complete_destructor,
574cfaa4
JM
725 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0,
726 tf_warning_or_error);
b7484fbe
MS
727
728 if (expr != error_mark_node)
659e5a7a 729 finish_eh_cleanup (expr);
b7484fbe 730 }
8d08fdba
MS
731}
732
ff9f1a5d
MM
733/* Returns a TREE_LIST containing (as the TREE_PURPOSE of each node) all
734 the FIELD_DECLs on the TYPE_FIELDS list for T, in reverse order. */
735
c8094d83 736static tree
362efdc1 737build_field_list (tree t, tree list, int *uses_unions_p)
ff9f1a5d
MM
738{
739 tree fields;
740
741 /* Note whether or not T is a union. */
742 if (TREE_CODE (t) == UNION_TYPE)
743 *uses_unions_p = 1;
744
910ad8de 745 for (fields = TYPE_FIELDS (t); fields; fields = DECL_CHAIN (fields))
ff9f1a5d 746 {
535335bf
JM
747 tree fieldtype;
748
ff9f1a5d 749 /* Skip CONST_DECLs for enumeration constants and so forth. */
17bbb839 750 if (TREE_CODE (fields) != FIELD_DECL || DECL_ARTIFICIAL (fields))
ff9f1a5d 751 continue;
c8094d83 752
535335bf 753 fieldtype = TREE_TYPE (fields);
ff9f1a5d 754 /* Keep track of whether or not any fields are unions. */
535335bf 755 if (TREE_CODE (fieldtype) == UNION_TYPE)
ff9f1a5d
MM
756 *uses_unions_p = 1;
757
758 /* For an anonymous struct or union, we must recursively
759 consider the fields of the anonymous type. They can be
760 directly initialized from the constructor. */
535335bf 761 if (ANON_AGGR_TYPE_P (fieldtype))
ff9f1a5d
MM
762 {
763 /* Add this field itself. Synthesized copy constructors
764 initialize the entire aggregate. */
765 list = tree_cons (fields, NULL_TREE, list);
766 /* And now add the fields in the anonymous aggregate. */
535335bf 767 list = build_field_list (fieldtype, list, uses_unions_p);
ff9f1a5d
MM
768 }
769 /* Add this field. */
770 else if (DECL_NAME (fields))
771 list = tree_cons (fields, NULL_TREE, list);
772 }
773
774 return list;
775}
776
2282d28d
MM
777/* The MEM_INITS are a TREE_LIST. The TREE_PURPOSE of each list gives
778 a FIELD_DECL or BINFO in T that needs initialization. The
779 TREE_VALUE gives the initializer, or list of initializer arguments.
780
781 Return a TREE_LIST containing all of the initializations required
782 for T, in the order in which they should be performed. The output
783 list has the same format as the input. */
e92cc029 784
8d08fdba 785static tree
2282d28d 786sort_mem_initializers (tree t, tree mem_inits)
8d08fdba 787{
ff9f1a5d 788 tree init;
fa743e8c 789 tree base, binfo, base_binfo;
2282d28d
MM
790 tree sorted_inits;
791 tree next_subobject;
d4e6fecb 792 VEC(tree,gc) *vbases;
2282d28d 793 int i;
adc651f3 794 int uses_unions_p = 0;
ff9f1a5d 795
2282d28d
MM
796 /* Build up a list of initializations. The TREE_PURPOSE of entry
797 will be the subobject (a FIELD_DECL or BINFO) to initialize. The
798 TREE_VALUE will be the constructor arguments, or NULL if no
799 explicit initialization was provided. */
800 sorted_inits = NULL_TREE;
c8094d83 801
2282d28d 802 /* Process the virtual bases. */
9ba5ff0f
NS
803 for (vbases = CLASSTYPE_VBASECLASSES (t), i = 0;
804 VEC_iterate (tree, vbases, i, base); i++)
58c42dc2 805 sorted_inits = tree_cons (base, NULL_TREE, sorted_inits);
c8094d83 806
2282d28d 807 /* Process the direct bases. */
fa743e8c
NS
808 for (binfo = TYPE_BINFO (t), i = 0;
809 BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i)
810 if (!BINFO_VIRTUAL_P (base_binfo))
811 sorted_inits = tree_cons (base_binfo, NULL_TREE, sorted_inits);
812
2282d28d
MM
813 /* Process the non-static data members. */
814 sorted_inits = build_field_list (t, sorted_inits, &uses_unions_p);
815 /* Reverse the entire list of initializations, so that they are in
816 the order that they will actually be performed. */
817 sorted_inits = nreverse (sorted_inits);
818
819 /* If the user presented the initializers in an order different from
820 that in which they will actually occur, we issue a warning. Keep
821 track of the next subobject which can be explicitly initialized
822 without issuing a warning. */
823 next_subobject = sorted_inits;
824
825 /* Go through the explicit initializers, filling in TREE_PURPOSE in
826 the SORTED_INITS. */
827 for (init = mem_inits; init; init = TREE_CHAIN (init))
828 {
829 tree subobject;
830 tree subobject_init;
831
832 subobject = TREE_PURPOSE (init);
833
834 /* If the explicit initializers are in sorted order, then
c8094d83 835 SUBOBJECT will be NEXT_SUBOBJECT, or something following
2282d28d 836 it. */
c8094d83
MS
837 for (subobject_init = next_subobject;
838 subobject_init;
2282d28d
MM
839 subobject_init = TREE_CHAIN (subobject_init))
840 if (TREE_PURPOSE (subobject_init) == subobject)
ff9f1a5d
MM
841 break;
842
2282d28d 843 /* Issue a warning if the explicit initializer order does not
2cfe82fe 844 match that which will actually occur.
0cbd7506 845 ??? Are all these on the correct lines? */
2282d28d 846 if (warn_reorder && !subobject_init)
ff9f1a5d 847 {
2282d28d 848 if (TREE_CODE (TREE_PURPOSE (next_subobject)) == FIELD_DECL)
b323323f 849 warning (OPT_Wreorder, "%q+D will be initialized after",
dee15844 850 TREE_PURPOSE (next_subobject));
2282d28d 851 else
b323323f 852 warning (OPT_Wreorder, "base %qT will be initialized after",
2282d28d
MM
853 TREE_PURPOSE (next_subobject));
854 if (TREE_CODE (subobject) == FIELD_DECL)
b323323f 855 warning (OPT_Wreorder, " %q+#D", subobject);
2282d28d 856 else
b323323f 857 warning (OPT_Wreorder, " base %qT", subobject);
c5d75364
MLI
858 warning_at (DECL_SOURCE_LOCATION (current_function_decl),
859 OPT_Wreorder, " when initialized here");
ff9f1a5d 860 }
b7484fbe 861
2282d28d
MM
862 /* Look again, from the beginning of the list. */
863 if (!subobject_init)
ff9f1a5d 864 {
2282d28d
MM
865 subobject_init = sorted_inits;
866 while (TREE_PURPOSE (subobject_init) != subobject)
867 subobject_init = TREE_CHAIN (subobject_init);
ff9f1a5d 868 }
c8094d83 869
2282d28d
MM
870 /* It is invalid to initialize the same subobject more than
871 once. */
872 if (TREE_VALUE (subobject_init))
ff9f1a5d 873 {
2282d28d 874 if (TREE_CODE (subobject) == FIELD_DECL)
c5d75364
MLI
875 error_at (DECL_SOURCE_LOCATION (current_function_decl),
876 "multiple initializations given for %qD",
877 subobject);
2282d28d 878 else
c5d75364
MLI
879 error_at (DECL_SOURCE_LOCATION (current_function_decl),
880 "multiple initializations given for base %qT",
881 subobject);
ff9f1a5d
MM
882 }
883
2282d28d
MM
884 /* Record the initialization. */
885 TREE_VALUE (subobject_init) = TREE_VALUE (init);
886 next_subobject = subobject_init;
ff9f1a5d
MM
887 }
888
889 /* [class.base.init]
b7484fbe 890
ff9f1a5d
MM
891 If a ctor-initializer specifies more than one mem-initializer for
892 multiple members of the same union (including members of
57ece258
JM
893 anonymous unions), the ctor-initializer is ill-formed.
894
895 Here we also splice out uninitialized union members. */
ff9f1a5d
MM
896 if (uses_unions_p)
897 {
2282d28d 898 tree last_field = NULL_TREE;
57ece258
JM
899 tree *p;
900 for (p = &sorted_inits; *p; )
8d08fdba 901 {
ff9f1a5d 902 tree field;
535335bf 903 tree ctx;
ff9f1a5d
MM
904 int done;
905
57ece258
JM
906 init = *p;
907
908 field = TREE_PURPOSE (init);
909
910 /* Skip base classes. */
911 if (TREE_CODE (field) != FIELD_DECL)
912 goto next;
913
914 /* If this is an anonymous union with no explicit initializer,
915 splice it out. */
916 if (!TREE_VALUE (init) && ANON_UNION_TYPE_P (TREE_TYPE (field)))
917 goto splice;
918
ff9f1a5d
MM
919 /* See if this field is a member of a union, or a member of a
920 structure contained in a union, etc. */
535335bf
JM
921 for (ctx = DECL_CONTEXT (field);
922 !same_type_p (ctx, t);
923 ctx = TYPE_CONTEXT (ctx))
924 if (TREE_CODE (ctx) == UNION_TYPE)
ff9f1a5d
MM
925 break;
926 /* If this field is not a member of a union, skip it. */
535335bf 927 if (TREE_CODE (ctx) != UNION_TYPE)
57ece258
JM
928 goto next;
929
930 /* If this union member has no explicit initializer, splice
931 it out. */
932 if (!TREE_VALUE (init))
933 goto splice;
8d08fdba 934
ff9f1a5d
MM
935 /* It's only an error if we have two initializers for the same
936 union type. */
937 if (!last_field)
6bdb8141 938 {
ff9f1a5d 939 last_field = field;
57ece258 940 goto next;
6bdb8141 941 }
8d08fdba 942
ff9f1a5d
MM
943 /* See if LAST_FIELD and the field initialized by INIT are
944 members of the same union. If so, there's a problem,
945 unless they're actually members of the same structure
946 which is itself a member of a union. For example, given:
8d08fdba 947
ff9f1a5d
MM
948 union { struct { int i; int j; }; };
949
950 initializing both `i' and `j' makes sense. */
535335bf 951 ctx = DECL_CONTEXT (field);
ff9f1a5d
MM
952 done = 0;
953 do
8d08fdba 954 {
535335bf 955 tree last_ctx;
ff9f1a5d 956
535335bf 957 last_ctx = DECL_CONTEXT (last_field);
ff9f1a5d 958 while (1)
00595019 959 {
535335bf 960 if (same_type_p (last_ctx, ctx))
00595019 961 {
535335bf 962 if (TREE_CODE (ctx) == UNION_TYPE)
c5d75364
MLI
963 error_at (DECL_SOURCE_LOCATION (current_function_decl),
964 "initializations for multiple members of %qT",
535335bf 965 last_ctx);
ff9f1a5d
MM
966 done = 1;
967 break;
00595019 968 }
8d08fdba 969
535335bf 970 if (same_type_p (last_ctx, t))
ff9f1a5d 971 break;
8d08fdba 972
535335bf 973 last_ctx = TYPE_CONTEXT (last_ctx);
ff9f1a5d 974 }
c8094d83 975
ff9f1a5d
MM
976 /* If we've reached the outermost class, then we're
977 done. */
535335bf 978 if (same_type_p (ctx, t))
ff9f1a5d 979 break;
8d08fdba 980
535335bf 981 ctx = TYPE_CONTEXT (ctx);
8d08fdba 982 }
ff9f1a5d
MM
983 while (!done);
984
985 last_field = field;
57ece258
JM
986
987 next:
988 p = &TREE_CHAIN (*p);
989 continue;
990 splice:
991 *p = TREE_CHAIN (*p);
992 continue;
b7484fbe
MS
993 }
994 }
8d08fdba 995
2282d28d 996 return sorted_inits;
b7484fbe
MS
997}
998
2282d28d
MM
999/* Initialize all bases and members of CURRENT_CLASS_TYPE. MEM_INITS
1000 is a TREE_LIST giving the explicit mem-initializer-list for the
1001 constructor. The TREE_PURPOSE of each entry is a subobject (a
1002 FIELD_DECL or a BINFO) of the CURRENT_CLASS_TYPE. The TREE_VALUE
1003 is a TREE_LIST giving the arguments to the constructor or
1004 void_type_node for an empty list of arguments. */
a9aedbc2 1005
3dbc07b6 1006void
2282d28d 1007emit_mem_initializers (tree mem_inits)
8d08fdba 1008{
b8bf6ad9
JM
1009 int flags = LOOKUP_NORMAL;
1010
72e4661a
PC
1011 /* We will already have issued an error message about the fact that
1012 the type is incomplete. */
1013 if (!COMPLETE_TYPE_P (current_class_type))
1014 return;
c8094d83 1015
238e471c
VV
1016 if (mem_inits
1017 && TYPE_P (TREE_PURPOSE (mem_inits))
1018 && same_type_p (TREE_PURPOSE (mem_inits), current_class_type))
1019 {
1020 /* Delegating constructor. */
1021 gcc_assert (TREE_CHAIN (mem_inits) == NULL_TREE);
1022 perform_target_ctor (TREE_VALUE (mem_inits));
1023 return;
1024 }
1025
b8bf6ad9
JM
1026 if (DECL_DEFAULTED_FN (current_function_decl))
1027 flags |= LOOKUP_DEFAULTED;
1028
2282d28d
MM
1029 /* Sort the mem-initializers into the order in which the
1030 initializations should be performed. */
1031 mem_inits = sort_mem_initializers (current_class_type, mem_inits);
8d08fdba 1032
1f5a253a 1033 in_base_initializer = 1;
c8094d83 1034
2282d28d 1035 /* Initialize base classes. */
c8094d83 1036 while (mem_inits
2282d28d 1037 && TREE_CODE (TREE_PURPOSE (mem_inits)) != FIELD_DECL)
8d08fdba 1038 {
2282d28d
MM
1039 tree subobject = TREE_PURPOSE (mem_inits);
1040 tree arguments = TREE_VALUE (mem_inits);
1041
91ea6df3
GDR
1042 if (arguments == NULL_TREE)
1043 {
1044 /* If these initializations are taking place in a copy constructor,
1045 the base class should probably be explicitly initialized if there
1046 is a user-defined constructor in the base class (other than the
1047 default constructor, which will be called anyway). */
1048 if (extra_warnings
1049 && DECL_COPY_CONSTRUCTOR_P (current_function_decl)
1050 && type_has_user_nondefault_constructor (BINFO_TYPE (subobject)))
1051 warning_at (DECL_SOURCE_LOCATION (current_function_decl),
1052 OPT_Wextra, "base class %q#T should be explicitly "
1053 "initialized in the copy constructor",
1054 BINFO_TYPE (subobject));
91ea6df3 1055 }
2282d28d 1056
2282d28d 1057 /* Initialize the base. */
809e3e7f 1058 if (BINFO_VIRTUAL_P (subobject))
2282d28d
MM
1059 construct_virtual_base (subobject, arguments);
1060 else
b7484fbe 1061 {
2282d28d 1062 tree base_addr;
c8094d83 1063
2282d28d 1064 base_addr = build_base_path (PLUS_EXPR, current_class_ptr,
a271590a 1065 subobject, 1, tf_warning_or_error);
2282d28d 1066 expand_aggr_init_1 (subobject, NULL_TREE,
dd865ef6 1067 cp_build_indirect_ref (base_addr, RO_NULL,
5ade1ed2 1068 tf_warning_or_error),
2282d28d 1069 arguments,
b8bf6ad9 1070 flags,
5ade1ed2 1071 tf_warning_or_error);
2282d28d 1072 expand_cleanup_for_base (subobject, NULL_TREE);
8d08fdba 1073 }
8d08fdba 1074
2282d28d 1075 mem_inits = TREE_CHAIN (mem_inits);
8d08fdba 1076 }
1f5a253a 1077 in_base_initializer = 0;
8d08fdba 1078
2282d28d 1079 /* Initialize the vptrs. */
cf2e003b 1080 initialize_vtbl_ptrs (current_class_ptr);
c8094d83 1081
2282d28d
MM
1082 /* Initialize the data members. */
1083 while (mem_inits)
8d08fdba 1084 {
2282d28d
MM
1085 perform_member_init (TREE_PURPOSE (mem_inits),
1086 TREE_VALUE (mem_inits));
1087 mem_inits = TREE_CHAIN (mem_inits);
b7484fbe 1088 }
8d08fdba
MS
1089}
1090
3ec6bad3
MM
1091/* Returns the address of the vtable (i.e., the value that should be
1092 assigned to the vptr) for BINFO. */
1093
1094static tree
362efdc1 1095build_vtbl_address (tree binfo)
3ec6bad3 1096{
9965d119 1097 tree binfo_for = binfo;
3ec6bad3
MM
1098 tree vtbl;
1099
fc6633e0 1100 if (BINFO_VPTR_INDEX (binfo) && BINFO_VIRTUAL_P (binfo))
9965d119
NS
1101 /* If this is a virtual primary base, then the vtable we want to store
1102 is that for the base this is being used as the primary base of. We
1103 can't simply skip the initialization, because we may be expanding the
1104 inits of a subobject constructor where the virtual base layout
1105 can be different. */
fc6633e0
NS
1106 while (BINFO_PRIMARY_P (binfo_for))
1107 binfo_for = BINFO_INHERITANCE_CHAIN (binfo_for);
9965d119 1108
3ec6bad3
MM
1109 /* Figure out what vtable BINFO's vtable is based on, and mark it as
1110 used. */
9965d119 1111 vtbl = get_vtbl_decl_for_binfo (binfo_for);
3ec6bad3
MM
1112 TREE_USED (vtbl) = 1;
1113
1114 /* Now compute the address to use when initializing the vptr. */
6de9cd9a 1115 vtbl = unshare_expr (BINFO_VTABLE (binfo_for));
3ec6bad3 1116 if (TREE_CODE (vtbl) == VAR_DECL)
6de9cd9a 1117 vtbl = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (vtbl)), vtbl);
3ec6bad3
MM
1118
1119 return vtbl;
1120}
1121
8d08fdba
MS
1122/* This code sets up the virtual function tables appropriate for
1123 the pointer DECL. It is a one-ply initialization.
1124
1125 BINFO is the exact type that DECL is supposed to be. In
1126 multiple inheritance, this might mean "C's A" if C : A, B. */
e92cc029 1127
8926095f 1128static void
362efdc1 1129expand_virtual_init (tree binfo, tree decl)
8d08fdba 1130{
8d08fdba 1131 tree vtbl, vtbl_ptr;
3ec6bad3 1132 tree vtt_index;
8d08fdba 1133
3ec6bad3
MM
1134 /* Compute the initializer for vptr. */
1135 vtbl = build_vtbl_address (binfo);
1136
3461fba7
NS
1137 /* We may get this vptr from a VTT, if this is a subobject
1138 constructor or subobject destructor. */
3ec6bad3
MM
1139 vtt_index = BINFO_VPTR_INDEX (binfo);
1140 if (vtt_index)
1141 {
1142 tree vtbl2;
1143 tree vtt_parm;
1144
1145 /* Compute the value to use, when there's a VTT. */
e0fff4b3 1146 vtt_parm = current_vtt_parm;
5d49b6a7 1147 vtbl2 = fold_build_pointer_plus (vtt_parm, vtt_index);
dd865ef6 1148 vtbl2 = cp_build_indirect_ref (vtbl2, RO_NULL, tf_warning_or_error);
6de9cd9a 1149 vtbl2 = convert (TREE_TYPE (vtbl), vtbl2);
3ec6bad3
MM
1150
1151 /* The actual initializer is the VTT value only in the subobject
1152 constructor. In maybe_clone_body we'll substitute NULL for
1153 the vtt_parm in the case of the non-subobject constructor. */
c8094d83
MS
1154 vtbl = build3 (COND_EXPR,
1155 TREE_TYPE (vtbl),
f293ce4b
RS
1156 build2 (EQ_EXPR, boolean_type_node,
1157 current_in_charge_parm, integer_zero_node),
c8094d83 1158 vtbl2,
f293ce4b 1159 vtbl);
3ec6bad3 1160 }
70ae3201
MM
1161
1162 /* Compute the location of the vtpr. */
dd865ef6 1163 vtbl_ptr = build_vfield_ref (cp_build_indirect_ref (decl, RO_NULL,
5ade1ed2 1164 tf_warning_or_error),
338d90b8 1165 TREE_TYPE (binfo));
50bc768d 1166 gcc_assert (vtbl_ptr != error_mark_node);
8d08fdba 1167
70ae3201 1168 /* Assign the vtable to the vptr. */
6060a796 1169 vtbl = convert_force (TREE_TYPE (vtbl_ptr), vtbl, 0);
5ade1ed2
DG
1170 finish_expr_stmt (cp_build_modify_expr (vtbl_ptr, NOP_EXPR, vtbl,
1171 tf_warning_or_error));
8d08fdba
MS
1172}
1173
f33e32a8
MM
1174/* If an exception is thrown in a constructor, those base classes already
1175 constructed must be destroyed. This function creates the cleanup
0b8a1e58 1176 for BINFO, which has just been constructed. If FLAG is non-NULL,
838dfd8a 1177 it is a DECL which is nonzero when this base needs to be
0b8a1e58 1178 destroyed. */
f33e32a8
MM
1179
1180static void
362efdc1 1181expand_cleanup_for_base (tree binfo, tree flag)
f33e32a8
MM
1182{
1183 tree expr;
1184
834c6dff 1185 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (BINFO_TYPE (binfo)))
f33e32a8
MM
1186 return;
1187
0b8a1e58 1188 /* Call the destructor. */
c8094d83 1189 expr = build_special_member_call (current_class_ref,
4ba126e4 1190 base_dtor_identifier,
c166b898 1191 NULL,
4ba126e4 1192 binfo,
5ade1ed2
DG
1193 LOOKUP_NORMAL | LOOKUP_NONVIRTUAL,
1194 tf_warning_or_error);
0b8a1e58 1195 if (flag)
db3927fb
AH
1196 expr = fold_build3_loc (input_location,
1197 COND_EXPR, void_type_node,
ba47d38d 1198 c_common_truthvalue_conversion (input_location, flag),
7866705a 1199 expr, integer_zero_node);
0b8a1e58 1200
659e5a7a 1201 finish_eh_cleanup (expr);
f33e32a8
MM
1202}
1203
2282d28d
MM
1204/* Construct the virtual base-class VBASE passing the ARGUMENTS to its
1205 constructor. */
e92cc029 1206
8d08fdba 1207static void
2282d28d 1208construct_virtual_base (tree vbase, tree arguments)
8d08fdba 1209{
2282d28d 1210 tree inner_if_stmt;
2282d28d 1211 tree exp;
c8094d83 1212 tree flag;
2282d28d
MM
1213
1214 /* If there are virtual base classes with destructors, we need to
1215 emit cleanups to destroy them if an exception is thrown during
1216 the construction process. These exception regions (i.e., the
1217 period during which the cleanups must occur) begin from the time
1218 the construction is complete to the end of the function. If we
1219 create a conditional block in which to initialize the
1220 base-classes, then the cleanup region for the virtual base begins
1221 inside a block, and ends outside of that block. This situation
1222 confuses the sjlj exception-handling code. Therefore, we do not
1223 create a single conditional block, but one for each
1224 initialization. (That way the cleanup regions always begin
3b426391 1225 in the outer block.) We trust the back end to figure out
2282d28d
MM
1226 that the FLAG will not change across initializations, and
1227 avoid doing multiple tests. */
910ad8de 1228 flag = DECL_CHAIN (DECL_ARGUMENTS (current_function_decl));
2282d28d
MM
1229 inner_if_stmt = begin_if_stmt ();
1230 finish_if_stmt_cond (flag, inner_if_stmt);
2282d28d
MM
1231
1232 /* Compute the location of the virtual base. If we're
1233 constructing virtual bases, then we must be the most derived
1234 class. Therefore, we don't have to look up the virtual base;
1235 we already know where it is. */
22ed7e5f
MM
1236 exp = convert_to_base_statically (current_class_ref, vbase);
1237
c8094d83 1238 expand_aggr_init_1 (vbase, current_class_ref, exp, arguments,
5ade1ed2 1239 LOOKUP_COMPLAIN, tf_warning_or_error);
2282d28d 1240 finish_then_clause (inner_if_stmt);
325c3691 1241 finish_if_stmt (inner_if_stmt);
2282d28d
MM
1242
1243 expand_cleanup_for_base (vbase, flag);
8d08fdba
MS
1244}
1245
2ee887f2 1246/* Find the context in which this FIELD can be initialized. */
e92cc029 1247
2ee887f2 1248static tree
362efdc1 1249initializing_context (tree field)
2ee887f2
MS
1250{
1251 tree t = DECL_CONTEXT (field);
1252
1253 /* Anonymous union members can be initialized in the first enclosing
1254 non-anonymous union context. */
6bdb8141 1255 while (t && ANON_AGGR_TYPE_P (t))
2ee887f2
MS
1256 t = TYPE_CONTEXT (t);
1257 return t;
1258}
1259
8d08fdba
MS
1260/* Function to give error message if member initialization specification
1261 is erroneous. FIELD is the member we decided to initialize.
1262 TYPE is the type for which the initialization is being performed.
72b7eeff 1263 FIELD must be a member of TYPE.
c8094d83 1264
8d08fdba
MS
1265 MEMBER_NAME is the name of the member. */
1266
1267static int
362efdc1 1268member_init_ok_or_else (tree field, tree type, tree member_name)
8d08fdba
MS
1269{
1270 if (field == error_mark_node)
1271 return 0;
a723baf1 1272 if (!field)
8d08fdba 1273 {
15a7ee29 1274 error ("class %qT does not have any field named %qD", type,
a723baf1 1275 member_name);
8d08fdba
MS
1276 return 0;
1277 }
a723baf1 1278 if (TREE_CODE (field) == VAR_DECL)
b7484fbe 1279 {
15a7ee29 1280 error ("%q#D is a static data member; it can only be "
a723baf1
MM
1281 "initialized at its definition",
1282 field);
1283 return 0;
1284 }
1285 if (TREE_CODE (field) != FIELD_DECL)
1286 {
15a7ee29 1287 error ("%q#D is not a non-static data member of %qT",
a723baf1
MM
1288 field, type);
1289 return 0;
1290 }
1291 if (initializing_context (field) != type)
1292 {
15a7ee29 1293 error ("class %qT does not have any field named %qD", type,
a723baf1 1294 member_name);
b7484fbe
MS
1295 return 0;
1296 }
1297
8d08fdba
MS
1298 return 1;
1299}
1300
2282d28d
MM
1301/* NAME is a FIELD_DECL, an IDENTIFIER_NODE which names a field, or it
1302 is a _TYPE node or TYPE_DECL which names a base for that type.
1f5a253a
NS
1303 Check the validity of NAME, and return either the base _TYPE, base
1304 binfo, or the FIELD_DECL of the member. If NAME is invalid, return
2282d28d 1305 NULL_TREE and issue a diagnostic.
8d08fdba 1306
36a68fe7
NS
1307 An old style unnamed direct single base construction is permitted,
1308 where NAME is NULL. */
8d08fdba 1309
fd74ca0b 1310tree
1f5a253a 1311expand_member_init (tree name)
8d08fdba 1312{
2282d28d
MM
1313 tree basetype;
1314 tree field;
8d08fdba 1315
2282d28d 1316 if (!current_class_ref)
fd74ca0b 1317 return NULL_TREE;
8d08fdba 1318
36a68fe7 1319 if (!name)
90418208 1320 {
36a68fe7
NS
1321 /* This is an obsolete unnamed base class initializer. The
1322 parser will already have warned about its use. */
604a3205 1323 switch (BINFO_N_BASE_BINFOS (TYPE_BINFO (current_class_type)))
36a68fe7
NS
1324 {
1325 case 0:
15a7ee29 1326 error ("unnamed initializer for %qT, which has no base classes",
2282d28d 1327 current_class_type);
36a68fe7
NS
1328 return NULL_TREE;
1329 case 1:
604a3205
NS
1330 basetype = BINFO_TYPE
1331 (BINFO_BASE_BINFO (TYPE_BINFO (current_class_type), 0));
36a68fe7
NS
1332 break;
1333 default:
15a7ee29 1334 error ("unnamed initializer for %qT, which uses multiple inheritance",
2282d28d 1335 current_class_type);
36a68fe7
NS
1336 return NULL_TREE;
1337 }
90418208 1338 }
36a68fe7 1339 else if (TYPE_P (name))
be99da77 1340 {
a82d6da5 1341 basetype = TYPE_MAIN_VARIANT (name);
36a68fe7 1342 name = TYPE_NAME (name);
be99da77 1343 }
36a68fe7
NS
1344 else if (TREE_CODE (name) == TYPE_DECL)
1345 basetype = TYPE_MAIN_VARIANT (TREE_TYPE (name));
2282d28d
MM
1346 else
1347 basetype = NULL_TREE;
8d08fdba 1348
36a68fe7 1349 if (basetype)
41efda8f 1350 {
d9148cf4
MM
1351 tree class_binfo;
1352 tree direct_binfo;
1353 tree virtual_binfo;
1354 int i;
2282d28d 1355
238e471c
VV
1356 if (same_type_p (basetype, current_class_type)
1357 || current_template_parms)
1358 return basetype;
2282d28d 1359
d9148cf4
MM
1360 class_binfo = TYPE_BINFO (current_class_type);
1361 direct_binfo = NULL_TREE;
1362 virtual_binfo = NULL_TREE;
1363
1364 /* Look for a direct base. */
fa743e8c 1365 for (i = 0; BINFO_BASE_ITERATE (class_binfo, i, direct_binfo); ++i)
539ed333 1366 if (SAME_BINFO_TYPE_P (BINFO_TYPE (direct_binfo), basetype))
fa743e8c
NS
1367 break;
1368
d9148cf4
MM
1369 /* Look for a virtual base -- unless the direct base is itself
1370 virtual. */
809e3e7f 1371 if (!direct_binfo || !BINFO_VIRTUAL_P (direct_binfo))
58c42dc2 1372 virtual_binfo = binfo_for_vbase (basetype, current_class_type);
d9148cf4
MM
1373
1374 /* [class.base.init]
c8094d83 1375
0cbd7506 1376 If a mem-initializer-id is ambiguous because it designates
d9148cf4
MM
1377 both a direct non-virtual base class and an inherited virtual
1378 base class, the mem-initializer is ill-formed. */
1379 if (direct_binfo && virtual_binfo)
1380 {
15a7ee29 1381 error ("%qD is both a direct base and an indirect virtual base",
d9148cf4
MM
1382 basetype);
1383 return NULL_TREE;
1384 }
1385
1386 if (!direct_binfo && !virtual_binfo)
8d08fdba 1387 {
5775a06a 1388 if (CLASSTYPE_VBASECLASSES (current_class_type))
c3115fd2
MM
1389 error ("type %qT is not a direct or virtual base of %qT",
1390 basetype, current_class_type);
41efda8f 1391 else
c3115fd2
MM
1392 error ("type %qT is not a direct base of %qT",
1393 basetype, current_class_type);
fd74ca0b 1394 return NULL_TREE;
41efda8f 1395 }
d9148cf4
MM
1396
1397 return direct_binfo ? direct_binfo : virtual_binfo;
41efda8f
MM
1398 }
1399 else
1400 {
2282d28d 1401 if (TREE_CODE (name) == IDENTIFIER_NODE)
86ac0575 1402 field = lookup_field (current_class_type, name, 1, false);
2282d28d
MM
1403 else
1404 field = name;
8d08fdba 1405
2282d28d 1406 if (member_init_ok_or_else (field, current_class_type, name))
1f5a253a 1407 return field;
41efda8f 1408 }
fd74ca0b 1409
2282d28d 1410 return NULL_TREE;
8d08fdba
MS
1411}
1412
1413/* This is like `expand_member_init', only it stores one aggregate
1414 value into another.
1415
1416 INIT comes in two flavors: it is either a value which
1417 is to be stored in EXP, or it is a parameter list
1418 to go to a constructor, which will operate on EXP.
f30432d7
MS
1419 If INIT is not a parameter list for a constructor, then set
1420 LOOKUP_ONLYCONVERTING.
6060a796
MS
1421 If FLAGS is LOOKUP_ONLYCONVERTING then it is the = init form of
1422 the initializer, if FLAGS is 0, then it is the (init) form.
8d08fdba 1423 If `init' is a CONSTRUCTOR, then we emit a warning message,
59be0cdd 1424 explaining that such initializations are invalid.
8d08fdba 1425
8d08fdba
MS
1426 If INIT resolves to a CALL_EXPR which happens to return
1427 something of the type we are looking for, then we know
1428 that we can safely use that call to perform the
1429 initialization.
1430
1431 The virtual function table pointer cannot be set up here, because
1432 we do not really know its type.
1433
8d08fdba
MS
1434 This never calls operator=().
1435
1436 When initializing, nothing is CONST.
1437
1438 A default copy constructor may have to be used to perform the
1439 initialization.
1440
1441 A constructor or a conversion operator may have to be used to
e92cc029 1442 perform the initialization, but not both, as it would be ambiguous. */
8d08fdba 1443
f1dedc31 1444tree
5ade1ed2 1445build_aggr_init (tree exp, tree init, int flags, tsubst_flags_t complain)
8d08fdba 1446{
f1dedc31
MM
1447 tree stmt_expr;
1448 tree compound_stmt;
1449 int destroy_temps;
8d08fdba
MS
1450 tree type = TREE_TYPE (exp);
1451 int was_const = TREE_READONLY (exp);
f30432d7 1452 int was_volatile = TREE_THIS_VOLATILE (exp);
2a3398e1 1453 int is_global;
8d08fdba
MS
1454
1455 if (init == error_mark_node)
f1dedc31 1456 return error_mark_node;
8d08fdba
MS
1457
1458 TREE_READONLY (exp) = 0;
f30432d7
MS
1459 TREE_THIS_VOLATILE (exp) = 0;
1460
611d6f76 1461 if (init && TREE_CODE (init) != TREE_LIST
e08cc018
JM
1462 && !(TREE_CODE (init) == TARGET_EXPR
1463 && TARGET_EXPR_DIRECT_INIT_P (init))
611d6f76
JM
1464 && !(BRACE_ENCLOSED_INITIALIZER_P (init)
1465 && CONSTRUCTOR_IS_DIRECT_INIT (init)))
f30432d7 1466 flags |= LOOKUP_ONLYCONVERTING;
8d08fdba
MS
1467
1468 if (TREE_CODE (type) == ARRAY_TYPE)
1469 {
671cb993
MM
1470 tree itype;
1471
92a62aad
MM
1472 /* An array may not be initialized use the parenthesized
1473 initialization form -- unless the initializer is "()". */
1474 if (init && TREE_CODE (init) == TREE_LIST)
8d08fdba 1475 {
5ade1ed2
DG
1476 if (complain & tf_error)
1477 error ("bad array initializer");
f1dedc31 1478 return error_mark_node;
8d08fdba 1479 }
92a62aad
MM
1480 /* Must arrange to initialize each element of EXP
1481 from elements of INIT. */
671cb993 1482 itype = init ? TREE_TYPE (init) : NULL_TREE;
36c37128
JM
1483 if (cv_qualified_p (type))
1484 TREE_TYPE (exp) = cv_unqualified (type);
1485 if (itype && cv_qualified_p (itype))
1486 TREE_TYPE (init) = cv_unqualified (itype);
a48cccea 1487 stmt_expr = build_vec_init (exp, NULL_TREE, init,
844ae01d 1488 /*explicit_value_init_p=*/false,
36c37128 1489 itype && same_type_p (TREE_TYPE (init),
5ade1ed2
DG
1490 TREE_TYPE (exp)),
1491 complain);
8d08fdba 1492 TREE_READONLY (exp) = was_const;
f30432d7 1493 TREE_THIS_VOLATILE (exp) = was_volatile;
8d08fdba 1494 TREE_TYPE (exp) = type;
f376e137
MS
1495 if (init)
1496 TREE_TYPE (init) = itype;
f1dedc31 1497 return stmt_expr;
8d08fdba
MS
1498 }
1499
1500 if (TREE_CODE (exp) == VAR_DECL || TREE_CODE (exp) == PARM_DECL)
f4f206f4 1501 /* Just know that we've seen something for this node. */
8d08fdba
MS
1502 TREE_USED (exp) = 1;
1503
2a3398e1 1504 is_global = begin_init_stmts (&stmt_expr, &compound_stmt);
f2c5f623 1505 destroy_temps = stmts_are_full_exprs_p ();
ae499cce 1506 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
8d08fdba 1507 expand_aggr_init_1 (TYPE_BINFO (type), exp, exp,
5ade1ed2 1508 init, LOOKUP_NORMAL|flags, complain);
2a3398e1 1509 stmt_expr = finish_init_stmts (is_global, stmt_expr, compound_stmt);
ae499cce 1510 current_stmt_tree ()->stmts_are_full_exprs_p = destroy_temps;
8d08fdba 1511 TREE_READONLY (exp) = was_const;
f30432d7 1512 TREE_THIS_VOLATILE (exp) = was_volatile;
f1dedc31
MM
1513
1514 return stmt_expr;
8d08fdba
MS
1515}
1516
1517static void
5ade1ed2
DG
1518expand_default_init (tree binfo, tree true_exp, tree exp, tree init, int flags,
1519 tsubst_flags_t complain)
8d08fdba 1520{
fc378698 1521 tree type = TREE_TYPE (exp);
9eb71d8c 1522 tree ctor_name;
fc378698 1523
8d08fdba
MS
1524 /* It fails because there may not be a constructor which takes
1525 its own type as the first (or only parameter), but which does
1526 take other types via a conversion. So, if the thing initializing
1527 the expression is a unit element of type X, first try X(X&),
1528 followed by initialization by X. If neither of these work
1529 out, then look hard. */
1530 tree rval;
c166b898 1531 VEC(tree,gc) *parms;
8d08fdba 1532
2061820e
JM
1533 /* If we have direct-initialization from an initializer list, pull
1534 it out of the TREE_LIST so the code below can see it. */
1535 if (init && TREE_CODE (init) == TREE_LIST
1536 && BRACE_ENCLOSED_INITIALIZER_P (TREE_VALUE (init))
1537 && CONSTRUCTOR_IS_DIRECT_INIT (TREE_VALUE (init)))
1538 {
1539 gcc_checking_assert ((flags & LOOKUP_ONLYCONVERTING) == 0
1540 && TREE_CHAIN (init) == NULL_TREE);
1541 init = TREE_VALUE (init);
1542 }
1543
4c9b3895
JM
1544 if (init && BRACE_ENCLOSED_INITIALIZER_P (init)
1545 && CP_AGGREGATE_TYPE_P (type))
e08cc018
JM
1546 /* A brace-enclosed initializer for an aggregate. In C++0x this can
1547 happen for direct-initialization, too. */
1548 init = digest_init (type, init, complain);
1549
1550 /* A CONSTRUCTOR of the target's type is a previously digested
1551 initializer, whether that happened just above or in
1552 cp_parser_late_parsing_nsdmi.
1553
1554 A TARGET_EXPR with TARGET_EXPR_DIRECT_INIT_P or TARGET_EXPR_LIST_INIT_P
1555 set represents the whole initialization, so we shouldn't build up
1556 another ctor call. */
1557 if (init
1558 && (TREE_CODE (init) == CONSTRUCTOR
1559 || (TREE_CODE (init) == TARGET_EXPR
1560 && (TARGET_EXPR_DIRECT_INIT_P (init)
1561 || TARGET_EXPR_LIST_INIT_P (init))))
1562 && same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (init), type))
4c9b3895 1563 {
e08cc018
JM
1564 /* Early initialization via a TARGET_EXPR only works for
1565 complete objects. */
1566 gcc_assert (TREE_CODE (init) == CONSTRUCTOR || true_exp == exp);
1567
4c9b3895
JM
1568 init = build2 (INIT_EXPR, TREE_TYPE (exp), exp, init);
1569 TREE_SIDE_EFFECTS (init) = 1;
1570 finish_expr_stmt (init);
1571 return;
1572 }
1573
277294d7 1574 if (init && TREE_CODE (init) != TREE_LIST
faf5394a
MS
1575 && (flags & LOOKUP_ONLYCONVERTING))
1576 {
1577 /* Base subobjects should only get direct-initialization. */
8dc2b103 1578 gcc_assert (true_exp == exp);
faf5394a 1579
c37dc68e
JM
1580 if (flags & DIRECT_BIND)
1581 /* Do nothing. We hit this in two cases: Reference initialization,
1582 where we aren't initializing a real variable, so we don't want
1583 to run a new constructor; and catching an exception, where we
1584 have already built up the constructor call so we could wrap it
1585 in an exception region. */;
1586 else
37c46b43 1587 init = ocp_convert (type, init, CONV_IMPLICIT|CONV_FORCE_TEMP, flags);
faf5394a 1588
4e8dca1c
JM
1589 if (TREE_CODE (init) == MUST_NOT_THROW_EXPR)
1590 /* We need to protect the initialization of a catch parm with a
1591 call to terminate(), which shows up as a MUST_NOT_THROW_EXPR
c7ae64f2 1592 around the TARGET_EXPR for the copy constructor. See
4e8dca1c
JM
1593 initialize_handler_parm. */
1594 {
f293ce4b
RS
1595 TREE_OPERAND (init, 0) = build2 (INIT_EXPR, TREE_TYPE (exp), exp,
1596 TREE_OPERAND (init, 0));
4e8dca1c
JM
1597 TREE_TYPE (init) = void_type_node;
1598 }
c7ae64f2 1599 else
f293ce4b 1600 init = build2 (INIT_EXPR, TREE_TYPE (exp), exp, init);
c7ae64f2 1601 TREE_SIDE_EFFECTS (init) = 1;
f1dedc31 1602 finish_expr_stmt (init);
faf5394a
MS
1603 return;
1604 }
1605
c166b898
ILT
1606 if (init == NULL_TREE)
1607 parms = NULL;
1608 else if (TREE_CODE (init) == TREE_LIST && !TREE_TYPE (init))
8d08fdba 1609 {
c166b898
ILT
1610 parms = make_tree_vector ();
1611 for (; init != NULL_TREE; init = TREE_CHAIN (init))
1612 VEC_safe_push (tree, gc, parms, TREE_VALUE (init));
8d08fdba 1613 }
8d08fdba 1614 else
c166b898 1615 parms = make_tree_vector_single (init);
8d08fdba 1616
238e471c
VV
1617 if (exp == current_class_ref && current_function_decl
1618 && DECL_HAS_IN_CHARGE_PARM_P (current_function_decl))
1619 {
1620 /* Delegating constructor. */
1621 tree complete;
1622 tree base;
c4ce224c
JM
1623 tree elt; unsigned i;
1624
1625 /* Unshare the arguments for the second call. */
1626 VEC(tree,gc) *parms2 = make_tree_vector ();
1627 FOR_EACH_VEC_ELT (tree, parms, i, elt)
1628 {
1629 elt = break_out_target_exprs (elt);
1630 VEC_safe_push (tree, gc, parms2, elt);
1631 }
238e471c 1632 complete = build_special_member_call (exp, complete_ctor_identifier,
c4ce224c
JM
1633 &parms2, binfo, flags,
1634 complain);
1635 complete = fold_build_cleanup_point_expr (void_type_node, complete);
1636 release_tree_vector (parms2);
1637
238e471c
VV
1638 base = build_special_member_call (exp, base_ctor_identifier,
1639 &parms, binfo, flags,
1640 complain);
c4ce224c
JM
1641 base = fold_build_cleanup_point_expr (void_type_node, base);
1642 rval = build3 (COND_EXPR, void_type_node,
1643 build2 (EQ_EXPR, boolean_type_node,
1644 current_in_charge_parm, integer_zero_node),
1645 base,
1646 complete);
238e471c
VV
1647 }
1648 else
1649 {
1650 if (true_exp == exp)
1651 ctor_name = complete_ctor_identifier;
1652 else
1653 ctor_name = base_ctor_identifier;
1654 rval = build_special_member_call (exp, ctor_name, &parms, binfo, flags,
1655 complain);
1656 }
c166b898
ILT
1657
1658 if (parms != NULL)
1659 release_tree_vector (parms);
1660
fa2200cb
JM
1661 if (exp == true_exp && TREE_CODE (rval) == CALL_EXPR)
1662 {
1663 tree fn = get_callee_fndecl (rval);
a76c13bf 1664 if (fn && DECL_DECLARED_CONSTEXPR_P (fn))
fa2200cb 1665 {
07a9e891 1666 tree e = maybe_constant_init (rval);
fa2200cb
JM
1667 if (TREE_CONSTANT (e))
1668 rval = build2 (INIT_EXPR, type, exp, e);
1669 }
1670 }
1671
1672 /* FIXME put back convert_to_void? */
25eb19ff 1673 if (TREE_SIDE_EFFECTS (rval))
fa2200cb 1674 finish_expr_stmt (rval);
8d08fdba
MS
1675}
1676
1677/* This function is responsible for initializing EXP with INIT
1678 (if any).
1679
1680 BINFO is the binfo of the type for who we are performing the
1681 initialization. For example, if W is a virtual base class of A and B,
1682 and C : A, B.
1683 If we are initializing B, then W must contain B's W vtable, whereas
1684 were we initializing C, W must contain C's W vtable.
1685
1686 TRUE_EXP is nonzero if it is the true expression being initialized.
1687 In this case, it may be EXP, or may just contain EXP. The reason we
1688 need this is because if EXP is a base element of TRUE_EXP, we
1689 don't necessarily know by looking at EXP where its virtual
1690 baseclass fields should really be pointing. But we do know
1691 from TRUE_EXP. In constructors, we don't know anything about
1692 the value being initialized.
1693
9f880ef9
MM
1694 FLAGS is just passed to `build_new_method_call'. See that function
1695 for its description. */
8d08fdba
MS
1696
1697static void
5ade1ed2
DG
1698expand_aggr_init_1 (tree binfo, tree true_exp, tree exp, tree init, int flags,
1699 tsubst_flags_t complain)
8d08fdba
MS
1700{
1701 tree type = TREE_TYPE (exp);
8d08fdba 1702
50bc768d 1703 gcc_assert (init != error_mark_node && type != error_mark_node);
38e01f9e 1704 gcc_assert (building_stmt_list_p ());
8d08fdba
MS
1705
1706 /* Use a function returning the desired type to initialize EXP for us.
1707 If the function is a constructor, and its first argument is
1708 NULL_TREE, know that it was meant for us--just slide exp on
1709 in and expand the constructor. Constructors now come
1710 as TARGET_EXPRs. */
faf5394a
MS
1711
1712 if (init && TREE_CODE (exp) == VAR_DECL
3b2db49f 1713 && COMPOUND_LITERAL_P (init))
faf5394a 1714 {
b25dd954 1715 VEC(tree,gc)* cleanups = NULL;
f1dedc31 1716 /* If store_init_value returns NULL_TREE, the INIT has been
3b2db49f 1717 recorded as the DECL_INITIAL for EXP. That means there's
f1dedc31 1718 nothing more we have to do. */
b25dd954 1719 init = store_init_value (exp, init, &cleanups, flags);
25ebb82a
RH
1720 if (init)
1721 finish_expr_stmt (init);
b25dd954 1722 gcc_assert (!cleanups);
faf5394a
MS
1723 return;
1724 }
1725
fd97a96a
JM
1726 /* If an explicit -- but empty -- initializer list was present,
1727 that's value-initialization. */
1728 if (init == void_type_node)
1729 {
1fb0b801
JM
1730 /* If no user-provided ctor, we need to zero out the object. */
1731 if (!type_has_user_provided_constructor (type))
fd97a96a 1732 {
1fb0b801
JM
1733 tree field_size = NULL_TREE;
1734 if (exp != true_exp && CLASSTYPE_AS_BASE (type) != type)
1735 /* Don't clobber already initialized virtual bases. */
1736 field_size = TYPE_SIZE (CLASSTYPE_AS_BASE (type));
1737 init = build_zero_init_1 (type, NULL_TREE, /*static_storage_p=*/false,
1738 field_size);
fd97a96a
JM
1739 init = build2 (INIT_EXPR, type, exp, init);
1740 finish_expr_stmt (init);
fd97a96a 1741 }
1fb0b801 1742
fd97a96a 1743 /* If we don't need to mess with the constructor at all,
1fb0b801
JM
1744 then we're done. */
1745 if (! type_build_ctor_call (type))
1746 return;
1747
1748 /* Otherwise fall through and call the constructor. */
fd97a96a
JM
1749 init = NULL_TREE;
1750 }
1751
9e9ff709
MS
1752 /* We know that expand_default_init can handle everything we want
1753 at this point. */
5ade1ed2 1754 expand_default_init (binfo, true_exp, exp, init, flags, complain);
8d08fdba
MS
1755}
1756
9e1e64ec 1757/* Report an error if TYPE is not a user-defined, class type. If
be99da77 1758 OR_ELSE is nonzero, give an error message. */
e92cc029 1759
be99da77 1760int
9e1e64ec 1761is_class_type (tree type, int or_else)
be99da77
MS
1762{
1763 if (type == error_mark_node)
1764 return 0;
1765
9e1e64ec 1766 if (! CLASS_TYPE_P (type))
be99da77
MS
1767 {
1768 if (or_else)
9e1e64ec 1769 error ("%qT is not a class type", type);
be99da77
MS
1770 return 0;
1771 }
1772 return 1;
1773}
1774
8d08fdba 1775tree
362efdc1 1776get_type_value (tree name)
8d08fdba 1777{
8d08fdba
MS
1778 if (name == error_mark_node)
1779 return NULL_TREE;
1780
1781 if (IDENTIFIER_HAS_TYPE_VALUE (name))
1782 return IDENTIFIER_TYPE_VALUE (name);
8d08fdba
MS
1783 else
1784 return NULL_TREE;
1785}
051e6fd7 1786
a5ac359a
MM
1787/* Build a reference to a member of an aggregate. This is not a C++
1788 `&', but really something which can have its address taken, and
1789 then act as a pointer to member, for example TYPE :: FIELD can have
1790 its address taken by saying & TYPE :: FIELD. ADDRESS_P is true if
1791 this expression is the operand of "&".
8d08fdba
MS
1792
1793 @@ Prints out lousy diagnostics for operator <typename>
1794 @@ fields.
1795
51c184be 1796 @@ This function should be rewritten and placed in search.c. */
e92cc029 1797
8d08fdba 1798tree
d4f0f205 1799build_offset_ref (tree type, tree member, bool address_p)
8d08fdba 1800{
8d245821 1801 tree decl;
fc378698 1802 tree basebinfo = NULL_TREE;
8d08fdba 1803
5f311aec 1804 /* class templates can come in as TEMPLATE_DECLs here. */
d4f0f205
MM
1805 if (TREE_CODE (member) == TEMPLATE_DECL)
1806 return member;
93cdc044 1807
627bc938
JM
1808 if (dependent_scope_p (type) || type_dependent_expression_p (member))
1809 return build_qualified_name (NULL_TREE, type, member,
2d660b7f 1810 /*template_p=*/false);
5566b478 1811
d4f0f205 1812 gcc_assert (TYPE_P (type));
9e1e64ec 1813 if (! is_class_type (type, 1))
c833d2be
NS
1814 return error_mark_node;
1815
d4f0f205
MM
1816 gcc_assert (DECL_P (member) || BASELINK_P (member));
1817 /* Callers should call mark_used before this point. */
3146f36f 1818 gcc_assert (!DECL_P (member) || TREE_USED (member));
be99da77 1819
627bc938 1820 type = TYPE_MAIN_VARIANT (type);
01628e54 1821 if (!COMPLETE_OR_OPEN_TYPE_P (complete_type (type)))
8d08fdba 1822 {
d4f0f205 1823 error ("incomplete type %qT does not have member %qD", type, member);
a5ac359a
MM
1824 return error_mark_node;
1825 }
1826
d4f0f205 1827 /* Entities other than non-static members need no further
3db45ab5 1828 processing. */
a5ac359a 1829 if (TREE_CODE (member) == TYPE_DECL)
d4f0f205 1830 return member;
a5ac359a 1831 if (TREE_CODE (member) == VAR_DECL || TREE_CODE (member) == CONST_DECL)
d4f0f205 1832 return convert_from_reference (member);
a5ac359a
MM
1833
1834 if (TREE_CODE (member) == FIELD_DECL && DECL_C_BIT_FIELD (member))
1835 {
15a7ee29 1836 error ("invalid pointer to bit-field %qD", member);
a5ac359a
MM
1837 return error_mark_node;
1838 }
1839
d4f0f205
MM
1840 /* Set up BASEBINFO for member lookup. */
1841 decl = maybe_dummy_object (type, &basebinfo);
1842
aa52c1ff 1843 /* A lot of this logic is now handled in lookup_member. */
a5ac359a 1844 if (BASELINK_P (member))
8d08fdba 1845 {
8d08fdba 1846 /* Go from the TREE_BASELINK to the member function info. */
7304fcb4 1847 tree t = BASELINK_FUNCTIONS (member);
8d08fdba 1848
50ad9642 1849 if (TREE_CODE (t) != TEMPLATE_ID_EXPR && !really_overloaded_fn (t))
8d08fdba 1850 {
f4f206f4 1851 /* Get rid of a potential OVERLOAD around it. */
2c73f9f5
ML
1852 t = OVL_CURRENT (t);
1853
b54f5338
KL
1854 /* Unique functions are handled easily. */
1855
1856 /* For non-static member of base class, we need a special rule
1857 for access checking [class.protected]:
1858
1859 If the access is to form a pointer to member, the
1860 nested-name-specifier shall name the derived class
1861 (or any class derived from that class). */
1862 if (address_p && DECL_P (t)
1863 && DECL_NONSTATIC_MEMBER_P (t))
02022f3a 1864 perform_or_defer_access_check (TYPE_BINFO (type), t, t);
b54f5338 1865 else
02022f3a 1866 perform_or_defer_access_check (basebinfo, t, t);
b54f5338 1867
848b92e1
JM
1868 if (DECL_STATIC_FUNCTION_P (t))
1869 return t;
a5ac359a
MM
1870 member = t;
1871 }
1872 else
7304fcb4 1873 TREE_TYPE (member) = unknown_type_node;
8d08fdba 1874 }
b54f5338
KL
1875 else if (address_p && TREE_CODE (member) == FIELD_DECL)
1876 /* We need additional test besides the one in
1877 check_accessibility_of_qualified_id in case it is
1878 a pointer to non-static member. */
02022f3a 1879 perform_or_defer_access_check (TYPE_BINFO (type), member, member);
8d08fdba 1880
a5ac359a 1881 if (!address_p)
8d08fdba 1882 {
a5ac359a
MM
1883 /* If MEMBER is non-static, then the program has fallen afoul of
1884 [expr.prim]:
8d08fdba 1885
a5ac359a
MM
1886 An id-expression that denotes a nonstatic data member or
1887 nonstatic member function of a class can only be used:
8d08fdba 1888
a5ac359a
MM
1889 -- as part of a class member access (_expr.ref_) in which the
1890 object-expression refers to the member's class or a class
1891 derived from that class, or
b7484fbe 1892
a5ac359a
MM
1893 -- to form a pointer to member (_expr.unary.op_), or
1894
1895 -- in the body of a nonstatic member function of that class or
1896 of a class derived from that class (_class.mfct.nonstatic_), or
1897
1898 -- in a mem-initializer for a constructor for that class or for
1899 a class derived from that class (_class.base.init_). */
1900 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (member))
1901 {
39a13be5 1902 /* Build a representation of the qualified name suitable
e9525111
MM
1903 for use as the operand to "&" -- even though the "&" is
1904 not actually present. */
f293ce4b 1905 member = build2 (OFFSET_REF, TREE_TYPE (member), decl, member);
a5ac359a
MM
1906 /* In Microsoft mode, treat a non-static member function as if
1907 it were a pointer-to-member. */
1908 if (flag_ms_extensions)
1909 {
a5ac359a 1910 PTRMEM_OK_P (member) = 1;
93c0e0bb 1911 return cp_build_addr_expr (member, tf_warning_or_error);
a5ac359a 1912 }
c8094d83 1913 error ("invalid use of non-static member function %qD",
e9525111 1914 TREE_OPERAND (member, 1));
07471dfb 1915 return error_mark_node;
a5ac359a
MM
1916 }
1917 else if (TREE_CODE (member) == FIELD_DECL)
1918 {
15a7ee29 1919 error ("invalid use of non-static data member %qD", member);
a5ac359a
MM
1920 return error_mark_node;
1921 }
1922 return member;
1923 }
8d08fdba 1924
f293ce4b 1925 member = build2 (OFFSET_REF, TREE_TYPE (member), decl, member);
8d245821
MM
1926 PTRMEM_OK_P (member) = 1;
1927 return member;
8d08fdba
MS
1928}
1929
393e756d
MM
1930/* If DECL is a scalar enumeration constant or variable with a
1931 constant initializer, return the initializer (or, its initializers,
1932 recursively); otherwise, return DECL. If INTEGRAL_P, the
1933 initializer is only returned if DECL is an integral
90454da1
PC
1934 constant-expression. If RETURN_AGGREGATE_CST_OK_P, it is ok to
1935 return an aggregate constant. */
8d08fdba 1936
393e756d 1937static tree
90454da1 1938constant_value_1 (tree decl, bool integral_p, bool return_aggregate_cst_ok_p)
8d08fdba 1939{
f513e31f 1940 while (TREE_CODE (decl) == CONST_DECL
3db45ab5 1941 || (integral_p
fa2200cb 1942 ? decl_constant_var_p (decl)
393e756d
MM
1943 : (TREE_CODE (decl) == VAR_DECL
1944 && CP_TYPE_CONST_NON_VOLATILE_P (TREE_TYPE (decl)))))
b794e321
MM
1945 {
1946 tree init;
fa2200cb
JM
1947 /* If DECL is a static data member in a template
1948 specialization, we must instantiate it here. The
1949 initializer for the static data member is not processed
1950 until needed; we need it now. */
1951 mark_used (decl);
1952 mark_rvalue_use (decl);
1953 init = DECL_INITIAL (decl);
d174af6c 1954 if (init == error_mark_node)
88274c4d
JM
1955 {
1956 if (DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl))
1957 /* Treat the error as a constant to avoid cascading errors on
1958 excessively recursive template instantiation (c++/9335). */
1959 return init;
1960 else
1961 return decl;
1962 }
73ce7fcb
JJ
1963 /* Initializers in templates are generally expanded during
1964 instantiation, so before that for const int i(2)
1965 INIT is a TREE_LIST with the actual initializer as
1966 TREE_VALUE. */
1967 if (processing_template_decl
1968 && init
1969 && TREE_CODE (init) == TREE_LIST
1970 && TREE_CHAIN (init) == NULL_TREE)
1971 init = TREE_VALUE (init);
d174af6c 1972 if (!init
b794e321 1973 || !TREE_TYPE (init)
8152661b 1974 || !TREE_CONSTANT (init)
90454da1
PC
1975 || (!integral_p && !return_aggregate_cst_ok_p
1976 /* Unless RETURN_AGGREGATE_CST_OK_P is true, do not
1977 return an aggregate constant (of which string
1978 literals are a special case), as we do not want
1979 to make inadvertent copies of such entities, and
1980 we must be sure that their addresses are the
1981 same everywhere. */
8152661b
JM
1982 && (TREE_CODE (init) == CONSTRUCTOR
1983 || TREE_CODE (init) == STRING_CST)))
b794e321 1984 break;
57b37fe3 1985 decl = unshare_expr (init);
b794e321 1986 }
8a784e4a
NS
1987 return decl;
1988}
a1652802 1989
393e756d
MM
1990/* If DECL is a CONST_DECL, or a constant VAR_DECL initialized by
1991 constant of integral or enumeration type, then return that value.
1992 These are those variables permitted in constant expressions by
1993 [5.19/1]. */
a1652802 1994
8a784e4a 1995tree
393e756d 1996integral_constant_value (tree decl)
8a784e4a 1997{
90454da1
PC
1998 return constant_value_1 (decl, /*integral_p=*/true,
1999 /*return_aggregate_cst_ok_p=*/false);
393e756d 2000}
c8094d83 2001
393e756d 2002/* A more relaxed version of integral_constant_value, used by the
90454da1 2003 common C/C++ code. */
393e756d
MM
2004
2005tree
2006decl_constant_value (tree decl)
2007{
90454da1
PC
2008 return constant_value_1 (decl, /*integral_p=*/processing_template_decl,
2009 /*return_aggregate_cst_ok_p=*/true);
2010}
2011
2012/* A version of integral_constant_value used by the C++ front end for
2013 optimization purposes. */
2014
2015tree
2016decl_constant_value_safe (tree decl)
2017{
2018 return constant_value_1 (decl, /*integral_p=*/processing_template_decl,
2019 /*return_aggregate_cst_ok_p=*/false);
8d08fdba
MS
2020}
2021\f
8d08fdba
MS
2022/* Common subroutines of build_new and build_vec_delete. */
2023
c787dd82 2024/* Call the global __builtin_delete to delete ADDR. */
8d08fdba 2025
bd6dd845 2026static tree
362efdc1 2027build_builtin_delete_call (tree addr)
8d08fdba 2028{
a6ecf8b6 2029 mark_used (global_delete_fndecl);
94a0dd7b 2030 return build_call_n (global_delete_fndecl, 1, addr);
8d08fdba
MS
2031}
2032\f
63c9a190
MM
2033/* Build and return a NEW_EXPR. If NELTS is non-NULL, TYPE[NELTS] is
2034 the type of the object being allocated; otherwise, it's just TYPE.
2035 INIT is the initializer, if any. USE_GLOBAL_NEW is true if the
2036 user explicitly wrote "::operator new". PLACEMENT, if non-NULL, is
c166b898
ILT
2037 a vector of arguments to be provided as arguments to a placement
2038 new operator. This routine performs no semantic checks; it just
2039 creates and returns a NEW_EXPR. */
a0d5fba7 2040
63c9a190 2041static tree
c166b898
ILT
2042build_raw_new_expr (VEC(tree,gc) *placement, tree type, tree nelts,
2043 VEC(tree,gc) *init, int use_global_new)
743f140d 2044{
c166b898 2045 tree init_list;
63c9a190 2046 tree new_expr;
3db45ab5 2047
c166b898
ILT
2048 /* If INIT is NULL, the we want to store NULL_TREE in the NEW_EXPR.
2049 If INIT is not NULL, then we want to store VOID_ZERO_NODE. This
2050 permits us to distinguish the case of a missing initializer "new
2051 int" from an empty initializer "new int()". */
2052 if (init == NULL)
2053 init_list = NULL_TREE;
2054 else if (VEC_empty (tree, init))
2055 init_list = void_zero_node;
2056 else
2057 init_list = build_tree_list_vec (init);
2058
2059 new_expr = build4 (NEW_EXPR, build_pointer_type (type),
2060 build_tree_list_vec (placement), type, nelts,
2061 init_list);
63c9a190
MM
2062 NEW_EXPR_USE_GLOBAL (new_expr) = use_global_new;
2063 TREE_SIDE_EFFECTS (new_expr) = 1;
2064
2065 return new_expr;
743f140d
PB
2066}
2067
9d809e8f
FC
2068/* Diagnose uninitialized const members or reference members of type
2069 TYPE. USING_NEW is used to disambiguate the diagnostic between a
40bb78ad
FC
2070 new expression without a new-initializer and a declaration. Returns
2071 the error count. */
9d809e8f 2072
40bb78ad 2073static int
9d809e8f 2074diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin,
40bb78ad 2075 bool using_new, bool complain)
9d809e8f
FC
2076{
2077 tree field;
40bb78ad 2078 int error_count = 0;
9d809e8f 2079
10ab8f62 2080 if (type_has_user_provided_constructor (type))
40bb78ad 2081 return 0;
10ab8f62 2082
910ad8de 2083 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
9d809e8f
FC
2084 {
2085 tree field_type;
2086
2087 if (TREE_CODE (field) != FIELD_DECL)
2088 continue;
2089
2090 field_type = strip_array_types (TREE_TYPE (field));
2091
1c682d06
FC
2092 if (type_has_user_provided_constructor (field_type))
2093 continue;
2094
9d809e8f
FC
2095 if (TREE_CODE (field_type) == REFERENCE_TYPE)
2096 {
40bb78ad
FC
2097 ++ error_count;
2098 if (complain)
2099 {
2100 if (using_new)
2101 error ("uninitialized reference member in %q#T "
2102 "using %<new%> without new-initializer", origin);
2103 else
2104 error ("uninitialized reference member in %q#T", origin);
2105 inform (DECL_SOURCE_LOCATION (field),
2106 "%qD should be initialized", field);
2107 }
9d809e8f
FC
2108 }
2109
2110 if (CP_TYPE_CONST_P (field_type))
2111 {
40bb78ad
FC
2112 ++ error_count;
2113 if (complain)
2114 {
2115 if (using_new)
2116 error ("uninitialized const member in %q#T "
2117 "using %<new%> without new-initializer", origin);
2118 else
2119 error ("uninitialized const member in %q#T", origin);
2120 inform (DECL_SOURCE_LOCATION (field),
2121 "%qD should be initialized", field);
2122 }
9d809e8f
FC
2123 }
2124
2125 if (CLASS_TYPE_P (field_type))
40bb78ad
FC
2126 error_count
2127 += diagnose_uninitialized_cst_or_ref_member_1 (field_type, origin,
2128 using_new, complain);
9d809e8f 2129 }
40bb78ad 2130 return error_count;
9d809e8f
FC
2131}
2132
40bb78ad
FC
2133int
2134diagnose_uninitialized_cst_or_ref_member (tree type, bool using_new, bool complain)
9d809e8f 2135{
40bb78ad 2136 return diagnose_uninitialized_cst_or_ref_member_1 (type, type, using_new, complain);
9d809e8f
FC
2137}
2138
63c9a190
MM
2139/* Generate code for a new-expression, including calling the "operator
2140 new" function, initializing the object, and, if an exception occurs
2141 during construction, cleaning up. The arguments are as for
c166b898 2142 build_raw_new_expr. This may change PLACEMENT and INIT. */
a0d5fba7 2143
834c6dff 2144static tree
c166b898
ILT
2145build_new_1 (VEC(tree,gc) **placement, tree type, tree nelts,
2146 VEC(tree,gc) **init, bool globally_qualified_p,
2147 tsubst_flags_t complain)
a0d5fba7 2148{
d746e87d
MM
2149 tree size, rval;
2150 /* True iff this is a call to "operator new[]" instead of just
c8094d83 2151 "operator new". */
d746e87d 2152 bool array_p = false;
9207099b
JM
2153 /* If ARRAY_P is true, the element type of the array. This is never
2154 an ARRAY_TYPE; for something like "new int[3][4]", the
d746e87d 2155 ELT_TYPE is "int". If ARRAY_P is false, this is the same type as
9207099b 2156 TYPE. */
d746e87d 2157 tree elt_type;
f4f4610e
MM
2158 /* The type of the new-expression. (This type is always a pointer
2159 type.) */
2160 tree pointer_type;
25357d1e 2161 tree non_const_pointer_type;
a48cccea 2162 tree outer_nelts = NULL_TREE;
f4f4610e
MM
2163 tree alloc_call, alloc_expr;
2164 /* The address returned by the call to "operator new". This node is
2165 a VAR_DECL and is therefore reusable. */
2166 tree alloc_node;
46ff5047 2167 tree alloc_fn;
8b5e2ce4 2168 tree cookie_expr, init_expr;
089d6ea7 2169 int nothrow, check_new;
743f140d 2170 int use_java_new = 0;
834c6dff
MM
2171 /* If non-NULL, the number of extra bytes to allocate at the
2172 beginning of the storage allocated for an array-new expression in
2173 order to store the number of elements. */
2174 tree cookie_size = NULL_TREE;
c166b898 2175 tree placement_first;
a9de800a 2176 tree placement_expr = NULL_TREE;
3f41ffd8
MM
2177 /* True if the function we are calling is a placement allocation
2178 function. */
2179 bool placement_allocation_fn_p;
f4f4610e 2180 /* True if the storage must be initialized, either by a constructor
34cd5ae7 2181 or due to an explicit new-initializer. */
f4f4610e
MM
2182 bool is_initialized;
2183 /* The address of the thing allocated, not including any cookie. In
2184 particular, if an array cookie is in use, DATA_ADDR is the
2185 address of the first array element. This node is a VAR_DECL, and
2186 is therefore reusable. */
2187 tree data_addr;
6de9cd9a 2188 tree init_preeval_expr = NULL_TREE;
a0d5fba7 2189
058b15c1 2190 if (nelts)
a0d5fba7 2191 {
058b15c1 2192 outer_nelts = nelts;
d746e87d 2193 array_p = true;
a0d5fba7 2194 }
9207099b 2195 else if (TREE_CODE (type) == ARRAY_TYPE)
d746e87d 2196 {
9207099b
JM
2197 array_p = true;
2198 nelts = array_type_nelts_top (type);
2199 outer_nelts = nelts;
2200 type = TREE_TYPE (type);
d746e87d 2201 }
834c6dff 2202
8d08fdba
MS
2203 /* If our base type is an array, then make sure we know how many elements
2204 it has. */
d746e87d
MM
2205 for (elt_type = type;
2206 TREE_CODE (elt_type) == ARRAY_TYPE;
2207 elt_type = TREE_TYPE (elt_type))
ba47d38d
AH
2208 nelts = cp_build_binary_op (input_location,
2209 MULT_EXPR, nelts,
5ade1ed2
DG
2210 array_type_nelts_top (elt_type),
2211 complain);
5566b478 2212
d746e87d 2213 if (TREE_CODE (elt_type) == VOID_TYPE)
e1cd6e56 2214 {
5ade1ed2
DG
2215 if (complain & tf_error)
2216 error ("invalid type %<void%> for new");
e1cd6e56
MS
2217 return error_mark_node;
2218 }
2219
2b8497cd 2220 if (abstract_virtuals_error_sfinae (NULL_TREE, elt_type, complain))
a7a64a77 2221 return error_mark_node;
8926095f 2222
95552437 2223 is_initialized = (type_build_ctor_call (elt_type) || *init != NULL);
b87d79e6 2224
40bb78ad 2225 if (*init == NULL)
9d809e8f 2226 {
40bb78ad 2227 bool maybe_uninitialized_error = false;
9d809e8f
FC
2228 /* A program that calls for default-initialization [...] of an
2229 entity of reference type is ill-formed. */
2230 if (CLASSTYPE_REF_FIELDS_NEED_INIT (elt_type))
40bb78ad 2231 maybe_uninitialized_error = true;
9d809e8f
FC
2232
2233 /* A new-expression that creates an object of type T initializes
2234 that object as follows:
2235 - If the new-initializer is omitted:
2236 -- If T is a (possibly cv-qualified) non-POD class type
2237 (or array thereof), the object is default-initialized (8.5).
2238 [...]
2239 -- Otherwise, the object created has indeterminate
2240 value. If T is a const-qualified type, or a (possibly
2241 cv-qualified) POD class type (or array thereof)
2242 containing (directly or indirectly) a member of
2243 const-qualified type, the program is ill-formed; */
2244
2245 if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (elt_type))
40bb78ad 2246 maybe_uninitialized_error = true;
9d809e8f 2247
40bb78ad
FC
2248 if (maybe_uninitialized_error
2249 && diagnose_uninitialized_cst_or_ref_member (elt_type,
2250 /*using_new=*/true,
2251 complain & tf_error))
2252 return error_mark_node;
9d809e8f
FC
2253 }
2254
c166b898 2255 if (CP_TYPE_CONST_P (elt_type) && *init == NULL
6132bdd7 2256 && default_init_uninitialized_part (elt_type))
f4f4610e 2257 {
5ade1ed2
DG
2258 if (complain & tf_error)
2259 error ("uninitialized const in %<new%> of %q#T", elt_type);
f4f4610e
MM
2260 return error_mark_node;
2261 }
2262
d746e87d
MM
2263 size = size_in_bytes (elt_type);
2264 if (array_p)
9207099b 2265 size = size_binop (MULT_EXPR, size, convert (sizetype, nelts));
a28e3c7f 2266
63c9a190
MM
2267 alloc_fn = NULL_TREE;
2268
c166b898
ILT
2269 /* If PLACEMENT is a single simple pointer type not passed by
2270 reference, prepare to capture it in a temporary variable. Do
2271 this now, since PLACEMENT will change in the calls below. */
c166b898
ILT
2272 placement_first = NULL_TREE;
2273 if (VEC_length (tree, *placement) == 1
2274 && (TREE_CODE (TREE_TYPE (VEC_index (tree, *placement, 0)))
2275 == POINTER_TYPE))
2276 placement_first = VEC_index (tree, *placement, 0);
2277
e92cc029 2278 /* Allocate the object. */
c166b898 2279 if (VEC_empty (tree, *placement) && TYPE_FOR_JAVA (elt_type))
743f140d 2280 {
63c9a190 2281 tree class_addr;
d746e87d 2282 tree class_decl = build_java_class_ref (elt_type);
8b60264b 2283 static const char alloc_name[] = "_Jv_AllocObject";
6de9cd9a 2284
a3d536f1
VR
2285 if (class_decl == error_mark_node)
2286 return error_mark_node;
2287
743f140d 2288 use_java_new = 1;
c8094d83 2289 if (!get_global_value_if_present (get_identifier (alloc_name),
63c9a190 2290 &alloc_fn))
b1e5b86c 2291 {
5ade1ed2
DG
2292 if (complain & tf_error)
2293 error ("call to Java constructor with %qs undefined", alloc_name);
6961a592
GB
2294 return error_mark_node;
2295 }
63c9a190 2296 else if (really_overloaded_fn (alloc_fn))
b1e5b86c 2297 {
5ade1ed2
DG
2298 if (complain & tf_error)
2299 error ("%qD should never be overloaded", alloc_fn);
6961a592
GB
2300 return error_mark_node;
2301 }
63c9a190 2302 alloc_fn = OVL_CURRENT (alloc_fn);
743f140d 2303 class_addr = build1 (ADDR_EXPR, jclass_node, class_decl);
6998c7ed
NF
2304 alloc_call = cp_build_function_call_nary (alloc_fn, complain,
2305 class_addr, NULL_TREE);
743f140d 2306 }
9e1e64ec 2307 else if (TYPE_FOR_JAVA (elt_type) && MAYBE_CLASS_TYPE_P (elt_type))
360f866c
JJ
2308 {
2309 error ("Java class %q#T object allocated using placement new", elt_type);
2310 return error_mark_node;
2311 }
8d08fdba
MS
2312 else
2313 {
834c6dff 2314 tree fnname;
9f880ef9 2315 tree fns;
834c6dff 2316
d746e87d 2317 fnname = ansi_opname (array_p ? VEC_NEW_EXPR : NEW_EXPR);
834c6dff 2318
c8094d83 2319 if (!globally_qualified_p
d746e87d
MM
2320 && CLASS_TYPE_P (elt_type)
2321 && (array_p
2322 ? TYPE_HAS_ARRAY_NEW_OPERATOR (elt_type)
2323 : TYPE_HAS_NEW_OPERATOR (elt_type)))
089d6ea7
MM
2324 {
2325 /* Use a class-specific operator new. */
2326 /* If a cookie is required, add some extra space. */
d746e87d 2327 if (array_p && TYPE_VEC_NEW_USES_COOKIE (elt_type))
089d6ea7 2328 {
d746e87d 2329 cookie_size = targetm.cxx.get_cookie_size (elt_type);
089d6ea7
MM
2330 size = size_binop (PLUS_EXPR, size, cookie_size);
2331 }
2332 /* Create the argument list. */
c166b898 2333 VEC_safe_insert (tree, gc, *placement, 0, size);
9f880ef9 2334 /* Do name-lookup to find the appropriate operator. */
d746e87d 2335 fns = lookup_fnfields (elt_type, fnname, /*protect=*/2);
a85cb0d7
VR
2336 if (fns == NULL_TREE)
2337 {
5ade1ed2
DG
2338 if (complain & tf_error)
2339 error ("no suitable %qD found in class %qT", fnname, elt_type);
a85cb0d7
VR
2340 return error_mark_node;
2341 }
9f880ef9
MM
2342 if (TREE_CODE (fns) == TREE_LIST)
2343 {
5ade1ed2
DG
2344 if (complain & tf_error)
2345 {
2346 error ("request for member %qD is ambiguous", fnname);
2347 print_candidates (fns);
2348 }
9f880ef9
MM
2349 return error_mark_node;
2350 }
d746e87d 2351 alloc_call = build_new_method_call (build_dummy_object (elt_type),
c166b898 2352 fns, placement,
9f880ef9 2353 /*conversion_path=*/NULL_TREE,
63c9a190 2354 LOOKUP_NORMAL,
5ade1ed2
DG
2355 &alloc_fn,
2356 complain);
089d6ea7 2357 }
834c6dff 2358 else
089d6ea7
MM
2359 {
2360 /* Use a global operator new. */
125e6594 2361 /* See if a cookie might be required. */
d746e87d
MM
2362 if (array_p && TYPE_VEC_NEW_USES_COOKIE (elt_type))
2363 cookie_size = targetm.cxx.get_cookie_size (elt_type);
125e6594
MM
2364 else
2365 cookie_size = NULL_TREE;
2366
c8094d83 2367 alloc_call = build_operator_new_call (fnname, placement,
63c9a190
MM
2368 &size, &cookie_size,
2369 &alloc_fn);
089d6ea7 2370 }
8d08fdba
MS
2371 }
2372
96790071 2373 if (alloc_call == error_mark_node)
2bb5d995
JM
2374 return error_mark_node;
2375
63c9a190
MM
2376 gcc_assert (alloc_fn != NULL_TREE);
2377
c166b898
ILT
2378 /* If we found a simple case of PLACEMENT_EXPR above, then copy it
2379 into a temporary variable. */
a9de800a 2380 if (!processing_template_decl
c166b898 2381 && placement_first != NULL_TREE
a9de800a
JJ
2382 && TREE_CODE (alloc_call) == CALL_EXPR
2383 && call_expr_nargs (alloc_call) == 2
2384 && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (alloc_call, 0))) == INTEGER_TYPE
2385 && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (alloc_call, 1))) == POINTER_TYPE)
2386 {
2387 tree placement_arg = CALL_EXPR_ARG (alloc_call, 1);
2388
550a799d 2389 if (INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (TREE_TYPE (placement_arg)))
a9de800a
JJ
2390 || VOID_TYPE_P (TREE_TYPE (TREE_TYPE (placement_arg))))
2391 {
c166b898 2392 placement_expr = get_target_expr (placement_first);
a9de800a
JJ
2393 CALL_EXPR_ARG (alloc_call, 1)
2394 = convert (TREE_TYPE (placement_arg), placement_expr);
2395 }
2396 }
2397
a6111661
JM
2398 /* In the simple case, we can stop now. */
2399 pointer_type = build_pointer_type (type);
2400 if (!cookie_size && !is_initialized)
4d7a65ea 2401 return build_nop (pointer_type, alloc_call);
a6111661 2402
10ee5386
JM
2403 /* Store the result of the allocation call in a variable so that we can
2404 use it more than once. */
2405 alloc_expr = get_target_expr (alloc_call);
a6111661
JM
2406 alloc_node = TARGET_EXPR_SLOT (alloc_expr);
2407
2408 /* Strip any COMPOUND_EXPRs from ALLOC_CALL. */
c8094d83 2409 while (TREE_CODE (alloc_call) == COMPOUND_EXPR)
a6111661 2410 alloc_call = TREE_OPERAND (alloc_call, 1);
089d6ea7 2411
3f41ffd8
MM
2412 /* Now, check to see if this function is actually a placement
2413 allocation function. This can happen even when PLACEMENT is NULL
2414 because we might have something like:
2415
2416 struct S { void* operator new (size_t, int i = 0); };
2417
2418 A call to `new S' will get this allocation function, even though
2419 there is no explicit placement argument. If there is more than
2420 one argument, or there are variable arguments, then this is a
2421 placement allocation function. */
c8094d83
MS
2422 placement_allocation_fn_p
2423 = (type_num_arguments (TREE_TYPE (alloc_fn)) > 1
46ff5047 2424 || varargs_function_p (alloc_fn));
96790071 2425
a6111661
JM
2426 /* Preevaluate the placement args so that we don't reevaluate them for a
2427 placement delete. */
2428 if (placement_allocation_fn_p)
2429 {
6de9cd9a
DN
2430 tree inits;
2431 stabilize_call (alloc_call, &inits);
a6111661 2432 if (inits)
f293ce4b
RS
2433 alloc_expr = build2 (COMPOUND_EXPR, TREE_TYPE (alloc_expr), inits,
2434 alloc_expr);
a6111661
JM
2435 }
2436
047f64a3
JM
2437 /* unless an allocation function is declared with an empty excep-
2438 tion-specification (_except.spec_), throw(), it indicates failure to
2439 allocate storage by throwing a bad_alloc exception (clause _except_,
2440 _lib.bad.alloc_); it returns a non-null pointer otherwise If the allo-
2441 cation function is declared with an empty exception-specification,
2442 throw(), it returns null to indicate failure to allocate storage and a
2443 non-null pointer otherwise.
2444
2445 So check for a null exception spec on the op new we just called. */
2446
46ff5047 2447 nothrow = TYPE_NOTHROW_P (TREE_TYPE (alloc_fn));
743f140d 2448 check_new = (flag_check_new || nothrow) && ! use_java_new;
047f64a3 2449
089d6ea7 2450 if (cookie_size)
8d08fdba 2451 {
96790071 2452 tree cookie;
46e995e0 2453 tree cookie_ptr;
b5119fa1 2454 tree size_ptr_type;
f4f4610e
MM
2455
2456 /* Adjust so we're pointing to the start of the object. */
5d49b6a7 2457 data_addr = fold_build_pointer_plus (alloc_node, cookie_size);
96790071 2458
834c6dff 2459 /* Store the number of bytes allocated so that we can know how
3461fba7
NS
2460 many elements to destroy later. We use the last sizeof
2461 (size_t) bytes to store the number of elements. */
10ee5386 2462 cookie_ptr = size_binop (MINUS_EXPR, cookie_size, size_in_bytes (sizetype));
5d49b6a7
RG
2463 cookie_ptr = fold_build_pointer_plus_loc (input_location,
2464 alloc_node, cookie_ptr);
b5119fa1 2465 size_ptr_type = build_pointer_type (sizetype);
10ee5386 2466 cookie_ptr = fold_convert (size_ptr_type, cookie_ptr);
dd865ef6 2467 cookie = cp_build_indirect_ref (cookie_ptr, RO_NULL, complain);
1f84ec23 2468
f293ce4b 2469 cookie_expr = build2 (MODIFY_EXPR, sizetype, cookie, nelts);
46e995e0
PB
2470
2471 if (targetm.cxx.cookie_has_size ())
2472 {
2473 /* Also store the element size. */
5d49b6a7 2474 cookie_ptr = fold_build_pointer_plus (cookie_ptr,
db3927fb 2475 fold_build1_loc (input_location,
5d49b6a7
RG
2476 NEGATE_EXPR, sizetype,
2477 size_in_bytes (sizetype)));
b2ec1738 2478
dd865ef6 2479 cookie = cp_build_indirect_ref (cookie_ptr, RO_NULL, complain);
f293ce4b 2480 cookie = build2 (MODIFY_EXPR, sizetype, cookie,
10ee5386 2481 size_in_bytes (elt_type));
f293ce4b
RS
2482 cookie_expr = build2 (COMPOUND_EXPR, TREE_TYPE (cookie_expr),
2483 cookie, cookie_expr);
46e995e0 2484 }
8d08fdba 2485 }
96790071 2486 else
8b5e2ce4
JM
2487 {
2488 cookie_expr = NULL_TREE;
2489 data_addr = alloc_node;
2490 }
8d08fdba 2491
10ee5386 2492 /* Now use a pointer to the type we've actually allocated. */
25357d1e
JM
2493
2494 /* But we want to operate on a non-const version to start with,
2495 since we'll be modifying the elements. */
2496 non_const_pointer_type = build_pointer_type
a3360e77 2497 (cp_build_qualified_type (type, cp_type_quals (type) & ~TYPE_QUAL_CONST));
25357d1e
JM
2498
2499 data_addr = fold_convert (non_const_pointer_type, data_addr);
9207099b 2500 /* Any further uses of alloc_node will want this type, too. */
25357d1e 2501 alloc_node = fold_convert (non_const_pointer_type, alloc_node);
10ee5386 2502
6de9cd9a
DN
2503 /* Now initialize the allocated object. Note that we preevaluate the
2504 initialization expression, apart from the actual constructor call or
2505 assignment--we do this because we want to delay the allocation as long
2506 as possible in order to minimize the size of the exception region for
2507 placement delete. */
f4f4610e 2508 if (is_initialized)
8d08fdba 2509 {
6de9cd9a 2510 bool stable;
844ae01d 2511 bool explicit_value_init_p = false;
6de9cd9a 2512
c166b898 2513 if (*init != NULL && VEC_empty (tree, *init))
6de9cd9a 2514 {
c166b898 2515 *init = NULL;
844ae01d
JM
2516 explicit_value_init_p = true;
2517 }
b84f4651 2518
a67e7daa
JM
2519 if (processing_template_decl && explicit_value_init_p)
2520 {
2521 /* build_value_init doesn't work in templates, and we don't need
2522 the initializer anyway since we're going to throw it away and
2523 rebuild it at instantiation time, so just build up a single
2524 constructor call to get any appropriate diagnostics. */
2525 init_expr = cp_build_indirect_ref (data_addr, RO_NULL, complain);
95552437 2526 if (type_build_ctor_call (elt_type))
a67e7daa
JM
2527 init_expr = build_special_member_call (init_expr,
2528 complete_ctor_identifier,
2529 init, elt_type,
2530 LOOKUP_NORMAL,
2531 complain);
2532 stable = stabilize_init (init_expr, &init_preeval_expr);
2533 }
2534 else if (array_p)
844ae01d 2535 {
25357d1e
JM
2536 tree vecinit = NULL_TREE;
2537 if (*init && VEC_length (tree, *init) == 1
2538 && BRACE_ENCLOSED_INITIALIZER_P (VEC_index (tree, *init, 0))
2539 && CONSTRUCTOR_IS_DIRECT_INIT (VEC_index (tree, *init, 0)))
2540 {
25357d1e 2541 vecinit = VEC_index (tree, *init, 0);
1f65a8c8
JM
2542 if (CONSTRUCTOR_NELTS (vecinit) == 0)
2543 /* List-value-initialization, leave it alone. */;
25357d1e
JM
2544 else
2545 {
1f65a8c8
JM
2546 tree arraytype, domain;
2547 if (TREE_CONSTANT (nelts))
2548 domain = compute_array_index_type (NULL_TREE, nelts,
2549 complain);
2550 else
2551 {
2552 domain = NULL_TREE;
2553 if (CONSTRUCTOR_NELTS (vecinit) > 0)
2554 warning (0, "non-constant array size in new, unable "
2555 "to verify length of initializer-list");
2556 }
2557 arraytype = build_cplus_array_type (type, domain);
2558 vecinit = digest_init (arraytype, vecinit, complain);
25357d1e 2559 }
25357d1e
JM
2560 }
2561 else if (*init)
5ade1ed2
DG
2562 {
2563 if (complain & tf_error)
1f65a8c8
JM
2564 permerror (input_location,
2565 "parenthesized initializer in array new");
5ade1ed2
DG
2566 else
2567 return error_mark_node;
25357d1e 2568 vecinit = build_tree_list_vec (*init);
5ade1ed2 2569 }
6de9cd9a 2570 init_expr
b73a4704
JM
2571 = build_vec_init (data_addr,
2572 cp_build_binary_op (input_location,
2573 MINUS_EXPR, outer_nelts,
2574 integer_one_node,
2575 complain),
2576 vecinit,
2577 explicit_value_init_p,
2578 /*from_array=*/0,
2579 complain);
6de9cd9a
DN
2580
2581 /* An array initialization is stable because the initialization
2582 of each element is a full-expression, so the temporaries don't
2583 leak out. */
2584 stable = true;
2585 }
f30efcb7 2586 else
8d08fdba 2587 {
dd865ef6 2588 init_expr = cp_build_indirect_ref (data_addr, RO_NULL, complain);
9207099b 2589
95552437 2590 if (type_build_ctor_call (type) && !explicit_value_init_p)
b84f4651
MM
2591 {
2592 init_expr = build_special_member_call (init_expr,
2593 complete_ctor_identifier,
2594 init, elt_type,
5ade1ed2
DG
2595 LOOKUP_NORMAL,
2596 complain);
844ae01d
JM
2597 }
2598 else if (explicit_value_init_p)
2599 {
a67e7daa
JM
2600 /* Something like `new int()'. */
2601 tree val = build_value_init (type, complain);
2602 if (val == error_mark_node)
2603 return error_mark_node;
2604 init_expr = build2 (INIT_EXPR, type, init_expr, val);
b84f4651 2605 }
8dc2b103 2606 else
b84f4651 2607 {
c166b898
ILT
2608 tree ie;
2609
b84f4651
MM
2610 /* We are processing something like `new int (10)', which
2611 means allocate an int, and initialize it with 10. */
3db45ab5 2612
c166b898
ILT
2613 ie = build_x_compound_expr_from_vec (*init, "new initializer");
2614 init_expr = cp_build_modify_expr (init_expr, INIT_EXPR, ie,
5ade1ed2 2615 complain);
b84f4651 2616 }
844ae01d 2617 stable = stabilize_init (init_expr, &init_preeval_expr);
96790071
JM
2618 }
2619
2620 if (init_expr == error_mark_node)
2621 return error_mark_node;
1f109f0f 2622
20c39572
JM
2623 /* If any part of the object initialization terminates by throwing an
2624 exception and a suitable deallocation function can be found, the
2625 deallocation function is called to free the memory in which the
2626 object was being constructed, after which the exception continues
2627 to propagate in the context of the new-expression. If no
2628 unambiguous matching deallocation function can be found,
2629 propagating the exception does not cause the object's memory to be
2630 freed. */
96790071 2631 if (flag_exceptions && ! use_java_new)
1f109f0f 2632 {
d746e87d 2633 enum tree_code dcode = array_p ? VEC_DELETE_EXPR : DELETE_EXPR;
96790071 2634 tree cleanup;
a7d87521 2635
5355deec 2636 /* The Standard is unclear here, but the right thing to do
f4f4610e
MM
2637 is to use the same method for finding deallocation
2638 functions that we use for finding allocation functions. */
10ee5386
JM
2639 cleanup = (build_op_delete_call
2640 (dcode,
9207099b 2641 alloc_node,
10ee5386
JM
2642 size,
2643 globally_qualified_p,
2644 placement_allocation_fn_p ? alloc_call : NULL_TREE,
2645 alloc_fn));
2bb14213 2646
6de9cd9a
DN
2647 if (!cleanup)
2648 /* We're done. */;
2649 else if (stable)
2650 /* This is much simpler if we were able to preevaluate all of
2651 the arguments to the constructor call. */
d665b6e5
MLI
2652 {
2653 /* CLEANUP is compiler-generated, so no diagnostics. */
2654 TREE_NO_WARNING (cleanup) = true;
2655 init_expr = build2 (TRY_CATCH_EXPR, void_type_node,
2656 init_expr, cleanup);
2657 /* Likewise, this try-catch is compiler-generated. */
2658 TREE_NO_WARNING (init_expr) = true;
2659 }
6de9cd9a
DN
2660 else
2661 /* Ack! First we allocate the memory. Then we set our sentry
2662 variable to true, and expand a cleanup that deletes the
2663 memory if sentry is true. Then we run the constructor, and
2664 finally clear the sentry.
2665
2666 We need to do this because we allocate the space first, so
2667 if there are any temporaries with cleanups in the
2668 constructor args and we weren't able to preevaluate them, we
2669 need this EH region to extend until end of full-expression
2670 to preserve nesting. */
da4768fe 2671 {
96790071 2672 tree end, sentry, begin;
2face519
JM
2673
2674 begin = get_target_expr (boolean_true_node);
659e5a7a 2675 CLEANUP_EH_ONLY (begin) = 1;
2face519 2676
659e5a7a
JM
2677 sentry = TARGET_EXPR_SLOT (begin);
2678
d665b6e5
MLI
2679 /* CLEANUP is compiler-generated, so no diagnostics. */
2680 TREE_NO_WARNING (cleanup) = true;
2681
659e5a7a 2682 TARGET_EXPR_CLEANUP (begin)
f293ce4b
RS
2683 = build3 (COND_EXPR, void_type_node, sentry,
2684 cleanup, void_zero_node);
2face519 2685
f293ce4b
RS
2686 end = build2 (MODIFY_EXPR, TREE_TYPE (sentry),
2687 sentry, boolean_false_node);
2face519 2688
96790071 2689 init_expr
f293ce4b
RS
2690 = build2 (COMPOUND_EXPR, void_type_node, begin,
2691 build2 (COMPOUND_EXPR, void_type_node, init_expr,
2692 end));
d665b6e5
MLI
2693 /* Likewise, this is compiler-generated. */
2694 TREE_NO_WARNING (init_expr) = true;
da4768fe 2695 }
1f109f0f 2696 }
f4f4610e 2697 }
8b5e2ce4
JM
2698 else
2699 init_expr = NULL_TREE;
2700
2701 /* Now build up the return value in reverse order. */
96790071 2702
8b5e2ce4 2703 rval = data_addr;
2face519 2704
8b5e2ce4 2705 if (init_expr)
f293ce4b 2706 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), init_expr, rval);
8b5e2ce4 2707 if (cookie_expr)
f293ce4b 2708 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), cookie_expr, rval);
8b5e2ce4 2709
10ee5386 2710 if (rval == data_addr)
8b5e2ce4
JM
2711 /* If we don't have an initializer or a cookie, strip the TARGET_EXPR
2712 and return the call (which doesn't need to be adjusted). */
2713 rval = TARGET_EXPR_INITIAL (alloc_expr);
2714 else
d18c083e 2715 {
8b5e2ce4
JM
2716 if (check_new)
2717 {
ba47d38d
AH
2718 tree ifexp = cp_build_binary_op (input_location,
2719 NE_EXPR, alloc_node,
6d96d7ff 2720 nullptr_node,
5ade1ed2
DG
2721 complain);
2722 rval = build_conditional_expr (ifexp, rval, alloc_node,
2723 complain);
8b5e2ce4 2724 }
d18c083e 2725
8b5e2ce4
JM
2726 /* Perform the allocation before anything else, so that ALLOC_NODE
2727 has been initialized before we start using it. */
f293ce4b 2728 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), alloc_expr, rval);
8b5e2ce4 2729 }
51c184be 2730
6de9cd9a 2731 if (init_preeval_expr)
f293ce4b 2732 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), init_preeval_expr, rval);
6de9cd9a 2733
d04a575f 2734 /* A new-expression is never an lvalue. */
41990f96 2735 gcc_assert (!lvalue_p (rval));
058dcc25 2736
25357d1e 2737 return convert (pointer_type, rval);
8d08fdba 2738}
63c9a190 2739
c166b898
ILT
2740/* Generate a representation for a C++ "new" expression. *PLACEMENT
2741 is a vector of placement-new arguments (or NULL if none). If NELTS
2742 is NULL, TYPE is the type of the storage to be allocated. If NELTS
2743 is not NULL, then this is an array-new allocation; TYPE is the type
2744 of the elements in the array and NELTS is the number of elements in
2745 the array. *INIT, if non-NULL, is the initializer for the new
2746 object, or an empty vector to indicate an initializer of "()". If
2747 USE_GLOBAL_NEW is true, then the user explicitly wrote "::new"
2748 rather than just "new". This may change PLACEMENT and INIT. */
63c9a190
MM
2749
2750tree
c166b898
ILT
2751build_new (VEC(tree,gc) **placement, tree type, tree nelts,
2752 VEC(tree,gc) **init, int use_global_new, tsubst_flags_t complain)
63c9a190
MM
2753{
2754 tree rval;
c166b898
ILT
2755 VEC(tree,gc) *orig_placement = NULL;
2756 tree orig_nelts = NULL_TREE;
2757 VEC(tree,gc) *orig_init = NULL;
63c9a190 2758
c166b898 2759 if (type == error_mark_node)
63c9a190
MM
2760 return error_mark_node;
2761
c166b898 2762 if (nelts == NULL_TREE && VEC_length (tree, *init) == 1)
86a09a9e
JM
2763 {
2764 tree auto_node = type_uses_auto (type);
2e5748d2
JM
2765 if (auto_node)
2766 {
2767 tree d_init = VEC_index (tree, *init, 0);
2768 d_init = resolve_nondeduced_context (d_init);
d84572a4 2769 type = do_auto_deduction (type, d_init, auto_node);
2e5748d2 2770 }
86a09a9e
JM
2771 }
2772
63c9a190
MM
2773 if (processing_template_decl)
2774 {
2775 if (dependent_type_p (type)
c166b898 2776 || any_type_dependent_arguments_p (*placement)
63c9a190 2777 || (nelts && type_dependent_expression_p (nelts))
c166b898
ILT
2778 || any_type_dependent_arguments_p (*init))
2779 return build_raw_new_expr (*placement, type, nelts, *init,
63c9a190 2780 use_global_new);
c166b898
ILT
2781
2782 orig_placement = make_tree_vector_copy (*placement);
2783 orig_nelts = nelts;
2784 orig_init = make_tree_vector_copy (*init);
2785
2786 make_args_non_dependent (*placement);
63c9a190
MM
2787 if (nelts)
2788 nelts = build_non_dependent_expr (nelts);
c166b898 2789 make_args_non_dependent (*init);
63c9a190
MM
2790 }
2791
2792 if (nelts)
2793 {
2794 if (!build_expr_type_conversion (WANT_INT | WANT_ENUM, nelts, false))
5ade1ed2
DG
2795 {
2796 if (complain & tf_error)
cbe5f3b3 2797 permerror (input_location, "size in array new must have integral type");
5ade1ed2
DG
2798 else
2799 return error_mark_node;
2800 }
03a904b5 2801 nelts = mark_rvalue_use (nelts);
b655f214 2802 nelts = cp_save_expr (cp_convert (sizetype, nelts));
63c9a190
MM
2803 }
2804
2805 /* ``A reference cannot be created by the new operator. A reference
2806 is not an object (8.2.2, 8.4.3), so a pointer to it could not be
2807 returned by new.'' ARM 5.3.3 */
2808 if (TREE_CODE (type) == REFERENCE_TYPE)
2809 {
5ade1ed2
DG
2810 if (complain & tf_error)
2811 error ("new cannot be applied to a reference type");
2812 else
2813 return error_mark_node;
63c9a190
MM
2814 type = TREE_TYPE (type);
2815 }
2816
2817 if (TREE_CODE (type) == FUNCTION_TYPE)
2818 {
5ade1ed2
DG
2819 if (complain & tf_error)
2820 error ("new cannot be applied to a function type");
63c9a190
MM
2821 return error_mark_node;
2822 }
2823
57ccb546
MM
2824 /* The type allocated must be complete. If the new-type-id was
2825 "T[N]" then we are just checking that "T" is complete here, but
2826 that is equivalent, since the value of "N" doesn't matter. */
309714d4 2827 if (!complete_type_or_maybe_complain (type, NULL_TREE, complain))
39fb9d72
DB
2828 return error_mark_node;
2829
5ade1ed2 2830 rval = build_new_1 (placement, type, nelts, init, use_global_new, complain);
63c9a190
MM
2831 if (rval == error_mark_node)
2832 return error_mark_node;
2833
2834 if (processing_template_decl)
c166b898
ILT
2835 {
2836 tree ret = build_raw_new_expr (orig_placement, type, orig_nelts,
2837 orig_init, use_global_new);
2838 release_tree_vector (orig_placement);
2839 release_tree_vector (orig_init);
2840 return ret;
2841 }
63c9a190
MM
2842
2843 /* Wrap it in a NOP_EXPR so warn_if_unused_value doesn't complain. */
2844 rval = build1 (NOP_EXPR, TREE_TYPE (rval), rval);
2845 TREE_NO_WARNING (rval) = 1;
2846
2847 return rval;
2848}
2849
2850/* Given a Java class, return a decl for the corresponding java.lang.Class. */
2851
2852tree
2853build_java_class_ref (tree type)
2854{
2855 tree name = NULL_TREE, class_decl;
2856 static tree CL_suffix = NULL_TREE;
2857 if (CL_suffix == NULL_TREE)
2858 CL_suffix = get_identifier("class$");
2859 if (jclass_node == NULL_TREE)
2860 {
2861 jclass_node = IDENTIFIER_GLOBAL_VALUE (get_identifier ("jclass"));
2862 if (jclass_node == NULL_TREE)
a3d536f1
VR
2863 {
2864 error ("call to Java constructor, while %<jclass%> undefined");
2865 return error_mark_node;
2866 }
63c9a190
MM
2867 jclass_node = TREE_TYPE (jclass_node);
2868 }
2869
2870 /* Mangle the class$ field. */
2871 {
2872 tree field;
910ad8de 2873 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
63c9a190
MM
2874 if (DECL_NAME (field) == CL_suffix)
2875 {
2876 mangle_decl (field);
2877 name = DECL_ASSEMBLER_NAME (field);
2878 break;
2879 }
2880 if (!field)
a3d536f1 2881 {
d8a07487 2882 error ("can%'t find %<class$%> in %qT", type);
a3d536f1
VR
2883 return error_mark_node;
2884 }
2885 }
63c9a190
MM
2886
2887 class_decl = IDENTIFIER_GLOBAL_VALUE (name);
2888 if (class_decl == NULL_TREE)
2889 {
c2255bc4
AH
2890 class_decl = build_decl (input_location,
2891 VAR_DECL, name, TREE_TYPE (jclass_node));
63c9a190
MM
2892 TREE_STATIC (class_decl) = 1;
2893 DECL_EXTERNAL (class_decl) = 1;
2894 TREE_PUBLIC (class_decl) = 1;
2895 DECL_ARTIFICIAL (class_decl) = 1;
2896 DECL_IGNORED_P (class_decl) = 1;
2897 pushdecl_top_level (class_decl);
2898 make_decl_rtl (class_decl);
2899 }
2900 return class_decl;
2901}
8d08fdba 2902\f
f30432d7 2903static tree
362efdc1 2904build_vec_delete_1 (tree base, tree maxindex, tree type,
574cfaa4
JM
2905 special_function_kind auto_delete_vec,
2906 int use_global_delete, tsubst_flags_t complain)
f30432d7
MS
2907{
2908 tree virtual_size;
e92cc029 2909 tree ptype = build_pointer_type (type = complete_type (type));
f30432d7
MS
2910 tree size_exp = size_in_bytes (type);
2911
2912 /* Temporary variables used by the loop. */
2913 tree tbase, tbase_init;
2914
2915 /* This is the body of the loop that implements the deletion of a
2916 single element, and moves temp variables to next elements. */
2917 tree body;
2918
2919 /* This is the LOOP_EXPR that governs the deletion of the elements. */
c7b62f14 2920 tree loop = 0;
f30432d7
MS
2921
2922 /* This is the thing that governs what to do after the loop has run. */
2923 tree deallocate_expr = 0;
2924
2925 /* This is the BIND_EXPR which holds the outermost iterator of the
2926 loop. It is convenient to set this variable up and test it before
2927 executing any other code in the loop.
2928 This is also the containing expression returned by this function. */
2929 tree controller = NULL_TREE;
5be014d5 2930 tree tmp;
f30432d7 2931
b2153b98 2932 /* We should only have 1-D arrays here. */
8dc2b103 2933 gcc_assert (TREE_CODE (type) != ARRAY_TYPE);
b2153b98 2934
574cfaa4
JM
2935 if (base == error_mark_node || maxindex == error_mark_node)
2936 return error_mark_node;
2937
9e1e64ec 2938 if (! MAYBE_CLASS_TYPE_P (type) || TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
c7b62f14 2939 goto no_destructor;
f30432d7 2940
708cae97 2941 /* The below is short by the cookie size. */
fed3cef0
RK
2942 virtual_size = size_binop (MULT_EXPR, size_exp,
2943 convert (sizetype, maxindex));
f30432d7 2944
46e8c075 2945 tbase = create_temporary_var (ptype);
5d49b6a7
RG
2946 tbase_init
2947 = cp_build_modify_expr (tbase, NOP_EXPR,
2948 fold_build_pointer_plus_loc (input_location,
2949 fold_convert (ptype,
2950 base),
2951 virtual_size),
2952 complain);
574cfaa4
JM
2953 if (tbase_init == error_mark_node)
2954 return error_mark_node;
f293ce4b
RS
2955 controller = build3 (BIND_EXPR, void_type_node, tbase,
2956 NULL_TREE, NULL_TREE);
f30432d7 2957 TREE_SIDE_EFFECTS (controller) = 1;
f30432d7 2958
f293ce4b 2959 body = build1 (EXIT_EXPR, void_type_node,
5cd88d68
RS
2960 build2 (EQ_EXPR, boolean_type_node, tbase,
2961 fold_convert (ptype, base)));
db3927fb 2962 tmp = fold_build1_loc (input_location, NEGATE_EXPR, sizetype, size_exp);
5d49b6a7 2963 tmp = fold_build_pointer_plus (tbase, tmp);
574cfaa4
JM
2964 tmp = cp_build_modify_expr (tbase, NOP_EXPR, tmp, complain);
2965 if (tmp == error_mark_node)
2966 return error_mark_node;
2967 body = build_compound_expr (input_location, body, tmp);
2968 tmp = build_delete (ptype, tbase, sfk_complete_destructor,
2969 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1,
2970 complain);
2971 if (tmp == error_mark_node)
2972 return error_mark_node;
2973 body = build_compound_expr (input_location, body, tmp);
f30432d7 2974
f293ce4b 2975 loop = build1 (LOOP_EXPR, void_type_node, body);
c2255bc4 2976 loop = build_compound_expr (input_location, tbase_init, loop);
f30432d7
MS
2977
2978 no_destructor:
e79a6b40
JM
2979 /* Delete the storage if appropriate. */
2980 if (auto_delete_vec == sfk_deleting_destructor)
f30432d7
MS
2981 {
2982 tree base_tbd;
2983
708cae97 2984 /* The below is short by the cookie size. */
fed3cef0
RK
2985 virtual_size = size_binop (MULT_EXPR, size_exp,
2986 convert (sizetype, maxindex));
f30432d7
MS
2987
2988 if (! TYPE_VEC_NEW_USES_COOKIE (type))
2989 /* no header */
2990 base_tbd = base;
2991 else
2992 {
834c6dff
MM
2993 tree cookie_size;
2994
46e995e0 2995 cookie_size = targetm.cxx.get_cookie_size (type);
574cfaa4
JM
2996 base_tbd = cp_build_binary_op (input_location,
2997 MINUS_EXPR,
2998 cp_convert (string_type_node,
2999 base),
3000 cookie_size,
3001 complain);
3002 if (base_tbd == error_mark_node)
3003 return error_mark_node;
3004 base_tbd = cp_convert (ptype, base_tbd);
e92cc029 3005 /* True size with header. */
834c6dff 3006 virtual_size = size_binop (PLUS_EXPR, virtual_size, cookie_size);
f30432d7 3007 }
86f45d2c 3008
e79a6b40
JM
3009 deallocate_expr = build_op_delete_call (VEC_DELETE_EXPR,
3010 base_tbd, virtual_size,
3011 use_global_delete & 1,
3012 /*placement=*/NULL_TREE,
3013 /*alloc_fn=*/NULL_TREE);
f30432d7
MS
3014 }
3015
c7b62f14
NS
3016 body = loop;
3017 if (!deallocate_expr)
3018 ;
3019 else if (!body)
3020 body = deallocate_expr;
f30432d7 3021 else
c2255bc4 3022 body = build_compound_expr (input_location, body, deallocate_expr);
c8094d83 3023
c7b62f14
NS
3024 if (!body)
3025 body = integer_zero_node;
c8094d83 3026
f30432d7 3027 /* Outermost wrapper: If pointer is null, punt. */
db3927fb
AH
3028 body = fold_build3_loc (input_location, COND_EXPR, void_type_node,
3029 fold_build2_loc (input_location,
3030 NE_EXPR, boolean_type_node, base,
7866705a 3031 convert (TREE_TYPE (base),
6d96d7ff 3032 nullptr_node)),
7866705a 3033 body, integer_zero_node);
f30432d7
MS
3034 body = build1 (NOP_EXPR, void_type_node, body);
3035
3036 if (controller)
3037 {
3038 TREE_OPERAND (controller, 1) = body;
4e8dca1c 3039 body = controller;
f30432d7 3040 }
4e8dca1c
JM
3041
3042 if (TREE_CODE (base) == SAVE_EXPR)
3043 /* Pre-evaluate the SAVE_EXPR outside of the BIND_EXPR. */
f293ce4b 3044 body = build2 (COMPOUND_EXPR, void_type_node, base, body);
4e8dca1c 3045
574cfaa4 3046 return convert_to_void (body, ICV_CAST, complain);
f30432d7
MS
3047}
3048
c8094d83 3049/* Create an unnamed variable of the indicated TYPE. */
c395453c 3050
f1dedc31 3051tree
362efdc1 3052create_temporary_var (tree type)
8a72a046 3053{
f1dedc31 3054 tree decl;
c8094d83 3055
c2255bc4
AH
3056 decl = build_decl (input_location,
3057 VAR_DECL, NULL_TREE, type);
f1dedc31
MM
3058 TREE_USED (decl) = 1;
3059 DECL_ARTIFICIAL (decl) = 1;
f1dedc31 3060 DECL_IGNORED_P (decl) = 1;
b35d4555 3061 DECL_CONTEXT (decl) = current_function_decl;
f1dedc31 3062
f1dedc31 3063 return decl;
8a72a046
MM
3064}
3065
f1dedc31
MM
3066/* Create a new temporary variable of the indicated TYPE, initialized
3067 to INIT.
8a72a046 3068
f1dedc31
MM
3069 It is not entered into current_binding_level, because that breaks
3070 things when it comes time to do final cleanups (which take place
3071 "outside" the binding contour of the function). */
3072
fe5b5c36 3073tree
362efdc1 3074get_temp_regvar (tree type, tree init)
f30432d7 3075{
f1dedc31 3076 tree decl;
8a72a046 3077
f1dedc31 3078 decl = create_temporary_var (type);
350fae66 3079 add_decl_expr (decl);
c8094d83 3080
5ade1ed2
DG
3081 finish_expr_stmt (cp_build_modify_expr (decl, INIT_EXPR, init,
3082 tf_warning_or_error));
8a72a046 3083
f1dedc31 3084 return decl;
f30432d7
MS
3085}
3086
f1dedc31
MM
3087/* `build_vec_init' returns tree structure that performs
3088 initialization of a vector of aggregate types.
8d08fdba 3089
9207099b
JM
3090 BASE is a reference to the vector, of ARRAY_TYPE, or a pointer
3091 to the first element, of POINTER_TYPE.
a48cccea 3092 MAXINDEX is the maximum index of the array (one less than the
9207099b 3093 number of elements). It is only used if BASE is a pointer or
a48cccea 3094 TYPE_DOMAIN (TREE_TYPE (BASE)) == NULL_TREE.
b84f4651 3095
8d08fdba
MS
3096 INIT is the (possibly NULL) initializer.
3097
844ae01d
JM
3098 If EXPLICIT_VALUE_INIT_P is true, then INIT must be NULL. All
3099 elements in the array are value-initialized.
b84f4651 3100
8d08fdba
MS
3101 FROM_ARRAY is 0 if we should init everything with INIT
3102 (i.e., every element initialized from INIT).
3103 FROM_ARRAY is 1 if we should index into INIT in parallel
3104 with initialization of DECL.
3105 FROM_ARRAY is 2 if we should index into INIT in parallel,
3106 but use assignment instead of initialization. */
3107
3108tree
3db45ab5 3109build_vec_init (tree base, tree maxindex, tree init,
844ae01d 3110 bool explicit_value_init_p,
5ade1ed2 3111 int from_array, tsubst_flags_t complain)
8d08fdba
MS
3112{
3113 tree rval;
8a72a046 3114 tree base2 = NULL_TREE;
e833cb11 3115 tree itype = NULL_TREE;
8a72a046 3116 tree iterator;
9207099b 3117 /* The type of BASE. */
f30efcb7 3118 tree atype = TREE_TYPE (base);
f1dedc31 3119 /* The type of an element in the array. */
f30efcb7 3120 tree type = TREE_TYPE (atype);
c8094d83 3121 /* The element type reached after removing all outer array
b5af3133
MM
3122 types. */
3123 tree inner_elt_type;
f1dedc31
MM
3124 /* The type of a pointer to an element in the array. */
3125 tree ptype;
3126 tree stmt_expr;
3127 tree compound_stmt;
3128 int destroy_temps;
f5984164 3129 tree try_block = NULL_TREE;
8a72a046 3130 int num_initialized_elts = 0;
2a3398e1 3131 bool is_global;
fa2200cb
JM
3132 tree const_init = NULL_TREE;
3133 tree obase = base;
f91352dc 3134 bool xvalue = false;
574cfaa4 3135 bool errors = false;
c8094d83 3136
9207099b 3137 if (TREE_CODE (atype) == ARRAY_TYPE && TYPE_DOMAIN (atype))
a48cccea
JM
3138 maxindex = array_type_nelts (atype);
3139
d2e312d7
PC
3140 if (maxindex == NULL_TREE || maxindex == error_mark_node
3141 || integer_all_onesp (maxindex))
8d08fdba
MS
3142 return error_mark_node;
3143
844ae01d 3144 if (explicit_value_init_p)
b84f4651
MM
3145 gcc_assert (!init);
3146
9207099b 3147 inner_elt_type = strip_array_types (type);
567ef749
JM
3148
3149 /* Look through the TARGET_EXPR around a compound literal. */
3150 if (init && TREE_CODE (init) == TARGET_EXPR
5a4d8044
JM
3151 && TREE_CODE (TARGET_EXPR_INITIAL (init)) == CONSTRUCTOR
3152 && from_array != 2)
567ef749
JM
3153 init = TARGET_EXPR_INITIAL (init);
3154
c8a3d889 3155 if (init
25357d1e 3156 && TREE_CODE (atype) == ARRAY_TYPE
c8a3d889 3157 && (from_array == 2
c8094d83 3158 ? (!CLASS_TYPE_P (inner_elt_type)
066ec0a4 3159 || !TYPE_HAS_COMPLEX_COPY_ASSIGN (inner_elt_type))
c8a3d889 3160 : !TYPE_NEEDS_CONSTRUCTING (type))
f30efcb7
JM
3161 && ((TREE_CODE (init) == CONSTRUCTOR
3162 /* Don't do this if the CONSTRUCTOR might contain something
3163 that might throw and require us to clean up. */
4038c495 3164 && (VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (init))
b5af3133 3165 || ! TYPE_HAS_NONTRIVIAL_DESTRUCTOR (inner_elt_type)))
f30efcb7
JM
3166 || from_array))
3167 {
c32097d8 3168 /* Do non-default initialization of trivial arrays resulting from
f30efcb7
JM
3169 brace-enclosed initializers. In this case, digest_init and
3170 store_constructor will handle the semantics for us. */
3171
f293ce4b 3172 stmt_expr = build2 (INIT_EXPR, atype, base, init);
f30efcb7
JM
3173 return stmt_expr;
3174 }
3175
3176 maxindex = cp_convert (ptrdiff_type_node, maxindex);
9207099b
JM
3177 if (TREE_CODE (atype) == ARRAY_TYPE)
3178 {
3179 ptype = build_pointer_type (type);
3180 base = cp_convert (ptype, decay_conversion (base));
3181 }
3182 else
3183 ptype = atype;
8d08fdba 3184
f1dedc31 3185 /* The code we are generating looks like:
303b7406 3186 ({
f1dedc31 3187 T* t1 = (T*) base;
f30efcb7 3188 T* rval = t1;
f1dedc31
MM
3189 ptrdiff_t iterator = maxindex;
3190 try {
4977bab6 3191 for (; iterator != -1; --iterator) {
f30efcb7
JM
3192 ... initialize *t1 ...
3193 ++t1;
4977bab6 3194 }
f1dedc31 3195 } catch (...) {
0cbd7506 3196 ... destroy elements that were constructed ...
f1dedc31 3197 }
303b7406
NS
3198 rval;
3199 })
c8094d83 3200
f1dedc31
MM
3201 We can omit the try and catch blocks if we know that the
3202 initialization will never throw an exception, or if the array
f30efcb7 3203 elements do not have destructors. We can omit the loop completely if
c8094d83 3204 the elements of the array do not have constructors.
f1dedc31
MM
3205
3206 We actually wrap the entire body of the above in a STMT_EXPR, for
c8094d83 3207 tidiness.
f1dedc31
MM
3208
3209 When copying from array to another, when the array elements have
3210 only trivial copy constructors, we should use __builtin_memcpy
3211 rather than generating a loop. That way, we could take advantage
3b426391 3212 of whatever cleverness the back end has for dealing with copies
f1dedc31
MM
3213 of blocks of memory. */
3214
2a3398e1 3215 is_global = begin_init_stmts (&stmt_expr, &compound_stmt);
f2c5f623 3216 destroy_temps = stmts_are_full_exprs_p ();
ae499cce 3217 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
f30efcb7 3218 rval = get_temp_regvar (ptype, base);
f1dedc31 3219 base = get_temp_regvar (ptype, rval);
8a72a046 3220 iterator = get_temp_regvar (ptrdiff_type_node, maxindex);
8d08fdba 3221
5a4d8044
JM
3222 /* If initializing one array from another, initialize element by
3223 element. We rely upon the below calls to do the argument
3224 checking. Evaluate the initializer before entering the try block. */
3225 if (from_array && init && TREE_CODE (init) != CONSTRUCTOR)
3226 {
f91352dc
JM
3227 if (lvalue_kind (init) & clk_rvalueref)
3228 xvalue = true;
5a4d8044
JM
3229 base2 = decay_conversion (init);
3230 itype = TREE_TYPE (base2);
3231 base2 = get_temp_regvar (itype, base2);
3232 itype = TREE_TYPE (itype);
3233 }
3234
8a72a046 3235 /* Protect the entire array initialization so that we can destroy
f30efcb7
JM
3236 the partially constructed array if an exception is thrown.
3237 But don't do this if we're assigning. */
3238 if (flag_exceptions && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
3239 && from_array != 2)
ed5511d9
MM
3240 {
3241 try_block = begin_try_block ();
ed5511d9 3242 }
8a72a046 3243
1f65a8c8
JM
3244 /* If the initializer is {}, then all elements are initialized from {}.
3245 But for non-classes, that's the same as value-initialization. */
3246 if (init && BRACE_ENCLOSED_INITIALIZER_P (init)
3247 && CONSTRUCTOR_NELTS (init) == 0)
3248 {
3249 if (CLASS_TYPE_P (type))
3250 /* Leave init alone. */;
3251 else
3252 {
3253 init = NULL_TREE;
3254 explicit_value_init_p = true;
3255 }
3256 }
3257
fa2200cb
JM
3258 /* Maybe pull out constant value when from_array? */
3259
1f65a8c8 3260 else if (init != NULL_TREE && TREE_CODE (init) == CONSTRUCTOR)
8d08fdba 3261 {
c32097d8 3262 /* Do non-default initialization of non-trivial arrays resulting from
f30efcb7 3263 brace-enclosed initializers. */
4038c495 3264 unsigned HOST_WIDE_INT idx;
fa2200cb
JM
3265 tree field, elt;
3266 /* Should we try to create a constant initializer? */
fe7eb484
JM
3267 bool try_const = (TREE_CODE (atype) == ARRAY_TYPE
3268 && (literal_type_p (inner_elt_type)
3269 || TYPE_HAS_CONSTEXPR_CTOR (inner_elt_type)));
b25dd954
JM
3270 /* If the constructor already has the array type, it's been through
3271 digest_init, so we shouldn't try to do anything more. */
3272 bool digested = same_type_p (atype, TREE_TYPE (init));
fa2200cb
JM
3273 bool saw_non_const = false;
3274 bool saw_const = false;
3275 /* If we're initializing a static array, we want to do static
3276 initialization of any elements with constant initializers even if
3277 some are non-constant. */
3278 bool do_static_init = (DECL_P (obase) && TREE_STATIC (obase));
3279 VEC(constructor_elt,gc) *new_vec;
094fe153
JM
3280 from_array = 0;
3281
fa2200cb
JM
3282 if (try_const)
3283 new_vec = VEC_alloc (constructor_elt, gc, CONSTRUCTOR_NELTS (init));
3284 else
3285 new_vec = NULL;
3286
3287 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (init), idx, field, elt)
8d08fdba 3288 {
f1dedc31 3289 tree baseref = build1 (INDIRECT_REF, type, base);
fa2200cb 3290 tree one_init;
8d08fdba 3291
8a72a046 3292 num_initialized_elts++;
8d08fdba 3293
67c03833 3294 current_stmt_tree ()->stmts_are_full_exprs_p = 1;
b25dd954
JM
3295 if (digested)
3296 one_init = build2 (INIT_EXPR, type, baseref, elt);
3297 else if (MAYBE_CLASS_TYPE_P (type) || TREE_CODE (type) == ARRAY_TYPE)
fa2200cb 3298 one_init = build_aggr_init (baseref, elt, 0, complain);
8a72a046 3299 else
fa2200cb
JM
3300 one_init = cp_build_modify_expr (baseref, NOP_EXPR,
3301 elt, complain);
574cfaa4
JM
3302 if (one_init == error_mark_node)
3303 errors = true;
fa2200cb
JM
3304 if (try_const)
3305 {
3306 tree e = one_init;
3307 if (TREE_CODE (e) == EXPR_STMT)
3308 e = TREE_OPERAND (e, 0);
3309 if (TREE_CODE (e) == CONVERT_EXPR
3310 && VOID_TYPE_P (TREE_TYPE (e)))
3311 e = TREE_OPERAND (e, 0);
3312 e = maybe_constant_init (e);
3313 if (reduced_constant_expression_p (e))
3314 {
3315 CONSTRUCTOR_APPEND_ELT (new_vec, field, e);
3316 if (do_static_init)
3317 one_init = NULL_TREE;
3318 else
3319 one_init = build2 (INIT_EXPR, type, baseref, e);
3320 saw_const = true;
3321 }
3322 else
3323 {
3324 if (do_static_init)
3325 CONSTRUCTOR_APPEND_ELT (new_vec, field,
3326 build_zero_init (TREE_TYPE (e),
3327 NULL_TREE, true));
3328 saw_non_const = true;
3329 }
3330 }
3331
3332 if (one_init)
3333 finish_expr_stmt (one_init);
67c03833 3334 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
8a72a046 3335
574cfaa4
JM
3336 one_init = cp_build_unary_op (PREINCREMENT_EXPR, base, 0, complain);
3337 if (one_init == error_mark_node)
3338 errors = true;
3339 else
3340 finish_expr_stmt (one_init);
3341
3342 one_init = cp_build_unary_op (PREDECREMENT_EXPR, iterator, 0,
3343 complain);
3344 if (one_init == error_mark_node)
3345 errors = true;
3346 else
3347 finish_expr_stmt (one_init);
8d08fdba 3348 }
8d08fdba 3349
fa2200cb
JM
3350 if (try_const)
3351 {
3352 if (!saw_non_const)
3353 const_init = build_constructor (atype, new_vec);
3354 else if (do_static_init && saw_const)
3355 DECL_INITIAL (obase) = build_constructor (atype, new_vec);
3356 else
3357 VEC_free (constructor_elt, gc, new_vec);
3358 }
3359
8a72a046
MM
3360 /* Clear out INIT so that we don't get confused below. */
3361 init = NULL_TREE;
8d08fdba 3362 }
8a72a046 3363 else if (from_array)
8d08fdba 3364 {
8a72a046 3365 if (init)
5a4d8044 3366 /* OK, we set base2 above. */;
95552437 3367 else if (CLASS_TYPE_P (type)
8a72a046
MM
3368 && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
3369 {
5ade1ed2
DG
3370 if (complain & tf_error)
3371 error ("initializer ends prematurely");
574cfaa4 3372 errors = true;
8a72a046
MM
3373 }
3374 }
8d08fdba 3375
8a72a046
MM
3376 /* Now, default-initialize any remaining elements. We don't need to
3377 do that if a) the type does not need constructing, or b) we've
094fe153
JM
3378 already initialized all the elements.
3379
3380 We do need to keep going if we're copying an array. */
3381
3382 if (from_array
1f65a8c8 3383 || ((type_build_ctor_call (type) || init || explicit_value_init_p)
665f2503 3384 && ! (host_integerp (maxindex, 0)
05bccae2 3385 && (num_initialized_elts
665f2503 3386 == tree_low_cst (maxindex, 0) + 1))))
8a72a046 3387 {
37e05cd5 3388 /* If the ITERATOR is equal to -1, then we don't have to loop;
8a72a046 3389 we've already initialized all the elements. */
4977bab6 3390 tree for_stmt;
f1dedc31 3391 tree elt_init;
b84f4651 3392 tree to;
f1dedc31 3393
3f43ac31 3394 for_stmt = begin_for_stmt (NULL_TREE, NULL_TREE);
4977bab6 3395 finish_for_init_stmt (for_stmt);
aab384ae
RG
3396 finish_for_cond (build2 (NE_EXPR, boolean_type_node, iterator,
3397 build_int_cst (TREE_TYPE (iterator), -1)),
4977bab6 3398 for_stmt);
574cfaa4
JM
3399 elt_init = cp_build_unary_op (PREDECREMENT_EXPR, iterator, 0,
3400 complain);
3401 if (elt_init == error_mark_node)
3402 errors = true;
3403 finish_for_expr (elt_init, for_stmt);
8d08fdba 3404
b84f4651
MM
3405 to = build1 (INDIRECT_REF, type, base);
3406
8d08fdba
MS
3407 if (from_array)
3408 {
8d08fdba
MS
3409 tree from;
3410
3411 if (base2)
f91352dc
JM
3412 {
3413 from = build1 (INDIRECT_REF, itype, base2);
3414 if (xvalue)
3415 from = move (from);
3416 }
8d08fdba
MS
3417 else
3418 from = NULL_TREE;
3419
3420 if (from_array == 2)
5ade1ed2
DG
3421 elt_init = cp_build_modify_expr (to, NOP_EXPR, from,
3422 complain);
95552437 3423 else if (type_build_ctor_call (type))
5ade1ed2 3424 elt_init = build_aggr_init (to, from, 0, complain);
8d08fdba 3425 else if (from)
5ade1ed2
DG
3426 elt_init = cp_build_modify_expr (to, NOP_EXPR, from,
3427 complain);
8d08fdba 3428 else
8dc2b103 3429 gcc_unreachable ();
8d08fdba
MS
3430 }
3431 else if (TREE_CODE (type) == ARRAY_TYPE)
3432 {
3433 if (init != 0)
f30efcb7
JM
3434 sorry
3435 ("cannot initialize multi-dimensional array with initializer");
3436 elt_init = build_vec_init (build1 (INDIRECT_REF, type, base),
3db45ab5 3437 0, 0,
844ae01d 3438 explicit_value_init_p,
5ade1ed2 3439 0, complain);
f1dedc31 3440 }
844ae01d 3441 else if (explicit_value_init_p)
309714d4
JM
3442 {
3443 elt_init = build_value_init (type, complain);
574cfaa4 3444 if (elt_init != error_mark_node)
309714d4
JM
3445 elt_init = build2 (INIT_EXPR, type, to, elt_init);
3446 }
f1dedc31 3447 else
844ae01d 3448 {
1f65a8c8
JM
3449 gcc_assert (type_build_ctor_call (type) || init);
3450 if (CLASS_TYPE_P (type))
3451 elt_init = build_aggr_init (to, init, 0, complain);
3452 else
3453 {
3454 if (TREE_CODE (init) == TREE_LIST)
3455 init = build_x_compound_expr_from_list (init, ELK_INIT,
3456 complain);
3457 elt_init = build2 (INIT_EXPR, type, to, init);
3458 }
844ae01d 3459 }
c8094d83 3460
574cfaa4
JM
3461 if (elt_init == error_mark_node)
3462 errors = true;
3463
2a3398e1
NS
3464 current_stmt_tree ()->stmts_are_full_exprs_p = 1;
3465 finish_expr_stmt (elt_init);
3466 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
8d08fdba 3467
5ade1ed2
DG
3468 finish_expr_stmt (cp_build_unary_op (PREINCREMENT_EXPR, base, 0,
3469 complain));
8d08fdba 3470 if (base2)
5ade1ed2
DG
3471 finish_expr_stmt (cp_build_unary_op (PREINCREMENT_EXPR, base2, 0,
3472 complain));
0fac6b0b 3473
4977bab6 3474 finish_for_stmt (for_stmt);
8d08fdba 3475 }
8a72a046
MM
3476
3477 /* Make sure to cleanup any partially constructed elements. */
f30efcb7
JM
3478 if (flag_exceptions && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
3479 && from_array != 2)
f1dedc31
MM
3480 {
3481 tree e;
ba47d38d
AH
3482 tree m = cp_build_binary_op (input_location,
3483 MINUS_EXPR, maxindex, iterator,
5ade1ed2 3484 complain);
b2153b98
KL
3485
3486 /* Flatten multi-dimensional array since build_vec_delete only
3487 expects one-dimensional array. */
3488 if (TREE_CODE (type) == ARRAY_TYPE)
ba47d38d
AH
3489 m = cp_build_binary_op (input_location,
3490 MULT_EXPR, m,
5ade1ed2
DG
3491 array_type_nelts_total (type),
3492 complain);
8d08fdba 3493
ed5511d9 3494 finish_cleanup_try_block (try_block);
c8094d83 3495 e = build_vec_delete_1 (rval, m,
e79a6b40 3496 inner_elt_type, sfk_complete_destructor,
574cfaa4
JM
3497 /*use_global_delete=*/0, complain);
3498 if (e == error_mark_node)
3499 errors = true;
f1dedc31
MM
3500 finish_cleanup (e, try_block);
3501 }
3502
303b7406
NS
3503 /* The value of the array initialization is the array itself, RVAL
3504 is a pointer to the first element. */
325c3691 3505 finish_stmt_expr_expr (rval, stmt_expr);
f1dedc31 3506
2a3398e1 3507 stmt_expr = finish_init_stmts (is_global, stmt_expr, compound_stmt);
303b7406 3508
9207099b
JM
3509 /* Now make the result have the correct type. */
3510 if (TREE_CODE (atype) == ARRAY_TYPE)
3511 {
3512 atype = build_pointer_type (atype);
3513 stmt_expr = build1 (NOP_EXPR, atype, stmt_expr);
dd865ef6 3514 stmt_expr = cp_build_indirect_ref (stmt_expr, RO_NULL, complain);
311fa510 3515 TREE_NO_WARNING (stmt_expr) = 1;
9207099b 3516 }
c8094d83 3517
ae499cce 3518 current_stmt_tree ()->stmts_are_full_exprs_p = destroy_temps;
fa2200cb
JM
3519
3520 if (const_init)
3521 return build2 (INIT_EXPR, atype, obase, const_init);
574cfaa4
JM
3522 if (errors)
3523 return error_mark_node;
f1dedc31 3524 return stmt_expr;
8d08fdba
MS
3525}
3526
86f45d2c
MM
3527/* Call the DTOR_KIND destructor for EXP. FLAGS are as for
3528 build_delete. */
298d6f60
MM
3529
3530static tree
574cfaa4
JM
3531build_dtor_call (tree exp, special_function_kind dtor_kind, int flags,
3532 tsubst_flags_t complain)
298d6f60 3533{
86f45d2c 3534 tree name;
ee76b931 3535 tree fn;
86f45d2c
MM
3536 switch (dtor_kind)
3537 {
3538 case sfk_complete_destructor:
3539 name = complete_dtor_identifier;
3540 break;
3541
3542 case sfk_base_destructor:
3543 name = base_dtor_identifier;
3544 break;
3545
3546 case sfk_deleting_destructor:
3547 name = deleting_dtor_identifier;
3548 break;
3549
3550 default:
8dc2b103 3551 gcc_unreachable ();
86f45d2c 3552 }
ee76b931 3553 fn = lookup_fnfields (TREE_TYPE (exp), name, /*protect=*/2);
c8094d83 3554 return build_new_method_call (exp, fn,
c166b898 3555 /*args=*/NULL,
ee76b931 3556 /*conversion_path=*/NULL_TREE,
63c9a190 3557 flags,
5ade1ed2 3558 /*fn_p=*/NULL,
574cfaa4 3559 complain);
298d6f60
MM
3560}
3561
8d08fdba
MS
3562/* Generate a call to a destructor. TYPE is the type to cast ADDR to.
3563 ADDR is an expression which yields the store to be destroyed.
86f45d2c
MM
3564 AUTO_DELETE is the name of the destructor to call, i.e., either
3565 sfk_complete_destructor, sfk_base_destructor, or
3566 sfk_deleting_destructor.
8d08fdba
MS
3567
3568 FLAGS is the logical disjunction of zero or more LOOKUP_
ade3dc07 3569 flags. See cp-tree.h for more info. */
e92cc029 3570
8d08fdba 3571tree
362efdc1 3572build_delete (tree type, tree addr, special_function_kind auto_delete,
574cfaa4 3573 int flags, int use_global_delete, tsubst_flags_t complain)
8d08fdba 3574{
8d08fdba 3575 tree expr;
8d08fdba
MS
3576
3577 if (addr == error_mark_node)
3578 return error_mark_node;
3579
3580 /* Can happen when CURRENT_EXCEPTION_OBJECT gets its type
3581 set to `error_mark_node' before it gets properly cleaned up. */
3582 if (type == error_mark_node)
3583 return error_mark_node;
3584
3585 type = TYPE_MAIN_VARIANT (type);
3586
03a904b5
JJ
3587 addr = mark_rvalue_use (addr);
3588
8d08fdba
MS
3589 if (TREE_CODE (type) == POINTER_TYPE)
3590 {
b1e5b86c
GB
3591 bool complete_p = true;
3592
2986ae00 3593 type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
8d08fdba
MS
3594 if (TREE_CODE (type) == ARRAY_TYPE)
3595 goto handle_array;
23b4deba 3596
b1e5b86c
GB
3597 /* We don't want to warn about delete of void*, only other
3598 incomplete types. Deleting other incomplete types
3599 invokes undefined behavior, but it is not ill-formed, so
3600 compile to something that would even do The Right Thing
3601 (TM) should the type have a trivial dtor and no delete
3602 operator. */
3603 if (!VOID_TYPE_P (type))
8d08fdba 3604 {
b1e5b86c
GB
3605 complete_type (type);
3606 if (!COMPLETE_TYPE_P (type))
3607 {
574cfaa4
JM
3608 if ((complain & tf_warning)
3609 && warning (0, "possible problem detected in invocation of "
3610 "delete operator:"))
71205d17
MLI
3611 {
3612 cxx_incomplete_type_diagnostic (addr, type, DK_WARNING);
1f5b3869 3613 inform (input_location, "neither the destructor nor the class-specific "
71205d17 3614 "operator delete will be called, even if they are "
d8a07487 3615 "declared when the class is defined");
71205d17 3616 }
b1e5b86c
GB
3617 complete_p = false;
3618 }
e2ab8a0f
JW
3619 else if (auto_delete == sfk_deleting_destructor && warn_delnonvdtor
3620 && MAYBE_CLASS_TYPE_P (type) && !CLASSTYPE_FINAL (type)
3621 && TYPE_POLYMORPHIC_P (type))
014ab419
JW
3622 {
3623 tree dtor;
3624 dtor = CLASSTYPE_DESTRUCTORS (type);
3625 if (!dtor || !DECL_VINDEX (dtor))
3626 {
3627 if (CLASSTYPE_PURE_VIRTUALS (type))
3628 warning (OPT_Wdelete_non_virtual_dtor,
3629 "deleting object of abstract class type %qT"
3630 " which has non-virtual destructor"
3631 " will cause undefined behaviour", type);
3632 else
3633 warning (OPT_Wdelete_non_virtual_dtor,
3634 "deleting object of polymorphic class type %qT"
3635 " which has non-virtual destructor"
3636 " might cause undefined behaviour", type);
3637 }
3638 }
8d08fdba 3639 }
9e1e64ec 3640 if (VOID_TYPE_P (type) || !complete_p || !MAYBE_CLASS_TYPE_P (type))
b1e5b86c
GB
3641 /* Call the builtin operator delete. */
3642 return build_builtin_delete_call (addr);
8d08fdba
MS
3643 if (TREE_SIDE_EFFECTS (addr))
3644 addr = save_expr (addr);
2986ae00 3645
f4f206f4 3646 /* Throw away const and volatile on target type of addr. */
6060a796 3647 addr = convert_force (build_pointer_type (type), addr, 0);
8d08fdba
MS
3648 }
3649 else if (TREE_CODE (type) == ARRAY_TYPE)
3650 {
3651 handle_array:
c8094d83 3652
c407792d
RK
3653 if (TYPE_DOMAIN (type) == NULL_TREE)
3654 {
574cfaa4
JM
3655 if (complain & tf_error)
3656 error ("unknown array size in delete");
c407792d
RK
3657 return error_mark_node;
3658 }
8d08fdba 3659 return build_vec_delete (addr, array_type_nelts (type),
574cfaa4 3660 auto_delete, use_global_delete, complain);
8d08fdba
MS
3661 }
3662 else
3663 {
3664 /* Don't check PROTECT here; leave that decision to the
3665 destructor. If the destructor is accessible, call it,
3666 else report error. */
574cfaa4
JM
3667 addr = cp_build_addr_expr (addr, complain);
3668 if (addr == error_mark_node)
3669 return error_mark_node;
8d08fdba
MS
3670 if (TREE_SIDE_EFFECTS (addr))
3671 addr = save_expr (addr);
3672
60696c53 3673 addr = convert_force (build_pointer_type (type), addr, 0);
8d08fdba
MS
3674 }
3675
9e1e64ec 3676 gcc_assert (MAYBE_CLASS_TYPE_P (type));
8d08fdba 3677
834c6dff 3678 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
8d08fdba 3679 {
60696c53 3680 if (auto_delete != sfk_deleting_destructor)
8d08fdba
MS
3681 return void_zero_node;
3682
3db45ab5
MS
3683 return build_op_delete_call (DELETE_EXPR, addr,
3684 cxx_sizeof_nowarn (type),
63c9a190
MM
3685 use_global_delete,
3686 /*placement=*/NULL_TREE,
3687 /*alloc_fn=*/NULL_TREE);
8d08fdba 3688 }
ade3dc07 3689 else
8d08fdba 3690 {
6f06d231 3691 tree head = NULL_TREE;
700f8a87 3692 tree do_delete = NULL_TREE;
bd6dd845 3693 tree ifexp;
700f8a87 3694
9f4faeae
MM
3695 if (CLASSTYPE_LAZY_DESTRUCTOR (type))
3696 lazily_declare_fn (sfk_destructor, type);
ade3dc07 3697
52682a1b
MM
3698 /* For `::delete x', we must not use the deleting destructor
3699 since then we would not be sure to get the global `operator
3700 delete'. */
86f45d2c 3701 if (use_global_delete && auto_delete == sfk_deleting_destructor)
700f8a87 3702 {
1b4a93f7
MM
3703 /* We will use ADDR multiple times so we must save it. */
3704 addr = save_expr (addr);
6f06d231 3705 head = get_target_expr (build_headof (addr));
c6002625 3706 /* Delete the object. */
6f06d231 3707 do_delete = build_builtin_delete_call (head);
86f45d2c
MM
3708 /* Otherwise, treat this like a complete object destructor
3709 call. */
3710 auto_delete = sfk_complete_destructor;
700f8a87 3711 }
52682a1b
MM
3712 /* If the destructor is non-virtual, there is no deleting
3713 variant. Instead, we must explicitly call the appropriate
3714 `operator delete' here. */
3715 else if (!DECL_VIRTUAL_P (CLASSTYPE_DESTRUCTORS (type))
3716 && auto_delete == sfk_deleting_destructor)
3717 {
1b4a93f7
MM
3718 /* We will use ADDR multiple times so we must save it. */
3719 addr = save_expr (addr);
3720 /* Build the call. */
52682a1b
MM
3721 do_delete = build_op_delete_call (DELETE_EXPR,
3722 addr,
ea793912 3723 cxx_sizeof_nowarn (type),
5bd61841 3724 /*global_p=*/false,
63c9a190
MM
3725 /*placement=*/NULL_TREE,
3726 /*alloc_fn=*/NULL_TREE);
52682a1b
MM
3727 /* Call the complete object destructor. */
3728 auto_delete = sfk_complete_destructor;
3729 }
e3fe84e5
JM
3730 else if (auto_delete == sfk_deleting_destructor
3731 && TYPE_GETS_REG_DELETE (type))
3732 {
3733 /* Make sure we have access to the member op delete, even though
3734 we'll actually be calling it from the destructor. */
ea793912 3735 build_op_delete_call (DELETE_EXPR, addr, cxx_sizeof_nowarn (type),
3db45ab5 3736 /*global_p=*/false,
63c9a190
MM
3737 /*placement=*/NULL_TREE,
3738 /*alloc_fn=*/NULL_TREE);
e3fe84e5 3739 }
8d08fdba 3740
574cfaa4
JM
3741 expr = build_dtor_call (cp_build_indirect_ref (addr, RO_NULL, complain),
3742 auto_delete, flags, complain);
3743 if (expr == error_mark_node)
3744 return error_mark_node;
bd6dd845 3745 if (do_delete)
f293ce4b 3746 expr = build2 (COMPOUND_EXPR, void_type_node, expr, do_delete);
9e9ff709 3747
6f06d231
JM
3748 /* We need to calculate this before the dtor changes the vptr. */
3749 if (head)
3750 expr = build2 (COMPOUND_EXPR, void_type_node, head, expr);
3751
bd6dd845
MS
3752 if (flags & LOOKUP_DESTRUCTOR)
3753 /* Explicit destructor call; don't check for null pointer. */
3754 ifexp = integer_one_node;
8d08fdba 3755 else
574cfaa4
JM
3756 {
3757 /* Handle deleting a null pointer. */
3758 ifexp = fold (cp_build_binary_op (input_location,
6d96d7ff 3759 NE_EXPR, addr, nullptr_node,
574cfaa4
JM
3760 complain));
3761 if (ifexp == error_mark_node)
3762 return error_mark_node;
3763 }
8d08fdba 3764
bd6dd845 3765 if (ifexp != integer_one_node)
f293ce4b
RS
3766 expr = build3 (COND_EXPR, void_type_node,
3767 ifexp, expr, void_zero_node);
8d08fdba 3768
8d08fdba
MS
3769 return expr;
3770 }
ade3dc07 3771}
8d08fdba 3772
ade3dc07
JM
3773/* At the beginning of a destructor, push cleanups that will call the
3774 destructors for our base classes and members.
2a2480e1 3775
a29e1034 3776 Called from begin_destructor_body. */
8d08fdba 3777
ade3dc07 3778void
edaf3e03 3779push_base_cleanups (void)
ade3dc07 3780{
fa743e8c
NS
3781 tree binfo, base_binfo;
3782 int i;
ade3dc07
JM
3783 tree member;
3784 tree expr;
d4e6fecb 3785 VEC(tree,gc) *vbases;
8d08fdba 3786
ade3dc07 3787 /* Run destructors for all virtual baseclasses. */
5775a06a 3788 if (CLASSTYPE_VBASECLASSES (current_class_type))
ade3dc07 3789 {
ade3dc07 3790 tree cond = (condition_conversion
f293ce4b
RS
3791 (build2 (BIT_AND_EXPR, integer_type_node,
3792 current_in_charge_parm,
3793 integer_two_node)));
8d08fdba 3794
58c42dc2 3795 /* The CLASSTYPE_VBASECLASSES vector is in initialization
ade3dc07 3796 order, which is also the right order for pushing cleanups. */
9ba5ff0f
NS
3797 for (vbases = CLASSTYPE_VBASECLASSES (current_class_type), i = 0;
3798 VEC_iterate (tree, vbases, i, base_binfo); i++)
8d08fdba 3799 {
9ba5ff0f 3800 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo)))
8d08fdba 3801 {
c8094d83 3802 expr = build_special_member_call (current_class_ref,
4ba126e4 3803 base_dtor_identifier,
c166b898 3804 NULL,
9ba5ff0f 3805 base_binfo,
c8094d83 3806 (LOOKUP_NORMAL
5ade1ed2
DG
3807 | LOOKUP_NONVIRTUAL),
3808 tf_warning_or_error);
f293ce4b
RS
3809 expr = build3 (COND_EXPR, void_type_node, cond,
3810 expr, void_zero_node);
ade3dc07 3811 finish_decl_cleanup (NULL_TREE, expr);
8d08fdba
MS
3812 }
3813 }
ade3dc07
JM
3814 }
3815
ade3dc07 3816 /* Take care of the remaining baseclasses. */
fa743e8c
NS
3817 for (binfo = TYPE_BINFO (current_class_type), i = 0;
3818 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
ade3dc07 3819 {
ade3dc07 3820 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo))
809e3e7f 3821 || BINFO_VIRTUAL_P (base_binfo))
ade3dc07
JM
3822 continue;
3823
c8094d83 3824 expr = build_special_member_call (current_class_ref,
4ba126e4 3825 base_dtor_identifier,
c166b898 3826 NULL, base_binfo,
5ade1ed2
DG
3827 LOOKUP_NORMAL | LOOKUP_NONVIRTUAL,
3828 tf_warning_or_error);
ade3dc07
JM
3829 finish_decl_cleanup (NULL_TREE, expr);
3830 }
3831
57ece258
JM
3832 /* Don't automatically destroy union members. */
3833 if (TREE_CODE (current_class_type) == UNION_TYPE)
3834 return;
3835
ade3dc07 3836 for (member = TYPE_FIELDS (current_class_type); member;
910ad8de 3837 member = DECL_CHAIN (member))
ade3dc07 3838 {
57ece258
JM
3839 tree this_type = TREE_TYPE (member);
3840 if (this_type == error_mark_node
2e5d2970
VR
3841 || TREE_CODE (member) != FIELD_DECL
3842 || DECL_ARTIFICIAL (member))
ade3dc07 3843 continue;
57ece258
JM
3844 if (ANON_UNION_TYPE_P (this_type))
3845 continue;
3846 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (this_type))
ade3dc07 3847 {
c8094d83
MS
3848 tree this_member = (build_class_member_access_expr
3849 (current_class_ref, member,
50ad9642 3850 /*access_path=*/NULL_TREE,
5ade1ed2
DG
3851 /*preserve_reference=*/false,
3852 tf_warning_or_error));
ade3dc07
JM
3853 expr = build_delete (this_type, this_member,
3854 sfk_complete_destructor,
3855 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_NORMAL,
574cfaa4 3856 0, tf_warning_or_error);
ade3dc07
JM
3857 finish_decl_cleanup (NULL_TREE, expr);
3858 }
8d08fdba
MS
3859 }
3860}
3861
8d08fdba
MS
3862/* Build a C++ vector delete expression.
3863 MAXINDEX is the number of elements to be deleted.
3864 ELT_SIZE is the nominal size of each element in the vector.
3865 BASE is the expression that should yield the store to be deleted.
8d08fdba
MS
3866 This function expands (or synthesizes) these calls itself.
3867 AUTO_DELETE_VEC says whether the container (vector) should be deallocated.
8d08fdba
MS
3868
3869 This also calls delete for virtual baseclasses of elements of the vector.
3870
3871 Update: MAXINDEX is no longer needed. The size can be extracted from the
3872 start of the vector for pointers, and from the type for arrays. We still
3873 use MAXINDEX for arrays because it happens to already have one of the
3874 values we'd have to extract. (We could use MAXINDEX with pointers to
3875 confirm the size, and trap if the numbers differ; not clear that it'd
3876 be worth bothering.) */
e92cc029 3877
8d08fdba 3878tree
362efdc1 3879build_vec_delete (tree base, tree maxindex,
574cfaa4
JM
3880 special_function_kind auto_delete_vec,
3881 int use_global_delete, tsubst_flags_t complain)
8d08fdba 3882{
f30432d7 3883 tree type;
49b7aacb
JM
3884 tree rval;
3885 tree base_init = NULL_TREE;
8d08fdba 3886
f30432d7 3887 type = TREE_TYPE (base);
c407792d 3888
f30432d7 3889 if (TREE_CODE (type) == POINTER_TYPE)
8d08fdba
MS
3890 {
3891 /* Step back one from start of vector, and read dimension. */
834c6dff 3892 tree cookie_addr;
726a989a 3893 tree size_ptr_type = build_pointer_type (sizetype);
834c6dff 3894
6742d92b 3895 if (TREE_SIDE_EFFECTS (base))
49b7aacb
JM
3896 {
3897 base_init = get_target_expr (base);
3898 base = TARGET_EXPR_SLOT (base_init);
3899 }
708cae97 3900 type = strip_array_types (TREE_TYPE (type));
db3927fb
AH
3901 cookie_addr = fold_build1_loc (input_location, NEGATE_EXPR,
3902 sizetype, TYPE_SIZE_UNIT (sizetype));
5d49b6a7
RG
3903 cookie_addr = fold_build_pointer_plus (fold_convert (size_ptr_type, base),
3904 cookie_addr);
574cfaa4 3905 maxindex = cp_build_indirect_ref (cookie_addr, RO_NULL, complain);
8d08fdba 3906 }
f30432d7 3907 else if (TREE_CODE (type) == ARRAY_TYPE)
8d08fdba 3908 {
f4f206f4
KH
3909 /* Get the total number of things in the array, maxindex is a
3910 bad name. */
f30432d7 3911 maxindex = array_type_nelts_total (type);
834c6dff 3912 type = strip_array_types (type);
574cfaa4
JM
3913 base = cp_build_addr_expr (base, complain);
3914 if (base == error_mark_node)
3915 return error_mark_node;
6742d92b 3916 if (TREE_SIDE_EFFECTS (base))
49b7aacb
JM
3917 {
3918 base_init = get_target_expr (base);
3919 base = TARGET_EXPR_SLOT (base_init);
3920 }
8d08fdba
MS
3921 }
3922 else
3923 {
574cfaa4 3924 if (base != error_mark_node && !(complain & tf_error))
8251199e 3925 error ("type to vector delete is neither pointer or array type");
8d08fdba
MS
3926 return error_mark_node;
3927 }
8d08fdba 3928
49b7aacb 3929 rval = build_vec_delete_1 (base, maxindex, type, auto_delete_vec,
574cfaa4
JM
3930 use_global_delete, complain);
3931 if (base_init && rval != error_mark_node)
f293ce4b 3932 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), base_init, rval);
49b7aacb
JM
3933
3934 return rval;
8d08fdba 3935}