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