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