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