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