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