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