]> gcc.gnu.org Git - gcc.git/blame - gcc/cp/init.c
* unwind-libunwind.c (_Unwind_FindEnclosingFunction): New.
[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
1f5a253a 149 class. We do these in pre-order because we can't find the virtual
3461fba7
NS
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. */
dcf92453 207 init = build_constructor (type, NULL_TREE);
17bbb839
MM
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. */
dcf92453 239 init = build_constructor (type, NULL_TREE);
17bbb839
MM
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
1f5a253a
NS
667 in_base_initializer = 1;
668
2282d28d
MM
669 /* Initialize base classes. */
670 while (mem_inits
671 && TREE_CODE (TREE_PURPOSE (mem_inits)) != FIELD_DECL)
8d08fdba 672 {
2282d28d
MM
673 tree subobject = TREE_PURPOSE (mem_inits);
674 tree arguments = TREE_VALUE (mem_inits);
675
676 /* If these initializations are taking place in a copy
677 constructor, the base class should probably be explicitly
678 initialized. */
679 if (extra_warnings && !arguments
680 && DECL_COPY_CONSTRUCTOR_P (current_function_decl)
681 && TYPE_NEEDS_CONSTRUCTING (BINFO_TYPE (subobject)))
682 warning ("base class `%#T' should be explicitly initialized in the "
683 "copy constructor",
684 BINFO_TYPE (subobject));
685
686 /* If an explicit -- but empty -- initializer list was present,
687 treat it just like default initialization at this point. */
688 if (arguments == void_type_node)
689 arguments = NULL_TREE;
690
691 /* Initialize the base. */
692 if (TREE_VIA_VIRTUAL (subobject))
693 construct_virtual_base (subobject, arguments);
694 else
b7484fbe 695 {
2282d28d
MM
696 tree base_addr;
697
698 base_addr = build_base_path (PLUS_EXPR, current_class_ptr,
699 subobject, 1);
700 expand_aggr_init_1 (subobject, NULL_TREE,
701 build_indirect_ref (base_addr, NULL),
702 arguments,
b370501f 703 LOOKUP_NORMAL);
2282d28d 704 expand_cleanup_for_base (subobject, NULL_TREE);
8d08fdba 705 }
8d08fdba 706
2282d28d 707 mem_inits = TREE_CHAIN (mem_inits);
8d08fdba 708 }
1f5a253a 709 in_base_initializer = 0;
8d08fdba 710
2282d28d 711 /* Initialize the vptrs. */
cf2e003b 712 initialize_vtbl_ptrs (current_class_ptr);
1f5a253a 713
2282d28d
MM
714 /* Initialize the data members. */
715 while (mem_inits)
8d08fdba 716 {
2282d28d
MM
717 perform_member_init (TREE_PURPOSE (mem_inits),
718 TREE_VALUE (mem_inits));
719 mem_inits = TREE_CHAIN (mem_inits);
b7484fbe 720 }
8d08fdba
MS
721}
722
3ec6bad3
MM
723/* Returns the address of the vtable (i.e., the value that should be
724 assigned to the vptr) for BINFO. */
725
726static tree
727build_vtbl_address (binfo)
728 tree binfo;
729{
9965d119 730 tree binfo_for = binfo;
3ec6bad3
MM
731 tree vtbl;
732
9965d119
NS
733 if (BINFO_VPTR_INDEX (binfo) && TREE_VIA_VIRTUAL (binfo)
734 && BINFO_PRIMARY_P (binfo))
735 /* If this is a virtual primary base, then the vtable we want to store
736 is that for the base this is being used as the primary base of. We
737 can't simply skip the initialization, because we may be expanding the
738 inits of a subobject constructor where the virtual base layout
739 can be different. */
740 while (BINFO_PRIMARY_BASE_OF (binfo_for))
741 binfo_for = BINFO_PRIMARY_BASE_OF (binfo_for);
742
3ec6bad3
MM
743 /* Figure out what vtable BINFO's vtable is based on, and mark it as
744 used. */
9965d119 745 vtbl = get_vtbl_decl_for_binfo (binfo_for);
3ec6bad3
MM
746 assemble_external (vtbl);
747 TREE_USED (vtbl) = 1;
748
749 /* Now compute the address to use when initializing the vptr. */
9965d119 750 vtbl = BINFO_VTABLE (binfo_for);
3ec6bad3
MM
751 if (TREE_CODE (vtbl) == VAR_DECL)
752 {
753 vtbl = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (vtbl)), vtbl);
754 TREE_CONSTANT (vtbl) = 1;
755 }
756
757 return vtbl;
758}
759
8d08fdba
MS
760/* This code sets up the virtual function tables appropriate for
761 the pointer DECL. It is a one-ply initialization.
762
763 BINFO is the exact type that DECL is supposed to be. In
764 multiple inheritance, this might mean "C's A" if C : A, B. */
e92cc029 765
8926095f 766static void
7177d104
MS
767expand_virtual_init (binfo, decl)
768 tree binfo, decl;
8d08fdba 769{
8d08fdba 770 tree vtbl, vtbl_ptr;
3ec6bad3 771 tree vtt_index;
8d08fdba 772
3ec6bad3
MM
773 /* Compute the initializer for vptr. */
774 vtbl = build_vtbl_address (binfo);
775
3461fba7
NS
776 /* We may get this vptr from a VTT, if this is a subobject
777 constructor or subobject destructor. */
3ec6bad3
MM
778 vtt_index = BINFO_VPTR_INDEX (binfo);
779 if (vtt_index)
780 {
781 tree vtbl2;
782 tree vtt_parm;
783
784 /* Compute the value to use, when there's a VTT. */
e0fff4b3 785 vtt_parm = current_vtt_parm;
3ec6bad3
MM
786 vtbl2 = build (PLUS_EXPR,
787 TREE_TYPE (vtt_parm),
788 vtt_parm,
789 vtt_index);
790 vtbl2 = build1 (INDIRECT_REF, TREE_TYPE (vtbl), vtbl2);
791
792 /* The actual initializer is the VTT value only in the subobject
793 constructor. In maybe_clone_body we'll substitute NULL for
794 the vtt_parm in the case of the non-subobject constructor. */
795 vtbl = build (COND_EXPR,
796 TREE_TYPE (vtbl),
48f22ed2
JM
797 build (EQ_EXPR, boolean_type_node,
798 current_in_charge_parm, integer_zero_node),
3ec6bad3
MM
799 vtbl2,
800 vtbl);
801 }
70ae3201
MM
802
803 /* Compute the location of the vtpr. */
338d90b8
NS
804 vtbl_ptr = build_vfield_ref (build_indirect_ref (decl, NULL),
805 TREE_TYPE (binfo));
806 my_friendly_assert (vtbl_ptr != error_mark_node, 20010730);
8d08fdba 807
70ae3201 808 /* Assign the vtable to the vptr. */
6060a796 809 vtbl = convert_force (TREE_TYPE (vtbl_ptr), vtbl, 0);
f1dedc31 810 finish_expr_stmt (build_modify_expr (vtbl_ptr, NOP_EXPR, vtbl));
8d08fdba
MS
811}
812
f33e32a8
MM
813/* If an exception is thrown in a constructor, those base classes already
814 constructed must be destroyed. This function creates the cleanup
0b8a1e58 815 for BINFO, which has just been constructed. If FLAG is non-NULL,
838dfd8a 816 it is a DECL which is nonzero when this base needs to be
0b8a1e58 817 destroyed. */
f33e32a8
MM
818
819static void
0b8a1e58 820expand_cleanup_for_base (binfo, flag)
f33e32a8 821 tree binfo;
0b8a1e58 822 tree flag;
f33e32a8
MM
823{
824 tree expr;
825
834c6dff 826 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (BINFO_TYPE (binfo)))
f33e32a8
MM
827 return;
828
0b8a1e58 829 /* Call the destructor. */
4ba126e4
MM
830 expr = build_special_member_call (current_class_ref,
831 base_dtor_identifier,
832 NULL_TREE,
833 binfo,
834 LOOKUP_NORMAL | LOOKUP_NONVIRTUAL);
0b8a1e58
MM
835 if (flag)
836 expr = fold (build (COND_EXPR, void_type_node,
78ef5b89 837 c_common_truthvalue_conversion (flag),
0b8a1e58
MM
838 expr, integer_zero_node));
839
659e5a7a 840 finish_eh_cleanup (expr);
f33e32a8
MM
841}
842
2282d28d
MM
843/* Construct the virtual base-class VBASE passing the ARGUMENTS to its
844 constructor. */
e92cc029 845
8d08fdba 846static void
2282d28d 847construct_virtual_base (tree vbase, tree arguments)
8d08fdba 848{
2282d28d
MM
849 tree inner_if_stmt;
850 tree compound_stmt;
851 tree exp;
852 tree flag;
853
854 /* If there are virtual base classes with destructors, we need to
855 emit cleanups to destroy them if an exception is thrown during
856 the construction process. These exception regions (i.e., the
857 period during which the cleanups must occur) begin from the time
858 the construction is complete to the end of the function. If we
859 create a conditional block in which to initialize the
860 base-classes, then the cleanup region for the virtual base begins
861 inside a block, and ends outside of that block. This situation
862 confuses the sjlj exception-handling code. Therefore, we do not
863 create a single conditional block, but one for each
864 initialization. (That way the cleanup regions always begin
865 in the outer block.) We trust the back-end to figure out
866 that the FLAG will not change across initializations, and
867 avoid doing multiple tests. */
868 flag = TREE_CHAIN (DECL_ARGUMENTS (current_function_decl));
869 inner_if_stmt = begin_if_stmt ();
870 finish_if_stmt_cond (flag, inner_if_stmt);
871 compound_stmt = begin_compound_stmt (/*has_no_scope=*/1);
872
873 /* Compute the location of the virtual base. If we're
874 constructing virtual bases, then we must be the most derived
875 class. Therefore, we don't have to look up the virtual base;
876 we already know where it is. */
877 exp = build (PLUS_EXPR,
878 TREE_TYPE (current_class_ptr),
879 current_class_ptr,
880 fold (build1 (NOP_EXPR, TREE_TYPE (current_class_ptr),
881 BINFO_OFFSET (vbase))));
882 exp = build1 (NOP_EXPR,
883 build_pointer_type (BINFO_TYPE (vbase)),
884 exp);
885 exp = build1 (INDIRECT_REF, BINFO_TYPE (vbase), exp);
886
887 expand_aggr_init_1 (vbase, current_class_ref, exp,
888 arguments, LOOKUP_COMPLAIN);
889 finish_compound_stmt (/*has_no_scope=*/1, compound_stmt);
890 finish_then_clause (inner_if_stmt);
891 finish_if_stmt ();
892
893 expand_cleanup_for_base (vbase, flag);
8d08fdba
MS
894}
895
2ee887f2 896/* Find the context in which this FIELD can be initialized. */
e92cc029 897
2ee887f2
MS
898static tree
899initializing_context (field)
900 tree field;
901{
902 tree t = DECL_CONTEXT (field);
903
904 /* Anonymous union members can be initialized in the first enclosing
905 non-anonymous union context. */
6bdb8141 906 while (t && ANON_AGGR_TYPE_P (t))
2ee887f2
MS
907 t = TYPE_CONTEXT (t);
908 return t;
909}
910
8d08fdba
MS
911/* Function to give error message if member initialization specification
912 is erroneous. FIELD is the member we decided to initialize.
913 TYPE is the type for which the initialization is being performed.
72b7eeff 914 FIELD must be a member of TYPE.
8d08fdba
MS
915
916 MEMBER_NAME is the name of the member. */
917
918static int
919member_init_ok_or_else (field, type, member_name)
920 tree field;
921 tree type;
3f0a9b35 922 tree member_name;
8d08fdba
MS
923{
924 if (field == error_mark_node)
925 return 0;
a723baf1 926 if (!field)
8d08fdba 927 {
33bd39a2 928 error ("class `%T' does not have any field named `%D'", type,
a723baf1 929 member_name);
8d08fdba
MS
930 return 0;
931 }
a723baf1 932 if (TREE_CODE (field) == VAR_DECL)
b7484fbe 933 {
a723baf1
MM
934 error ("`%#D' is a static data member; it can only be "
935 "initialized at its definition",
936 field);
937 return 0;
938 }
939 if (TREE_CODE (field) != FIELD_DECL)
940 {
941 error ("`%#D' is not a non-static data member of `%T'",
942 field, type);
943 return 0;
944 }
945 if (initializing_context (field) != type)
946 {
947 error ("class `%T' does not have any field named `%D'", type,
948 member_name);
b7484fbe
MS
949 return 0;
950 }
951
8d08fdba
MS
952 return 1;
953}
954
2282d28d
MM
955/* NAME is a FIELD_DECL, an IDENTIFIER_NODE which names a field, or it
956 is a _TYPE node or TYPE_DECL which names a base for that type.
1f5a253a
NS
957 Check the validity of NAME, and return either the base _TYPE, base
958 binfo, or the FIELD_DECL of the member. If NAME is invalid, return
2282d28d 959 NULL_TREE and issue a diagnostic.
8d08fdba 960
36a68fe7
NS
961 An old style unnamed direct single base construction is permitted,
962 where NAME is NULL. */
8d08fdba 963
fd74ca0b 964tree
1f5a253a 965expand_member_init (tree name)
8d08fdba 966{
2282d28d
MM
967 tree basetype;
968 tree field;
8d08fdba 969
2282d28d 970 if (!current_class_ref)
fd74ca0b 971 return NULL_TREE;
8d08fdba 972
36a68fe7 973 if (!name)
90418208 974 {
36a68fe7
NS
975 /* This is an obsolete unnamed base class initializer. The
976 parser will already have warned about its use. */
2282d28d 977 switch (CLASSTYPE_N_BASECLASSES (current_class_type))
36a68fe7
NS
978 {
979 case 0:
33bd39a2 980 error ("unnamed initializer for `%T', which has no base classes",
2282d28d 981 current_class_type);
36a68fe7
NS
982 return NULL_TREE;
983 case 1:
2282d28d 984 basetype = TYPE_BINFO_BASETYPE (current_class_type, 0);
36a68fe7
NS
985 break;
986 default:
33bd39a2 987 error ("unnamed initializer for `%T', which uses multiple inheritance",
2282d28d 988 current_class_type);
36a68fe7
NS
989 return NULL_TREE;
990 }
90418208 991 }
36a68fe7 992 else if (TYPE_P (name))
be99da77 993 {
a82d6da5 994 basetype = TYPE_MAIN_VARIANT (name);
36a68fe7 995 name = TYPE_NAME (name);
be99da77 996 }
36a68fe7
NS
997 else if (TREE_CODE (name) == TYPE_DECL)
998 basetype = TYPE_MAIN_VARIANT (TREE_TYPE (name));
2282d28d
MM
999 else
1000 basetype = NULL_TREE;
8d08fdba 1001
36a68fe7 1002 if (basetype)
41efda8f 1003 {
2282d28d
MM
1004 tree binfo;
1005
36a68fe7 1006 if (current_template_parms)
1f5a253a 1007 return basetype;
2282d28d
MM
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 }
1f5a253a 1023 return binfo;
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 1032 if (member_init_ok_or_else (field, current_class_type, name))
1f5a253a 1033 return field;
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;
f4f4610e
MM
2157 tree true_type, size, rval, t;
2158 /* The type of the new-expression. (This type is always a pointer
2159 type.) */
2160 tree pointer_type;
2161 /* The type pointed to by POINTER_TYPE. */
2162 tree type;
2163 /* The type being allocated. For "new T[...]" this will be an
2164 ARRAY_TYPE. */
f30efcb7 2165 tree full_type;
f4f4610e
MM
2166 /* A pointer type pointing to to the FULL_TYPE. */
2167 tree full_pointer_type;
a48cccea 2168 tree outer_nelts = NULL_TREE;
a703fb38 2169 tree nelts = NULL_TREE;
f4f4610e
MM
2170 tree alloc_call, alloc_expr;
2171 /* The address returned by the call to "operator new". This node is
2172 a VAR_DECL and is therefore reusable. */
2173 tree alloc_node;
46ff5047 2174 tree alloc_fn;
a0d5fba7 2175 int has_array = 0;
834c6dff 2176 enum tree_code code;
089d6ea7 2177 int nothrow, check_new;
834c6dff
MM
2178 /* Nonzero if the user wrote `::new' rather than just `new'. */
2179 int globally_qualified_p;
743f140d 2180 int use_java_new = 0;
834c6dff
MM
2181 /* If non-NULL, the number of extra bytes to allocate at the
2182 beginning of the storage allocated for an array-new expression in
2183 order to store the number of elements. */
2184 tree cookie_size = NULL_TREE;
3f41ffd8
MM
2185 /* True if the function we are calling is a placement allocation
2186 function. */
2187 bool placement_allocation_fn_p;
4f649415 2188 tree args = NULL_TREE;
f4f4610e
MM
2189 /* True if the storage must be initialized, either by a constructor
2190 or due to an explicit new-intiailizer. */
2191 bool is_initialized;
2192 /* The address of the thing allocated, not including any cookie. In
2193 particular, if an array cookie is in use, DATA_ADDR is the
2194 address of the first array element. This node is a VAR_DECL, and
2195 is therefore reusable. */
2196 tree data_addr;
a0d5fba7
JM
2197
2198 placement = TREE_OPERAND (exp, 0);
2199 type = TREE_OPERAND (exp, 1);
2200 init = TREE_OPERAND (exp, 2);
834c6dff 2201 globally_qualified_p = NEW_EXPR_USE_GLOBAL (exp);
a0d5fba7
JM
2202
2203 if (TREE_CODE (type) == ARRAY_REF)
2204 {
2205 has_array = 1;
a48cccea 2206 nelts = outer_nelts = TREE_OPERAND (type, 1);
a0d5fba7 2207 type = TREE_OPERAND (type, 0);
f30efcb7 2208
a48cccea
JM
2209 /* Use an incomplete array type to avoid VLA headaches. */
2210 full_type = build_cplus_array_type (type, NULL_TREE);
a0d5fba7 2211 }
f30efcb7
JM
2212 else
2213 full_type = type;
2214
a0d5fba7
JM
2215 true_type = type;
2216
834c6dff
MM
2217 code = has_array ? VEC_NEW_EXPR : NEW_EXPR;
2218
8d08fdba
MS
2219 /* If our base type is an array, then make sure we know how many elements
2220 it has. */
2221 while (TREE_CODE (true_type) == ARRAY_TYPE)
2222 {
2223 tree this_nelts = array_type_nelts_top (true_type);
ab76ca54 2224 nelts = cp_build_binary_op (MULT_EXPR, nelts, this_nelts);
8d08fdba
MS
2225 true_type = TREE_TYPE (true_type);
2226 }
5566b478 2227
66543169 2228 if (!complete_type_or_else (true_type, exp))
8f259df3 2229 return error_mark_node;
5566b478 2230
cc600f33 2231 if (TREE_CODE (true_type) == VOID_TYPE)
e1cd6e56 2232 {
8251199e 2233 error ("invalid type `void' for new");
e1cd6e56
MS
2234 return error_mark_node;
2235 }
2236
a7a64a77
MM
2237 if (abstract_virtuals_error (NULL_TREE, true_type))
2238 return error_mark_node;
8926095f 2239
f4f4610e
MM
2240 is_initialized = (TYPE_NEEDS_CONSTRUCTING (type) || init);
2241 if (CP_TYPE_CONST_P (true_type) && !is_initialized)
2242 {
2243 error ("uninitialized const in `new' of `%#T'", true_type);
2244 return error_mark_node;
2245 }
2246
089d6ea7
MM
2247 size = size_in_bytes (true_type);
2248 if (has_array)
2249 size = size_binop (MULT_EXPR, size, convert (sizetype, nelts));
a28e3c7f 2250
e92cc029 2251 /* Allocate the object. */
9bfadf57 2252 if (! placement && TYPE_FOR_JAVA (true_type))
743f140d 2253 {
8c1bd4f5 2254 tree class_addr, alloc_decl;
743f140d
PB
2255 tree class_decl = build_java_class_ref (true_type);
2256 tree class_size = size_in_bytes (true_type);
8b60264b 2257 static const char alloc_name[] = "_Jv_AllocObject";
743f140d
PB
2258 use_java_new = 1;
2259 alloc_decl = IDENTIFIER_GLOBAL_VALUE (get_identifier (alloc_name));
2260 if (alloc_decl == NULL_TREE)
400500c4
RK
2261 fatal_error ("call to Java constructor with `%s' undefined",
2262 alloc_name);
2263
743f140d 2264 class_addr = build1 (ADDR_EXPR, jclass_node, class_decl);
96790071
JM
2265 alloc_call = (build_function_call
2266 (alloc_decl,
2267 tree_cons (NULL_TREE, class_addr,
2268 build_tree_list (NULL_TREE, class_size))));
743f140d 2269 }
8d08fdba
MS
2270 else
2271 {
834c6dff 2272 tree fnname;
834c6dff 2273
596ea4e5 2274 fnname = ansi_opname (code);
834c6dff 2275
089d6ea7
MM
2276 if (!globally_qualified_p
2277 && CLASS_TYPE_P (true_type)
2278 && (has_array
2279 ? TYPE_HAS_ARRAY_NEW_OPERATOR (true_type)
2280 : TYPE_HAS_NEW_OPERATOR (true_type)))
2281 {
2282 /* Use a class-specific operator new. */
2283 /* If a cookie is required, add some extra space. */
2284 if (has_array && TYPE_VEC_NEW_USES_COOKIE (true_type))
2285 {
2286 cookie_size = get_cookie_size (true_type);
2287 size = size_binop (PLUS_EXPR, size, cookie_size);
2288 }
2289 /* Create the argument list. */
2290 args = tree_cons (NULL_TREE, size, placement);
2291 /* Call the function. */
2292 alloc_call = build_method_call (build_dummy_object (true_type),
2293 fnname, args,
2294 TYPE_BINFO (true_type),
2295 LOOKUP_NORMAL);
2296 }
834c6dff 2297 else
089d6ea7
MM
2298 {
2299 /* Use a global operator new. */
125e6594
MM
2300 /* See if a cookie might be required. */
2301 if (has_array && TYPE_VEC_NEW_USES_COOKIE (true_type))
2302 cookie_size = get_cookie_size (true_type);
2303 else
2304 cookie_size = NULL_TREE;
2305
2306 alloc_call = build_operator_new_call (fnname, placement,
2307 &size, &cookie_size);
089d6ea7 2308 }
8d08fdba
MS
2309 }
2310
96790071 2311 if (alloc_call == error_mark_node)
2bb5d995
JM
2312 return error_mark_node;
2313
46ff5047
MM
2314 /* The ALLOC_CALL should be a CALL_EXPR -- or a COMPOUND_EXPR whose
2315 right-hand-side is ultimately a CALL_EXPR -- and the first
2316 operand should be the address of a known FUNCTION_DECL. */
2317 t = alloc_call;
2318 while (TREE_CODE (t) == COMPOUND_EXPR)
2319 t = TREE_OPERAND (t, 1);
2320 alloc_fn = get_callee_fndecl (t);
2321 my_friendly_assert (alloc_fn != NULL_TREE, 20020325);
089d6ea7 2322
3f41ffd8
MM
2323 /* Now, check to see if this function is actually a placement
2324 allocation function. This can happen even when PLACEMENT is NULL
2325 because we might have something like:
2326
2327 struct S { void* operator new (size_t, int i = 0); };
2328
2329 A call to `new S' will get this allocation function, even though
2330 there is no explicit placement argument. If there is more than
2331 one argument, or there are variable arguments, then this is a
2332 placement allocation function. */
2333 placement_allocation_fn_p
46ff5047
MM
2334 = (type_num_arguments (TREE_TYPE (alloc_fn)) > 1
2335 || varargs_function_p (alloc_fn));
96790071 2336
047f64a3
JM
2337 /* unless an allocation function is declared with an empty excep-
2338 tion-specification (_except.spec_), throw(), it indicates failure to
2339 allocate storage by throwing a bad_alloc exception (clause _except_,
2340 _lib.bad.alloc_); it returns a non-null pointer otherwise If the allo-
2341 cation function is declared with an empty exception-specification,
2342 throw(), it returns null to indicate failure to allocate storage and a
2343 non-null pointer otherwise.
2344
2345 So check for a null exception spec on the op new we just called. */
2346
46ff5047 2347 nothrow = TYPE_NOTHROW_P (TREE_TYPE (alloc_fn));
743f140d 2348 check_new = (flag_check_new || nothrow) && ! use_java_new;
047f64a3 2349
f4f4610e
MM
2350 /* In the simple case, we can stop now. */
2351 pointer_type = build_pointer_type (type);
2352 if (!cookie_size && !is_initialized)
2353 return build_nop (pointer_type, alloc_call);
f30efcb7
JM
2354
2355 /* While we're working, use a pointer to the type we've actually
f4f4610e
MM
2356 allocated. Store the result of the call in a variable so that we
2357 can use it more than once. */
2358 full_pointer_type = build_pointer_type (full_type);
2359 alloc_expr = get_target_expr (build_nop (full_pointer_type, alloc_call));
96790071 2360 alloc_node = TREE_OPERAND (alloc_expr, 0);
f4f4610e 2361 rval = NULL_TREE;
d18c083e 2362
089d6ea7 2363 if (cookie_size)
8d08fdba 2364 {
96790071 2365 tree cookie;
f4f4610e
MM
2366 tree cookie_expr;
2367
2368 /* Adjust so we're pointing to the start of the object. */
2369 data_addr = get_target_expr (build (PLUS_EXPR, full_pointer_type,
2370 alloc_node, cookie_size));
96790071 2371
834c6dff 2372 /* Store the number of bytes allocated so that we can know how
3461fba7
NS
2373 many elements to destroy later. We use the last sizeof
2374 (size_t) bytes to store the number of elements. */
1f84ec23 2375 cookie = build (MINUS_EXPR, build_pointer_type (sizetype),
f4f4610e 2376 data_addr, size_in_bytes (sizetype));
3e411c3f 2377 cookie = build_indirect_ref (cookie, NULL);
1f84ec23 2378
f4f4610e 2379 cookie_expr = build (MODIFY_EXPR, sizetype, cookie, nelts);
96790071 2380 TREE_SIDE_EFFECTS (cookie_expr) = 1;
f4f4610e
MM
2381 rval = build (COMPOUND_EXPR, void_type_node, data_addr, cookie_expr);
2382 data_addr = TREE_OPERAND (data_addr, 0);
8d08fdba 2383 }
96790071 2384 else
f4f4610e 2385 data_addr = alloc_node;
8d08fdba 2386
96790071 2387 /* Now initialize the allocated object. */
f4f4610e 2388 if (is_initialized)
8d08fdba 2389 {
f4f4610e
MM
2390 tree init_expr;
2391
2392 init_expr = build_indirect_ref (data_addr, NULL);
f30efcb7
JM
2393
2394 if (init == void_zero_node)
1cb8292f 2395 init = build_default_init (full_type, nelts);
f30efcb7 2396 else if (init && pedantic && has_array)
33bd39a2 2397 pedwarn ("ISO C++ forbids initialization in array new");
f30efcb7
JM
2398
2399 if (has_array)
a48cccea
JM
2400 init_expr
2401 = build_vec_init (init_expr,
2402 cp_build_binary_op (MINUS_EXPR, outer_nelts,
2403 integer_one_node),
2404 init, /*from_array=*/0);
f30efcb7 2405 else if (TYPE_NEEDS_CONSTRUCTING (type))
4ba126e4
MM
2406 init_expr = build_special_member_call (init_expr,
2407 complete_ctor_identifier,
2408 init, TYPE_BINFO (true_type),
2409 LOOKUP_NORMAL);
f30efcb7 2410 else
8d08fdba 2411 {
01240200
MM
2412 /* We are processing something like `new int (10)', which
2413 means allocate an int, and initialize it with 10. */
f30efcb7
JM
2414
2415 if (TREE_CODE (init) == TREE_LIST)
7215f9a0 2416 {
f30efcb7
JM
2417 if (TREE_CHAIN (init) != NULL_TREE)
2418 pedwarn
2419 ("initializer list being treated as compound expression");
2420 init = build_compound_expr (init);
2421 }
2422 else if (TREE_CODE (init) == CONSTRUCTOR
2423 && TREE_TYPE (init) == NULL_TREE)
2424 {
2425 pedwarn ("ISO C++ forbids aggregate initializer to new");
2426 init = digest_init (type, init, 0);
7215f9a0 2427 }
80170791 2428
f30efcb7 2429 init_expr = build_modify_expr (init_expr, INIT_EXPR, init);
96790071
JM
2430 }
2431
2432 if (init_expr == error_mark_node)
2433 return error_mark_node;
1f109f0f 2434
20c39572
JM
2435 /* If any part of the object initialization terminates by throwing an
2436 exception and a suitable deallocation function can be found, the
2437 deallocation function is called to free the memory in which the
2438 object was being constructed, after which the exception continues
2439 to propagate in the context of the new-expression. If no
2440 unambiguous matching deallocation function can be found,
2441 propagating the exception does not cause the object's memory to be
2442 freed. */
96790071 2443 if (flag_exceptions && ! use_java_new)
1f109f0f 2444 {
2face519 2445 enum tree_code dcode = has_array ? VEC_DELETE_EXPR : DELETE_EXPR;
96790071 2446 tree cleanup;
834c6dff
MM
2447 int flags = (LOOKUP_NORMAL
2448 | (globally_qualified_p * LOOKUP_GLOBAL));
a7d87521 2449
5355deec 2450 /* The Standard is unclear here, but the right thing to do
f4f4610e
MM
2451 is to use the same method for finding deallocation
2452 functions that we use for finding allocation functions. */
5355deec
AO
2453 flags |= LOOKUP_SPECULATIVELY;
2454
f4f4610e 2455 cleanup = build_op_delete_call (dcode, alloc_node, size, flags,
3f41ffd8
MM
2456 (placement_allocation_fn_p
2457 ? alloc_call : NULL_TREE));
2bb14213 2458
2face519
JM
2459 /* Ack! First we allocate the memory. Then we set our sentry
2460 variable to true, and expand a cleanup that deletes the memory
96790071
JM
2461 if sentry is true. Then we run the constructor, and finally
2462 clear the sentry.
2463
2464 It would be nice to be able to handle this without the sentry
2465 variable, perhaps with a TRY_CATCH_EXPR, but this doesn't
2466 work. We allocate the space first, so if there are any
2467 temporaries with cleanups in the constructor args we need this
2468 EH region to extend until end of full-expression to preserve
2469 nesting.
2470
2471 If the backend had some mechanism so that we could force the
2472 allocation to be expanded after all the other args to the
2473 constructor, that would fix the nesting problem and we could
2474 do away with this complexity. But that would complicate other
2475 things; in particular, it would make it difficult to bail out
8e51619a
JM
2476 if the allocation function returns null. Er, no, it wouldn't;
2477 we just don't run the constructor. The standard says it's
4977bab6
ZW
2478 unspecified whether or not the args are evaluated.
2479
2480 FIXME FIXME FIXME inline invisible refs as refs. That way we
2481 can preevaluate value parameters. */
2face519 2482
da4768fe
JM
2483 if (cleanup)
2484 {
96790071 2485 tree end, sentry, begin;
2face519
JM
2486
2487 begin = get_target_expr (boolean_true_node);
659e5a7a 2488 CLEANUP_EH_ONLY (begin) = 1;
2face519 2489
659e5a7a
JM
2490 sentry = TARGET_EXPR_SLOT (begin);
2491
2492 TARGET_EXPR_CLEANUP (begin)
2face519
JM
2493 = build (COND_EXPR, void_type_node, sentry,
2494 cleanup, void_zero_node);
2face519 2495
2face519
JM
2496 end = build (MODIFY_EXPR, TREE_TYPE (sentry),
2497 sentry, boolean_false_node);
2face519 2498
96790071
JM
2499 init_expr
2500 = build (COMPOUND_EXPR, void_type_node, begin,
2501 build (COMPOUND_EXPR, void_type_node, init_expr,
2502 end));
da4768fe 2503 }
1f109f0f 2504 }
d18c083e 2505
f4f4610e
MM
2506 if (rval)
2507 rval = build (COMPOUND_EXPR, TREE_TYPE (init_expr), rval, init_expr);
2508 else
2509 rval = init_expr;
2510 }
96790071 2511
f4f4610e 2512 rval = build (COMPOUND_EXPR, TREE_TYPE (alloc_node), rval, data_addr);
2face519 2513
f4f4610e 2514 if (check_new)
d18c083e 2515 {
f4f4610e
MM
2516 tree ifexp = cp_build_binary_op (NE_EXPR, alloc_node, integer_zero_node);
2517 rval = build_conditional_expr (ifexp, rval, alloc_node);
d18c083e
MS
2518 }
2519
f4f4610e
MM
2520 /* Perform the allocation before anything else, so that ALLOC_NODE
2521 has been initialized before we start using it. */
2522 rval = build (COMPOUND_EXPR, TREE_TYPE (rval), alloc_expr, rval);
51c184be 2523
f4f4610e
MM
2524 /* Convert to the final type. */
2525 return build_nop (pointer_type, rval);
8d08fdba
MS
2526}
2527\f
f30432d7 2528static tree
c7edeea3 2529build_vec_delete_1 (base, maxindex, type, auto_delete_vec, use_global_delete)
f30432d7 2530 tree base, maxindex, type;
86f45d2c 2531 special_function_kind auto_delete_vec;
f30432d7
MS
2532 int use_global_delete;
2533{
2534 tree virtual_size;
e92cc029 2535 tree ptype = build_pointer_type (type = complete_type (type));
f30432d7
MS
2536 tree size_exp = size_in_bytes (type);
2537
2538 /* Temporary variables used by the loop. */
2539 tree tbase, tbase_init;
2540
2541 /* This is the body of the loop that implements the deletion of a
2542 single element, and moves temp variables to next elements. */
2543 tree body;
2544
2545 /* This is the LOOP_EXPR that governs the deletion of the elements. */
2546 tree loop;
2547
2548 /* This is the thing that governs what to do after the loop has run. */
2549 tree deallocate_expr = 0;
2550
2551 /* This is the BIND_EXPR which holds the outermost iterator of the
2552 loop. It is convenient to set this variable up and test it before
2553 executing any other code in the loop.
2554 This is also the containing expression returned by this function. */
2555 tree controller = NULL_TREE;
2556
b2153b98
KL
2557 /* We should only have 1-D arrays here. */
2558 if (TREE_CODE (type) == ARRAY_TYPE)
2559 abort ();
2560
834c6dff 2561 if (! IS_AGGR_TYPE (type) || TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
f30432d7
MS
2562 {
2563 loop = integer_zero_node;
2564 goto no_destructor;
2565 }
2566
708cae97 2567 /* The below is short by the cookie size. */
fed3cef0
RK
2568 virtual_size = size_binop (MULT_EXPR, size_exp,
2569 convert (sizetype, maxindex));
f30432d7 2570
46e8c075 2571 tbase = create_temporary_var (ptype);
f30432d7
MS
2572 tbase_init = build_modify_expr (tbase, NOP_EXPR,
2573 fold (build (PLUS_EXPR, ptype,
2574 base,
2575 virtual_size)));
2576 DECL_REGISTER (tbase) = 1;
4dabb379 2577 controller = build (BIND_EXPR, void_type_node, tbase, NULL_TREE, NULL_TREE);
f30432d7 2578 TREE_SIDE_EFFECTS (controller) = 1;
f30432d7 2579
c7edeea3 2580 body = NULL_TREE;
f30432d7 2581
e1b3e07d 2582 body = tree_cons (NULL_TREE,
86f45d2c 2583 build_delete (ptype, tbase, sfk_complete_destructor,
f30432d7
MS
2584 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1),
2585 body);
2586
e1b3e07d 2587 body = tree_cons (NULL_TREE,
f30432d7
MS
2588 build_modify_expr (tbase, NOP_EXPR, build (MINUS_EXPR, ptype, tbase, size_exp)),
2589 body);
2590
e1b3e07d 2591 body = tree_cons (NULL_TREE,
f30432d7
MS
2592 build (EXIT_EXPR, void_type_node,
2593 build (EQ_EXPR, boolean_type_node, base, tbase)),
2594 body);
2595
2596 loop = build (LOOP_EXPR, void_type_node, build_compound_expr (body));
2597
e1b3e07d
MM
2598 loop = tree_cons (NULL_TREE, tbase_init,
2599 tree_cons (NULL_TREE, loop, NULL_TREE));
f30432d7
MS
2600 loop = build_compound_expr (loop);
2601
2602 no_destructor:
2603 /* If the delete flag is one, or anything else with the low bit set,
2604 delete the storage. */
86f45d2c
MM
2605 deallocate_expr = integer_zero_node;
2606 if (auto_delete_vec != sfk_base_destructor)
f30432d7
MS
2607 {
2608 tree base_tbd;
2609
708cae97 2610 /* The below is short by the cookie size. */
fed3cef0
RK
2611 virtual_size = size_binop (MULT_EXPR, size_exp,
2612 convert (sizetype, maxindex));
f30432d7
MS
2613
2614 if (! TYPE_VEC_NEW_USES_COOKIE (type))
2615 /* no header */
2616 base_tbd = base;
2617 else
2618 {
834c6dff
MM
2619 tree cookie_size;
2620
2621 cookie_size = get_cookie_size (type);
2622 base_tbd
2623 = cp_convert (ptype,
ab76ca54
MM
2624 cp_build_binary_op (MINUS_EXPR,
2625 cp_convert (string_type_node,
2626 base),
2627 cookie_size));
e92cc029 2628 /* True size with header. */
834c6dff 2629 virtual_size = size_binop (PLUS_EXPR, virtual_size, cookie_size);
f30432d7 2630 }
86f45d2c
MM
2631
2632 if (auto_delete_vec == sfk_deleting_destructor)
2633 deallocate_expr = build_x_delete (base_tbd,
2634 2 | use_global_delete,
2635 virtual_size);
f30432d7
MS
2636 }
2637
2638 if (loop && deallocate_expr != integer_zero_node)
2639 {
e1b3e07d
MM
2640 body = tree_cons (NULL_TREE, loop,
2641 tree_cons (NULL_TREE, deallocate_expr, NULL_TREE));
f30432d7
MS
2642 body = build_compound_expr (body);
2643 }
2644 else
2645 body = loop;
2646
2647 /* Outermost wrapper: If pointer is null, punt. */
37f88e3e
JM
2648 body = fold (build (COND_EXPR, void_type_node,
2649 fold (build (NE_EXPR, boolean_type_node, base,
2650 integer_zero_node)),
2651 body, integer_zero_node));
f30432d7
MS
2652 body = build1 (NOP_EXPR, void_type_node, body);
2653
2654 if (controller)
2655 {
2656 TREE_OPERAND (controller, 1) = body;
4e8dca1c 2657 body = controller;
f30432d7 2658 }
4e8dca1c
JM
2659
2660 if (TREE_CODE (base) == SAVE_EXPR)
2661 /* Pre-evaluate the SAVE_EXPR outside of the BIND_EXPR. */
2662 body = build (COMPOUND_EXPR, void_type_node, base, body);
2663
2664 return cp_convert (void_type_node, body);
f30432d7
MS
2665}
2666
c395453c
MM
2667/* Create an unnamed variable of the indicated TYPE. */
2668
f1dedc31
MM
2669tree
2670create_temporary_var (type)
8a72a046
MM
2671 tree type;
2672{
f1dedc31
MM
2673 tree decl;
2674
2675 decl = build_decl (VAR_DECL, NULL_TREE, type);
2676 TREE_USED (decl) = 1;
2677 DECL_ARTIFICIAL (decl) = 1;
82a98427 2678 DECL_SOURCE_LOCATION (decl) = input_location;
f1dedc31 2679 DECL_IGNORED_P (decl) = 1;
b35d4555 2680 DECL_CONTEXT (decl) = current_function_decl;
f1dedc31 2681
f1dedc31 2682 return decl;
8a72a046
MM
2683}
2684
f1dedc31
MM
2685/* Create a new temporary variable of the indicated TYPE, initialized
2686 to INIT.
8a72a046 2687
f1dedc31
MM
2688 It is not entered into current_binding_level, because that breaks
2689 things when it comes time to do final cleanups (which take place
2690 "outside" the binding contour of the function). */
2691
2692static tree
2693get_temp_regvar (type, init)
2694 tree type, init;
f30432d7 2695{
f1dedc31 2696 tree decl;
8a72a046 2697
f1dedc31 2698 decl = create_temporary_var (type);
24bef158
MM
2699 if (building_stmt_tree ())
2700 add_decl_stmt (decl);
4e8dca1c 2701 else
19e7881c 2702 SET_DECL_RTL (decl, assign_temp (type, 2, 0, 1));
f1dedc31 2703 finish_expr_stmt (build_modify_expr (decl, INIT_EXPR, init));
8a72a046 2704
f1dedc31 2705 return decl;
f30432d7
MS
2706}
2707
f1dedc31
MM
2708/* `build_vec_init' returns tree structure that performs
2709 initialization of a vector of aggregate types.
8d08fdba 2710
f30efcb7 2711 BASE is a reference to the vector, of ARRAY_TYPE.
a48cccea
JM
2712 MAXINDEX is the maximum index of the array (one less than the
2713 number of elements). It is only used if
2714 TYPE_DOMAIN (TREE_TYPE (BASE)) == NULL_TREE.
8d08fdba
MS
2715 INIT is the (possibly NULL) initializer.
2716
2717 FROM_ARRAY is 0 if we should init everything with INIT
2718 (i.e., every element initialized from INIT).
2719 FROM_ARRAY is 1 if we should index into INIT in parallel
2720 with initialization of DECL.
2721 FROM_ARRAY is 2 if we should index into INIT in parallel,
2722 but use assignment instead of initialization. */
2723
2724tree
a48cccea
JM
2725build_vec_init (base, maxindex, init, from_array)
2726 tree base, init, maxindex;
8d08fdba
MS
2727 int from_array;
2728{
2729 tree rval;
8a72a046 2730 tree base2 = NULL_TREE;
8d08fdba 2731 tree size;
e833cb11 2732 tree itype = NULL_TREE;
8a72a046 2733 tree iterator;
f30efcb7
JM
2734 /* The type of the array. */
2735 tree atype = TREE_TYPE (base);
f1dedc31 2736 /* The type of an element in the array. */
f30efcb7 2737 tree type = TREE_TYPE (atype);
f1dedc31
MM
2738 /* The type of a pointer to an element in the array. */
2739 tree ptype;
2740 tree stmt_expr;
2741 tree compound_stmt;
2742 int destroy_temps;
f5984164 2743 tree try_block = NULL_TREE;
486837a7 2744 tree try_body = NULL_TREE;
8a72a046 2745 int num_initialized_elts = 0;
8d08fdba 2746
a48cccea
JM
2747 if (TYPE_DOMAIN (atype))
2748 maxindex = array_type_nelts (atype);
2749
2750 if (maxindex == NULL_TREE || maxindex == error_mark_node)
8d08fdba
MS
2751 return error_mark_node;
2752
c8a3d889
AO
2753 if (init
2754 && (from_array == 2
2755 ? (!CLASS_TYPE_P (type) || !TYPE_HAS_COMPLEX_ASSIGN_REF (type))
2756 : !TYPE_NEEDS_CONSTRUCTING (type))
f30efcb7
JM
2757 && ((TREE_CODE (init) == CONSTRUCTOR
2758 /* Don't do this if the CONSTRUCTOR might contain something
2759 that might throw and require us to clean up. */
2760 && (CONSTRUCTOR_ELTS (init) == NULL_TREE
2761 || ! TYPE_HAS_NONTRIVIAL_DESTRUCTOR (target_type (type))))
2762 || from_array))
2763 {
2764 /* Do non-default initialization of POD arrays resulting from
2765 brace-enclosed initializers. In this case, digest_init and
2766 store_constructor will handle the semantics for us. */
2767
2768 stmt_expr = build (INIT_EXPR, atype, base, init);
f30efcb7
JM
2769 return stmt_expr;
2770 }
2771
2772 maxindex = cp_convert (ptrdiff_type_node, maxindex);
f1dedc31 2773 ptype = build_pointer_type (type);
8d08fdba 2774 size = size_in_bytes (type);
f30efcb7
JM
2775 if (TREE_CODE (TREE_TYPE (base)) == ARRAY_TYPE)
2776 base = cp_convert (ptype, default_conversion (base));
8d08fdba 2777
f1dedc31
MM
2778 /* The code we are generating looks like:
2779
2780 T* t1 = (T*) base;
f30efcb7 2781 T* rval = t1;
f1dedc31
MM
2782 ptrdiff_t iterator = maxindex;
2783 try {
4977bab6 2784 for (; iterator != -1; --iterator) {
f30efcb7
JM
2785 ... initialize *t1 ...
2786 ++t1;
4977bab6 2787 }
f1dedc31
MM
2788 } catch (...) {
2789 ... destroy elements that were constructed ...
2790 }
f30efcb7 2791 return rval;
f1dedc31
MM
2792
2793 We can omit the try and catch blocks if we know that the
2794 initialization will never throw an exception, or if the array
f30efcb7 2795 elements do not have destructors. We can omit the loop completely if
f1dedc31
MM
2796 the elements of the array do not have constructors.
2797
2798 We actually wrap the entire body of the above in a STMT_EXPR, for
2799 tidiness.
2800
2801 When copying from array to another, when the array elements have
2802 only trivial copy constructors, we should use __builtin_memcpy
2803 rather than generating a loop. That way, we could take advantage
2804 of whatever cleverness the back-end has for dealing with copies
2805 of blocks of memory. */
2806
2807 begin_init_stmts (&stmt_expr, &compound_stmt);
f2c5f623 2808 destroy_temps = stmts_are_full_exprs_p ();
ae499cce 2809 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
f30efcb7 2810 rval = get_temp_regvar (ptype, base);
f1dedc31 2811 base = get_temp_regvar (ptype, rval);
8a72a046 2812 iterator = get_temp_regvar (ptrdiff_type_node, maxindex);
8d08fdba 2813
8a72a046 2814 /* Protect the entire array initialization so that we can destroy
f30efcb7
JM
2815 the partially constructed array if an exception is thrown.
2816 But don't do this if we're assigning. */
2817 if (flag_exceptions && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
2818 && from_array != 2)
ed5511d9
MM
2819 {
2820 try_block = begin_try_block ();
2821 try_body = begin_compound_stmt (/*has_no_scope=*/1);
2822 }
8a72a046 2823
f30efcb7 2824 if (init != NULL_TREE && TREE_CODE (init) == CONSTRUCTOR)
8d08fdba 2825 {
f30efcb7
JM
2826 /* Do non-default initialization of non-POD arrays resulting from
2827 brace-enclosed initializers. */
8a72a046
MM
2828
2829 tree elts;
094fe153
JM
2830 from_array = 0;
2831
8a72a046 2832 for (elts = CONSTRUCTOR_ELTS (init); elts; elts = TREE_CHAIN (elts))
8d08fdba 2833 {
8a72a046 2834 tree elt = TREE_VALUE (elts);
f1dedc31 2835 tree baseref = build1 (INDIRECT_REF, type, base);
8d08fdba 2836
8a72a046 2837 num_initialized_elts++;
8d08fdba 2838
8a72a046 2839 if (IS_AGGR_TYPE (type) || TREE_CODE (type) == ARRAY_TYPE)
f1dedc31 2840 finish_expr_stmt (build_aggr_init (baseref, elt, 0));
8a72a046 2841 else
f1dedc31
MM
2842 finish_expr_stmt (build_modify_expr (baseref, NOP_EXPR,
2843 elt));
8a72a046 2844
f30efcb7
JM
2845 finish_expr_stmt (build_unary_op (PREINCREMENT_EXPR, base, 0));
2846 finish_expr_stmt (build_unary_op (PREDECREMENT_EXPR, iterator, 0));
8d08fdba 2847 }
8d08fdba 2848
8a72a046
MM
2849 /* Clear out INIT so that we don't get confused below. */
2850 init = NULL_TREE;
8d08fdba 2851 }
8a72a046 2852 else if (from_array)
8d08fdba 2853 {
8a72a046
MM
2854 /* If initializing one array from another, initialize element by
2855 element. We rely upon the below calls the do argument
2856 checking. */
8a72a046
MM
2857 if (init)
2858 {
2859 base2 = default_conversion (init);
2860 itype = TREE_TYPE (base2);
2861 base2 = get_temp_regvar (itype, base2);
2862 itype = TREE_TYPE (itype);
2863 }
2864 else if (TYPE_LANG_SPECIFIC (type)
2865 && TYPE_NEEDS_CONSTRUCTING (type)
2866 && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
2867 {
2868 error ("initializer ends prematurely");
2869 return error_mark_node;
2870 }
2871 }
8d08fdba 2872
8a72a046
MM
2873 /* Now, default-initialize any remaining elements. We don't need to
2874 do that if a) the type does not need constructing, or b) we've
094fe153
JM
2875 already initialized all the elements.
2876
2877 We do need to keep going if we're copying an array. */
2878
2879 if (from_array
2880 || (TYPE_NEEDS_CONSTRUCTING (type)
665f2503 2881 && ! (host_integerp (maxindex, 0)
05bccae2 2882 && (num_initialized_elts
665f2503 2883 == tree_low_cst (maxindex, 0) + 1))))
8a72a046 2884 {
37e05cd5 2885 /* If the ITERATOR is equal to -1, then we don't have to loop;
8a72a046 2886 we've already initialized all the elements. */
4977bab6
ZW
2887 tree for_stmt;
2888 tree for_body;
f1dedc31
MM
2889 tree elt_init;
2890
4977bab6
ZW
2891 for_stmt = begin_for_stmt ();
2892 finish_for_init_stmt (for_stmt);
2893 finish_for_cond (build (NE_EXPR, boolean_type_node,
2894 iterator, integer_minus_one_node),
2895 for_stmt);
2896 finish_for_expr (build_unary_op (PREDECREMENT_EXPR, iterator, 0),
2897 for_stmt);
8d08fdba 2898
8a72a046 2899 /* Otherwise, loop through the elements. */
4977bab6 2900 for_body = begin_compound_stmt (/*has_no_scope=*/1);
f1dedc31
MM
2901
2902 /* When we're not building a statement-tree, things are a little
2903 complicated. If, when we recursively call build_aggr_init,
2904 an expression containing a TARGET_EXPR is expanded, then it
2905 may get a cleanup. Then, the result of that expression is
2906 passed to finish_expr_stmt, which will call
2907 expand_start_target_temps/expand_end_target_temps. However,
2908 the latter call will not cause the cleanup to run because
2909 that block will still be on the block stack. So, we call
2910 expand_start_target_temps here manually; the corresponding
2911 call to expand_end_target_temps below will cause the cleanup
2912 to be performed. */
2913 if (!building_stmt_tree ())
2914 expand_start_target_temps ();
0fac6b0b 2915
8d08fdba
MS
2916 if (from_array)
2917 {
2918 tree to = build1 (INDIRECT_REF, type, base);
2919 tree from;
2920
2921 if (base2)
2922 from = build1 (INDIRECT_REF, itype, base2);
2923 else
2924 from = NULL_TREE;
2925
2926 if (from_array == 2)
f1dedc31 2927 elt_init = build_modify_expr (to, NOP_EXPR, from);
8d08fdba 2928 else if (TYPE_NEEDS_CONSTRUCTING (type))
f1dedc31 2929 elt_init = build_aggr_init (to, from, 0);
8d08fdba 2930 else if (from)
f1dedc31 2931 elt_init = build_modify_expr (to, NOP_EXPR, from);
8d08fdba 2932 else
a98facb0 2933 abort ();
8d08fdba
MS
2934 }
2935 else if (TREE_CODE (type) == ARRAY_TYPE)
2936 {
2937 if (init != 0)
f30efcb7
JM
2938 sorry
2939 ("cannot initialize multi-dimensional array with initializer");
2940 elt_init = build_vec_init (build1 (INDIRECT_REF, type, base),
a48cccea 2941 0, 0, 0);
f1dedc31
MM
2942 }
2943 else
2944 elt_init = build_aggr_init (build1 (INDIRECT_REF, type, base),
2945 init, 0);
2946
2947 /* The initialization of each array element is a
f30efcb7 2948 full-expression, as per core issue 124. */
f1dedc31
MM
2949 if (!building_stmt_tree ())
2950 {
35b1567d 2951 genrtl_expr_stmt (elt_init);
f1dedc31 2952 expand_end_target_temps ();
8d08fdba
MS
2953 }
2954 else
f1dedc31 2955 {
ae499cce 2956 current_stmt_tree ()->stmts_are_full_exprs_p = 1;
f1dedc31 2957 finish_expr_stmt (elt_init);
ae499cce 2958 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
f1dedc31 2959 }
8d08fdba 2960
f30efcb7 2961 finish_expr_stmt (build_unary_op (PREINCREMENT_EXPR, base, 0));
8d08fdba 2962 if (base2)
f30efcb7 2963 finish_expr_stmt (build_unary_op (PREINCREMENT_EXPR, base2, 0));
0fac6b0b 2964
4977bab6
ZW
2965 finish_compound_stmt (/*has_no_scope=*/1, for_body);
2966 finish_for_stmt (for_stmt);
8d08fdba 2967 }
8a72a046
MM
2968
2969 /* Make sure to cleanup any partially constructed elements. */
f30efcb7
JM
2970 if (flag_exceptions && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
2971 && from_array != 2)
f1dedc31
MM
2972 {
2973 tree e;
b2153b98
KL
2974 tree m = cp_build_binary_op (MINUS_EXPR, maxindex, iterator);
2975
2976 /* Flatten multi-dimensional array since build_vec_delete only
2977 expects one-dimensional array. */
2978 if (TREE_CODE (type) == ARRAY_TYPE)
2979 {
2980 m = cp_build_binary_op (MULT_EXPR, m,
2981 array_type_nelts_total (type));
2982 type = strip_array_types (type);
2983 }
8d08fdba 2984
ed5511d9
MM
2985 finish_compound_stmt (/*has_no_scope=*/1, try_body);
2986 finish_cleanup_try_block (try_block);
b2153b98 2987 e = build_vec_delete_1 (rval, m,
f1dedc31 2988 type,
86f45d2c 2989 sfk_base_destructor,
f1dedc31 2990 /*use_global_delete=*/0);
f1dedc31
MM
2991 finish_cleanup (e, try_block);
2992 }
2993
f1dedc31
MM
2994 /* The value of the array initialization is the address of the
2995 first element in the array. */
2996 finish_expr_stmt (rval);
2997
2998 stmt_expr = finish_init_stmts (stmt_expr, compound_stmt);
ae499cce 2999 current_stmt_tree ()->stmts_are_full_exprs_p = destroy_temps;
f1dedc31 3000 return stmt_expr;
8d08fdba
MS
3001}
3002
3003/* Free up storage of type TYPE, at address ADDR.
3004
3005 TYPE is a POINTER_TYPE and can be ptr_type_node for no special type
3006 of pointer.
3007
3008 VIRTUAL_SIZE is the amount of storage that was allocated, and is
3009 used as the second argument to operator delete. It can include
3010 things like padding and magic size cookies. It has virtual in it,
3011 because if you have a base pointer and you delete through a virtual
3012 destructor, it should be the size of the dynamic object, not the
cab1f180 3013 static object, see Free Store 12.5 ISO C++.
8d08fdba
MS
3014
3015 This does not call any destructors. */
e92cc029 3016
8d08fdba 3017tree
b370501f
KG
3018build_x_delete (addr, which_delete, virtual_size)
3019 tree addr;
a28e3c7f 3020 int which_delete;
8d08fdba
MS
3021 tree virtual_size;
3022{
a28e3c7f
MS
3023 int use_global_delete = which_delete & 1;
3024 int use_vec_delete = !!(which_delete & 2);
a28e3c7f 3025 enum tree_code code = use_vec_delete ? VEC_DELETE_EXPR : DELETE_EXPR;
da4768fe 3026 int flags = LOOKUP_NORMAL | (use_global_delete * LOOKUP_GLOBAL);
8d08fdba 3027
519ebd1e 3028 return build_op_delete_call (code, addr, virtual_size, flags, NULL_TREE);
8d08fdba
MS
3029}
3030
86f45d2c
MM
3031/* Call the DTOR_KIND destructor for EXP. FLAGS are as for
3032 build_delete. */
298d6f60
MM
3033
3034static tree
86f45d2c 3035build_dtor_call (exp, dtor_kind, flags)
298d6f60 3036 tree exp;
86f45d2c 3037 special_function_kind dtor_kind;
298d6f60
MM
3038 int flags;
3039{
86f45d2c
MM
3040 tree name;
3041
3042 switch (dtor_kind)
3043 {
3044 case sfk_complete_destructor:
3045 name = complete_dtor_identifier;
3046 break;
3047
3048 case sfk_base_destructor:
3049 name = base_dtor_identifier;
3050 break;
3051
3052 case sfk_deleting_destructor:
3053 name = deleting_dtor_identifier;
3054 break;
3055
3056 default:
a98facb0 3057 abort ();
86f45d2c 3058 }
4ba126e4
MM
3059 return build_method_call (exp, name, NULL_TREE,
3060 TYPE_BINFO (TREE_TYPE (exp)), flags);
298d6f60
MM
3061}
3062
8d08fdba
MS
3063/* Generate a call to a destructor. TYPE is the type to cast ADDR to.
3064 ADDR is an expression which yields the store to be destroyed.
86f45d2c
MM
3065 AUTO_DELETE is the name of the destructor to call, i.e., either
3066 sfk_complete_destructor, sfk_base_destructor, or
3067 sfk_deleting_destructor.
8d08fdba
MS
3068
3069 FLAGS is the logical disjunction of zero or more LOOKUP_
ade3dc07 3070 flags. See cp-tree.h for more info. */
e92cc029 3071
8d08fdba
MS
3072tree
3073build_delete (type, addr, auto_delete, flags, use_global_delete)
3074 tree type, addr;
86f45d2c 3075 special_function_kind auto_delete;
8d08fdba
MS
3076 int flags;
3077 int use_global_delete;
3078{
8d08fdba 3079 tree expr;
8d08fdba
MS
3080
3081 if (addr == error_mark_node)
3082 return error_mark_node;
3083
3084 /* Can happen when CURRENT_EXCEPTION_OBJECT gets its type
3085 set to `error_mark_node' before it gets properly cleaned up. */
3086 if (type == error_mark_node)
3087 return error_mark_node;
3088
3089 type = TYPE_MAIN_VARIANT (type);
3090
3091 if (TREE_CODE (type) == POINTER_TYPE)
3092 {
2986ae00 3093 type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
8d08fdba
MS
3094 if (TREE_CODE (type) == ARRAY_TYPE)
3095 goto handle_array;
23b4deba
AO
3096
3097 if (VOID_TYPE_P (type)
3098 /* We don't want to warn about delete of void*, only other
3099 incomplete types. Deleting other incomplete types
3100 invokes undefined behavior, but it is not ill-formed, so
3101 compile to something that would even do The Right Thing
3102 (TM) should the type have a trivial dtor and no delete
3103 operator. */
3104 || !complete_type_or_diagnostic (type, addr, 1)
3105 || !IS_AGGR_TYPE (type))
8d08fdba
MS
3106 {
3107 /* Call the builtin operator delete. */
c787dd82 3108 return build_builtin_delete_call (addr);
8d08fdba
MS
3109 }
3110 if (TREE_SIDE_EFFECTS (addr))
3111 addr = save_expr (addr);
2986ae00
MS
3112
3113 /* throw away const and volatile on target type of addr */
6060a796 3114 addr = convert_force (build_pointer_type (type), addr, 0);
8d08fdba
MS
3115 }
3116 else if (TREE_CODE (type) == ARRAY_TYPE)
3117 {
3118 handle_array:
6742d92b 3119
c407792d
RK
3120 if (TYPE_DOMAIN (type) == NULL_TREE)
3121 {
8251199e 3122 error ("unknown array size in delete");
c407792d
RK
3123 return error_mark_node;
3124 }
8d08fdba 3125 return build_vec_delete (addr, array_type_nelts (type),
c7edeea3 3126 auto_delete, use_global_delete);
8d08fdba
MS
3127 }
3128 else
3129 {
3130 /* Don't check PROTECT here; leave that decision to the
3131 destructor. If the destructor is accessible, call it,
3132 else report error. */
3133 addr = build_unary_op (ADDR_EXPR, addr, 0);
3134 if (TREE_SIDE_EFFECTS (addr))
3135 addr = save_expr (addr);
3136
60696c53 3137 addr = convert_force (build_pointer_type (type), addr, 0);
8d08fdba
MS
3138 }
3139
3140 my_friendly_assert (IS_AGGR_TYPE (type), 220);
3141
834c6dff 3142 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
8d08fdba 3143 {
60696c53 3144 if (auto_delete != sfk_deleting_destructor)
8d08fdba
MS
3145 return void_zero_node;
3146
da4768fe 3147 return build_op_delete_call
ea793912 3148 (DELETE_EXPR, addr, cxx_sizeof_nowarn (type),
519ebd1e
JM
3149 LOOKUP_NORMAL | (use_global_delete * LOOKUP_GLOBAL),
3150 NULL_TREE);
8d08fdba 3151 }
ade3dc07 3152 else
8d08fdba 3153 {
700f8a87 3154 tree do_delete = NULL_TREE;
bd6dd845 3155 tree ifexp;
700f8a87 3156
ade3dc07
JM
3157 my_friendly_assert (TYPE_HAS_DESTRUCTOR (type), 20011213);
3158
52682a1b
MM
3159 /* For `::delete x', we must not use the deleting destructor
3160 since then we would not be sure to get the global `operator
3161 delete'. */
86f45d2c 3162 if (use_global_delete && auto_delete == sfk_deleting_destructor)
700f8a87 3163 {
1b4a93f7
MM
3164 /* We will use ADDR multiple times so we must save it. */
3165 addr = save_expr (addr);
c6002625 3166 /* Delete the object. */
86f45d2c
MM
3167 do_delete = build_builtin_delete_call (addr);
3168 /* Otherwise, treat this like a complete object destructor
3169 call. */
3170 auto_delete = sfk_complete_destructor;
700f8a87 3171 }
52682a1b
MM
3172 /* If the destructor is non-virtual, there is no deleting
3173 variant. Instead, we must explicitly call the appropriate
3174 `operator delete' here. */
3175 else if (!DECL_VIRTUAL_P (CLASSTYPE_DESTRUCTORS (type))
3176 && auto_delete == sfk_deleting_destructor)
3177 {
1b4a93f7
MM
3178 /* We will use ADDR multiple times so we must save it. */
3179 addr = save_expr (addr);
3180 /* Build the call. */
52682a1b
MM
3181 do_delete = build_op_delete_call (DELETE_EXPR,
3182 addr,
ea793912 3183 cxx_sizeof_nowarn (type),
52682a1b
MM
3184 LOOKUP_NORMAL,
3185 NULL_TREE);
3186 /* Call the complete object destructor. */
3187 auto_delete = sfk_complete_destructor;
3188 }
e3fe84e5
JM
3189 else if (auto_delete == sfk_deleting_destructor
3190 && TYPE_GETS_REG_DELETE (type))
3191 {
3192 /* Make sure we have access to the member op delete, even though
3193 we'll actually be calling it from the destructor. */
ea793912 3194 build_op_delete_call (DELETE_EXPR, addr, cxx_sizeof_nowarn (type),
e3fe84e5
JM
3195 LOOKUP_NORMAL, NULL_TREE);
3196 }
8d08fdba 3197
3e411c3f 3198 expr = build_dtor_call (build_indirect_ref (addr, NULL),
1b4a93f7 3199 auto_delete, flags);
bd6dd845
MS
3200 if (do_delete)
3201 expr = build (COMPOUND_EXPR, void_type_node, expr, do_delete);
9e9ff709 3202
bd6dd845
MS
3203 if (flags & LOOKUP_DESTRUCTOR)
3204 /* Explicit destructor call; don't check for null pointer. */
3205 ifexp = integer_one_node;
8d08fdba 3206 else
bd6dd845 3207 /* Handle deleting a null pointer. */
ab76ca54 3208 ifexp = fold (cp_build_binary_op (NE_EXPR, addr, integer_zero_node));
8d08fdba 3209
bd6dd845
MS
3210 if (ifexp != integer_one_node)
3211 expr = build (COND_EXPR, void_type_node,
3212 ifexp, expr, void_zero_node);
8d08fdba 3213
8d08fdba
MS
3214 return expr;
3215 }
ade3dc07 3216}
8d08fdba 3217
ade3dc07
JM
3218/* At the beginning of a destructor, push cleanups that will call the
3219 destructors for our base classes and members.
2a2480e1 3220
a29e1034 3221 Called from begin_destructor_body. */
8d08fdba 3222
ade3dc07
JM
3223void
3224push_base_cleanups ()
3225{
3226 tree binfos;
3227 int i, n_baseclasses;
3228 tree member;
3229 tree expr;
8d08fdba 3230
ade3dc07
JM
3231 /* Run destructors for all virtual baseclasses. */
3232 if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
3233 {
3234 tree vbases;
3235 tree cond = (condition_conversion
3236 (build (BIT_AND_EXPR, integer_type_node,
3237 current_in_charge_parm,
3238 integer_two_node)));
8d08fdba 3239
ade3dc07
JM
3240 vbases = CLASSTYPE_VBASECLASSES (current_class_type);
3241 /* The CLASSTYPE_VBASECLASSES list is in initialization
3242 order, which is also the right order for pushing cleanups. */
3243 for (; vbases;
3244 vbases = TREE_CHAIN (vbases))
8d08fdba 3245 {
ade3dc07
JM
3246 tree vbase = TREE_VALUE (vbases);
3247 tree base_type = BINFO_TYPE (vbase);
3248
3249 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (base_type))
8d08fdba 3250 {
4ba126e4
MM
3251 expr = build_special_member_call (current_class_ref,
3252 base_dtor_identifier,
3253 NULL_TREE,
3254 vbase,
3255 (LOOKUP_NORMAL
3256 | LOOKUP_NONVIRTUAL));
ade3dc07
JM
3257 expr = build (COND_EXPR, void_type_node, cond,
3258 expr, void_zero_node);
3259 finish_decl_cleanup (NULL_TREE, expr);
8d08fdba
MS
3260 }
3261 }
ade3dc07
JM
3262 }
3263
3264 binfos = BINFO_BASETYPES (TYPE_BINFO (current_class_type));
3265 n_baseclasses = CLASSTYPE_N_BASECLASSES (current_class_type);
8d08fdba 3266
ade3dc07
JM
3267 /* Take care of the remaining baseclasses. */
3268 for (i = 0; i < n_baseclasses; i++)
3269 {
3270 tree base_binfo = TREE_VEC_ELT (binfos, i);
3271 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo))
3272 || TREE_VIA_VIRTUAL (base_binfo))
3273 continue;
3274
4ba126e4
MM
3275 expr = build_special_member_call (current_class_ref,
3276 base_dtor_identifier,
3277 NULL_TREE, base_binfo,
3278 LOOKUP_NORMAL | LOOKUP_NONVIRTUAL);
ade3dc07
JM
3279 finish_decl_cleanup (NULL_TREE, expr);
3280 }
3281
3282 for (member = TYPE_FIELDS (current_class_type); member;
3283 member = TREE_CHAIN (member))
3284 {
17bbb839 3285 if (TREE_CODE (member) != FIELD_DECL || DECL_ARTIFICIAL (member))
ade3dc07
JM
3286 continue;
3287 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (member)))
3288 {
50ad9642
MM
3289 tree this_member = (build_class_member_access_expr
3290 (current_class_ref, member,
3291 /*access_path=*/NULL_TREE,
3292 /*preserve_reference=*/false));
ade3dc07
JM
3293 tree this_type = TREE_TYPE (member);
3294 expr = build_delete (this_type, this_member,
3295 sfk_complete_destructor,
3296 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_NORMAL,
3297 0);
3298 finish_decl_cleanup (NULL_TREE, expr);
3299 }
8d08fdba
MS
3300 }
3301}
3302
3303/* For type TYPE, delete the virtual baseclass objects of DECL. */
3304
3305tree
3306build_vbase_delete (type, decl)
3307 tree type, decl;
3308{
3309 tree vbases = CLASSTYPE_VBASECLASSES (type);
3310 tree result = NULL_TREE;
3311 tree addr = build_unary_op (ADDR_EXPR, decl, 0);
3312
3313 my_friendly_assert (addr != error_mark_node, 222);
3314
3315 while (vbases)
3316 {
a55583e9
MM
3317 tree this_addr
3318 = convert_force (build_pointer_type (BINFO_TYPE (TREE_VALUE (vbases))),
3319 addr, 0);
e1b3e07d 3320 result = tree_cons (NULL_TREE,
8d08fdba 3321 build_delete (TREE_TYPE (this_addr), this_addr,
86f45d2c 3322 sfk_base_destructor,
8d08fdba
MS
3323 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 0),
3324 result);
3325 vbases = TREE_CHAIN (vbases);
3326 }
3327 return build_compound_expr (nreverse (result));
3328}
3329
3330/* Build a C++ vector delete expression.
3331 MAXINDEX is the number of elements to be deleted.
3332 ELT_SIZE is the nominal size of each element in the vector.
3333 BASE is the expression that should yield the store to be deleted.
8d08fdba
MS
3334 This function expands (or synthesizes) these calls itself.
3335 AUTO_DELETE_VEC says whether the container (vector) should be deallocated.
8d08fdba
MS
3336
3337 This also calls delete for virtual baseclasses of elements of the vector.
3338
3339 Update: MAXINDEX is no longer needed. The size can be extracted from the
3340 start of the vector for pointers, and from the type for arrays. We still
3341 use MAXINDEX for arrays because it happens to already have one of the
3342 values we'd have to extract. (We could use MAXINDEX with pointers to
3343 confirm the size, and trap if the numbers differ; not clear that it'd
3344 be worth bothering.) */
e92cc029 3345
8d08fdba 3346tree
c7edeea3 3347build_vec_delete (base, maxindex, auto_delete_vec, use_global_delete)
5566b478 3348 tree base, maxindex;
86f45d2c 3349 special_function_kind auto_delete_vec;
a28e3c7f 3350 int use_global_delete;
8d08fdba 3351{
f30432d7 3352 tree type;
8d08fdba 3353
c407792d
RK
3354 if (TREE_CODE (base) == OFFSET_REF)
3355 base = resolve_offset_ref (base);
3356
f30432d7 3357 type = TREE_TYPE (base);
c407792d 3358
8d08fdba
MS
3359 base = stabilize_reference (base);
3360
f30432d7 3361 if (TREE_CODE (type) == POINTER_TYPE)
8d08fdba
MS
3362 {
3363 /* Step back one from start of vector, and read dimension. */
834c6dff
MM
3364 tree cookie_addr;
3365
6742d92b
NS
3366 if (TREE_SIDE_EFFECTS (base))
3367 base = save_expr (base);
708cae97 3368 type = strip_array_types (TREE_TYPE (type));
1f84ec23
MM
3369 cookie_addr = build (MINUS_EXPR,
3370 build_pointer_type (sizetype),
3371 base,
3372 TYPE_SIZE_UNIT (sizetype));
3e411c3f 3373 maxindex = build_indirect_ref (cookie_addr, NULL);
8d08fdba 3374 }
f30432d7 3375 else if (TREE_CODE (type) == ARRAY_TYPE)
8d08fdba
MS
3376 {
3377 /* get the total number of things in the array, maxindex is a bad name */
f30432d7 3378 maxindex = array_type_nelts_total (type);
834c6dff 3379 type = strip_array_types (type);
8d08fdba 3380 base = build_unary_op (ADDR_EXPR, base, 1);
6742d92b
NS
3381 if (TREE_SIDE_EFFECTS (base))
3382 base = save_expr (base);
8d08fdba
MS
3383 }
3384 else
3385 {
9e9ff709 3386 if (base != error_mark_node)
8251199e 3387 error ("type to vector delete is neither pointer or array type");
8d08fdba
MS
3388 return error_mark_node;
3389 }
8d08fdba 3390
c7edeea3 3391 return build_vec_delete_1 (base, maxindex, type, auto_delete_vec,
f30432d7 3392 use_global_delete);
8d08fdba 3393}
This page took 1.735088 seconds and 5 git commands to generate.