]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cp/init.c
scalar-return-1_main.c: New file.
[thirdparty/gcc.git] / gcc / cp / init.c
CommitLineData
8d08fdba 1/* Handle initialization things in C++.
d6a8bdff 2 Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
dbbf88d1 3 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
8d08fdba
MS
4 Contributed by Michael Tiemann (tiemann@cygnus.com)
5
f5adbb8d 6This file is part of GCC.
8d08fdba 7
f5adbb8d 8GCC is free software; you can redistribute it and/or modify
8d08fdba
MS
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation; either version 2, or (at your option)
11any later version.
12
f5adbb8d 13GCC is distributed in the hope that it will be useful,
8d08fdba
MS
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
f5adbb8d 19along with GCC; see the file COPYING. If not, write to
e9fa0c7c
RK
20the Free Software Foundation, 59 Temple Place - Suite 330,
21Boston, MA 02111-1307, USA. */
8d08fdba 22
e92cc029 23/* High-level class interface. */
8d08fdba
MS
24
25#include "config.h"
8d052bc7 26#include "system.h"
4977bab6
ZW
27#include "coretypes.h"
28#include "tm.h"
8d08fdba
MS
29#include "tree.h"
30#include "rtl.h"
8f17b5c5 31#include "expr.h"
8d08fdba
MS
32#include "cp-tree.h"
33#include "flags.h"
e8abc66f 34#include "output.h"
eb66be0e 35#include "except.h"
54f92bfb 36#include "toplev.h"
8d08fdba 37
2282d28d 38static void construct_virtual_base (tree, tree);
158991b7
KG
39static void expand_aggr_init_1 PARAMS ((tree, tree, tree, tree, int));
40static void expand_default_init PARAMS ((tree, tree, tree, tree, int));
86f45d2c 41static tree build_vec_delete_1 PARAMS ((tree, tree, tree, special_function_kind, int));
2282d28d 42static void perform_member_init (tree, tree);
158991b7 43static tree build_builtin_delete_call PARAMS ((tree));
3f0a9b35 44static int member_init_ok_or_else PARAMS ((tree, tree, tree));
158991b7 45static void expand_virtual_init PARAMS ((tree, tree));
2282d28d 46static tree sort_mem_initializers (tree, tree);
158991b7 47static tree initializing_context PARAMS ((tree));
158991b7
KG
48static void expand_cleanup_for_base PARAMS ((tree, tree));
49static tree get_temp_regvar PARAMS ((tree, tree));
50static tree dfs_initialize_vtbl_ptrs PARAMS ((tree, void *));
1cb8292f 51static tree build_default_init PARAMS ((tree, tree));
834c6dff
MM
52static tree build_new_1 PARAMS ((tree));
53static tree get_cookie_size PARAMS ((tree));
86f45d2c 54static tree build_dtor_call PARAMS ((tree, special_function_kind, int));
ff9f1a5d 55static tree build_field_list PARAMS ((tree, tree, int *));
3ec6bad3 56static tree build_vtbl_address PARAMS ((tree));
8d08fdba 57
3dbc07b6
MM
58/* We are about to generate some complex initialization code.
59 Conceptually, it is all a single expression. However, we may want
60 to include conditionals, loops, and other such statement-level
61 constructs. Therefore, we build the initialization code inside a
62 statement-expression. This function starts such an expression.
63 STMT_EXPR_P and COMPOUND_STMT_P are filled in by this function;
64 pass them back to finish_init_stmts when the expression is
65 complete. */
66
67void
68begin_init_stmts (stmt_expr_p, compound_stmt_p)
69 tree *stmt_expr_p;
70 tree *compound_stmt_p;
71{
35b1567d
BC
72 if (building_stmt_tree ())
73 *stmt_expr_p = begin_stmt_expr ();
74 else
596fd31c 75 *stmt_expr_p = begin_global_stmt_expr ();
35b1567d
BC
76
77 if (building_stmt_tree ())
78 *compound_stmt_p = begin_compound_stmt (/*has_no_scope=*/1);
3dbc07b6
MM
79}
80
81/* Finish out the statement-expression begun by the previous call to
82 begin_init_stmts. Returns the statement-expression itself. */
83
84tree
85finish_init_stmts (stmt_expr, compound_stmt)
86 tree stmt_expr;
87 tree compound_stmt;
3dbc07b6 88
35b1567d
BC
89{
90 if (building_stmt_tree ())
91 finish_compound_stmt (/*has_no_scope=*/1, compound_stmt);
35b1567d
BC
92
93 if (building_stmt_tree ())
b2123dc0
MM
94 {
95 stmt_expr = finish_stmt_expr (stmt_expr);
96 STMT_EXPR_NO_SCOPE (stmt_expr) = true;
97 }
35b1567d 98 else
596fd31c 99 stmt_expr = finish_global_stmt_expr (stmt_expr);
35b1567d 100
3dbc07b6
MM
101 /* To avoid spurious warnings about unused values, we set
102 TREE_USED. */
103 if (stmt_expr)
104 TREE_USED (stmt_expr) = 1;
105
106 return stmt_expr;
107}
108
109/* Constructors */
110
338d90b8
NS
111/* Called from initialize_vtbl_ptrs via dfs_walk. BINFO is the base
112 which we want to initialize the vtable pointer for, DATA is
113 TREE_LIST whose TREE_VALUE is the this ptr expression. */
7177d104 114
d569399b
MM
115static tree
116dfs_initialize_vtbl_ptrs (binfo, data)
117 tree binfo;
118 void *data;
119{
9965d119 120 if ((!BINFO_PRIMARY_P (binfo) || TREE_VIA_VIRTUAL (binfo))
d569399b
MM
121 && CLASSTYPE_VFIELDS (BINFO_TYPE (binfo)))
122 {
123 tree base_ptr = TREE_VALUE ((tree) data);
7177d104 124
338d90b8 125 base_ptr = build_base_path (PLUS_EXPR, base_ptr, binfo, /*nonnull=*/1);
d569399b
MM
126
127 expand_virtual_init (binfo, base_ptr);
128 }
7177d104 129
dbbf88d1 130 BINFO_MARKED (binfo) = 1;
d569399b
MM
131
132 return NULL_TREE;
133}
134
cf2e003b
MM
135/* Initialize all the vtable pointers in the object pointed to by
136 ADDR. */
e92cc029 137
8d08fdba 138void
cf2e003b 139initialize_vtbl_ptrs (addr)
d569399b 140 tree addr;
8d08fdba 141{
cf2e003b
MM
142 tree list;
143 tree type;
144
145 type = TREE_TYPE (TREE_TYPE (addr));
146 list = build_tree_list (type, addr);
d569399b 147
bbd15aac 148 /* Walk through the hierarchy, initializing the vptr in each base
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. */
78757caa 1665 perform_or_defer_access_check (basebinfo, t);
fc378698 1666 mark_used (t);
848b92e1
JM
1667 if (DECL_STATIC_FUNCTION_P (t))
1668 return t;
19420d00
NS
1669 t = build (OFFSET_REF, TREE_TYPE (t), decl, t);
1670 PTRMEM_OK_P (t) = 1;
1671 return t;
8d08fdba
MS
1672 }
1673
05e0b2f4 1674 TREE_TYPE (fnfields) = unknown_type_node;
19420d00
NS
1675
1676 t = build (OFFSET_REF, unknown_type_node, decl, fnfields);
1677 PTRMEM_OK_P (t) = 1;
1678 return t;
8d08fdba
MS
1679 }
1680
d6479fe7 1681 t = member;
8d08fdba
MS
1682
1683 if (t == NULL_TREE)
1684 {
33bd39a2 1685 error ("`%D' is not a member of type `%T'", name, type);
8d08fdba
MS
1686 return error_mark_node;
1687 }
1688
1689 if (TREE_CODE (t) == TYPE_DECL)
1690 {
51c184be
MS
1691 TREE_USED (t) = 1;
1692 return t;
8d08fdba
MS
1693 }
1694 /* static class members and class-specific enum
1695 values can be returned without further ado. */
1696 if (TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == CONST_DECL)
1697 {
72b7eeff 1698 mark_used (t);
42976354 1699 return convert_from_reference (t);
8d08fdba
MS
1700 }
1701
162bc98d 1702 if (TREE_CODE (t) == FIELD_DECL && DECL_C_BIT_FIELD (t))
b7484fbe 1703 {
0e339752 1704 error ("invalid pointer to bit-field `%D'", t);
b7484fbe
MS
1705 return error_mark_node;
1706 }
1707
8d08fdba 1708 /* static class functions too. */
be99da77
MS
1709 if (TREE_CODE (t) == FUNCTION_DECL
1710 && TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
a98facb0 1711 abort ();
8d08fdba 1712
be99da77
MS
1713 /* In member functions, the form `type::name' is no longer
1714 equivalent to `this->type::name', at least not until
1715 resolve_offset_ref. */
19420d00
NS
1716 t = build (OFFSET_REF, build_offset_type (type, TREE_TYPE (t)), decl, t);
1717 PTRMEM_OK_P (t) = 1;
1718 return t;
8d08fdba
MS
1719}
1720
8d08fdba
MS
1721/* If a OFFSET_REF made it through to here, then it did
1722 not have its address taken. */
1723
1724tree
1725resolve_offset_ref (exp)
1726 tree exp;
1727{
1728 tree type = TREE_TYPE (exp);
1729 tree base = NULL_TREE;
1730 tree member;
1731 tree basetype, addr;
1732
4ac14744
MS
1733 if (TREE_CODE (exp) == OFFSET_REF)
1734 {
1735 member = TREE_OPERAND (exp, 1);
1736 base = TREE_OPERAND (exp, 0);
1737 }
1738 else
8d08fdba
MS
1739 {
1740 my_friendly_assert (TREE_CODE (type) == OFFSET_TYPE, 214);
1741 if (TYPE_OFFSET_BASETYPE (type) != current_class_type)
1742 {
8251199e 1743 error ("object missing in use of pointer-to-member construct");
8d08fdba
MS
1744 return error_mark_node;
1745 }
1746 member = exp;
1747 type = TREE_TYPE (type);
4ac14744 1748 base = current_class_ref;
8d08fdba
MS
1749 }
1750
67804825 1751 if (BASELINK_P (member) || TREE_CODE (member) == TEMPLATE_ID_EXPR)
19420d00
NS
1752 return build_unary_op (ADDR_EXPR, exp, 0);
1753
05e0b2f4
JM
1754 if (TREE_CODE (TREE_TYPE (member)) == METHOD_TYPE)
1755 {
19420d00
NS
1756 if (!flag_ms_extensions)
1757 /* A single non-static member, make sure we don't allow a
1758 pointer-to-member. */
1759 exp = ovl_cons (member, NULL_TREE);
1760
05e0b2f4
JM
1761 return build_unary_op (ADDR_EXPR, exp, 0);
1762 }
67804825 1763
8d08fdba 1764 if ((TREE_CODE (member) == VAR_DECL
162bc98d
JM
1765 && ! TYPE_PTRMEMFUNC_P (TREE_TYPE (member))
1766 && ! TYPE_PTRMEM_P (TREE_TYPE (member)))
a359be75 1767 || TREE_CODE (TREE_TYPE (member)) == FUNCTION_TYPE)
8d08fdba
MS
1768 {
1769 /* These were static members. */
dffd7eb6 1770 if (!cxx_mark_addressable (member))
8d08fdba
MS
1771 return error_mark_node;
1772 return member;
1773 }
1774
faf5394a
MS
1775 if (TREE_CODE (TREE_TYPE (member)) == POINTER_TYPE
1776 && TREE_CODE (TREE_TYPE (TREE_TYPE (member))) == METHOD_TYPE)
1777 return member;
1778
8d08fdba
MS
1779 /* Syntax error can cause a member which should
1780 have been seen as static to be grok'd as non-static. */
4ac14744 1781 if (TREE_CODE (member) == FIELD_DECL && current_class_ref == NULL_TREE)
8d08fdba 1782 {
3aac3c2f
MM
1783 cp_error_at ("member `%D' is non-static but referenced as a static member",
1784 member);
1785 error ("at this point in file");
8d08fdba
MS
1786 return error_mark_node;
1787 }
1788
1789 /* The first case is really just a reference to a member of `this'. */
1790 if (TREE_CODE (member) == FIELD_DECL
51924768 1791 && (base == current_class_ref || is_dummy_object (base)))
8d08fdba 1792 {
a29e1034 1793 tree binfo = NULL_TREE;
aa52c1ff
JM
1794
1795 /* Try to get to basetype from 'this'; if that doesn't work,
1796 nothing will. */
1797 base = current_class_ref;
1798
1799 /* First convert to the intermediate base specified, if appropriate. */
8d08fdba 1800 if (TREE_CODE (exp) == OFFSET_REF && TREE_CODE (type) == OFFSET_TYPE)
a29e1034 1801 base = build_scoped_ref (base, TYPE_OFFSET_BASETYPE (type), &binfo);
097955f2 1802
50ad9642
MM
1803 return build_class_member_access_expr (base, member,
1804 /*access_path=*/NULL_TREE,
1805 /*preserve_reference=*/false);
8d08fdba
MS
1806 }
1807
f49422da 1808 /* Ensure that we have an object. */
51924768 1809 if (is_dummy_object (base))
f49422da
MS
1810 addr = error_mark_node;
1811 else
5bb1b569
MM
1812 /* If this is a reference to a member function, then return the
1813 address of the member function (which may involve going
1814 through the object's vtable), otherwise, return an expression
1815 for the dereferenced pointer-to-member construct. */
1816 addr = build_unary_op (ADDR_EXPR, base, 0);
8d08fdba 1817
162bc98d 1818 if (TYPE_PTRMEM_P (TREE_TYPE (member)))
8d08fdba 1819 {
f49422da
MS
1820 if (addr == error_mark_node)
1821 {
33bd39a2 1822 error ("object missing in `%E'", exp);
f49422da
MS
1823 return error_mark_node;
1824 }
1825
162bc98d 1826 basetype = TYPE_OFFSET_BASETYPE (TREE_TYPE (TREE_TYPE (member)));
338d90b8
NS
1827 basetype = lookup_base (TREE_TYPE (TREE_TYPE (addr)),
1828 basetype, ba_check, NULL);
1829 addr = build_base_path (PLUS_EXPR, addr, basetype, 1);
1830
162bc98d 1831 member = cp_convert (ptrdiff_type_node, member);
051e6fd7 1832
f893c16e
JM
1833 addr = build (PLUS_EXPR, build_pointer_type (type), addr, member);
1834 return build_indirect_ref (addr, 0);
8d08fdba
MS
1835 }
1836 else if (TYPE_PTRMEMFUNC_P (TREE_TYPE (member)))
1837 {
b7484fbe 1838 return get_member_function_from_ptrfunc (&addr, member);
8d08fdba 1839 }
a98facb0 1840 abort ();
8d08fdba
MS
1841 /* NOTREACHED */
1842 return NULL_TREE;
1843}
1844
fc611ce0
MM
1845/* If DECL is a `const' declaration, and its value is a known
1846 constant, then return that value. */
8d08fdba
MS
1847
1848tree
1849decl_constant_value (decl)
1850 tree decl;
1851{
fc611ce0
MM
1852 if (TREE_READONLY_DECL_P (decl)
1853 && ! TREE_THIS_VOLATILE (decl)
61a127b3 1854 && DECL_INITIAL (decl)
bd6dd845 1855 && DECL_INITIAL (decl) != error_mark_node
8d08fdba
MS
1856 /* This is invalid if initial value is not constant.
1857 If it has either a function call, a memory reference,
1858 or a variable, then re-evaluating it could give different results. */
1859 && TREE_CONSTANT (DECL_INITIAL (decl))
1860 /* Check for cases where this is sub-optimal, even though valid. */
61a127b3 1861 && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR)
8d08fdba
MS
1862 return DECL_INITIAL (decl);
1863 return decl;
1864}
1865\f
8d08fdba
MS
1866/* Common subroutines of build_new and build_vec_delete. */
1867
c787dd82 1868/* Call the global __builtin_delete to delete ADDR. */
8d08fdba 1869
bd6dd845 1870static tree
c787dd82
JM
1871build_builtin_delete_call (addr)
1872 tree addr;
8d08fdba 1873{
a6ecf8b6 1874 mark_used (global_delete_fndecl);
0c11ada6 1875 return build_call (global_delete_fndecl, build_tree_list (NULL_TREE, addr));
8d08fdba
MS
1876}
1877\f
1878/* Generate a C++ "new" expression. DECL is either a TREE_LIST
1879 (which needs to go through some sort of groktypename) or it
1880 is the name of the class we are newing. INIT is an initialization value.
1881 It is either an EXPRLIST, an EXPR_NO_COMMAS, or something in braces.
1882 If INIT is void_type_node, it means do *not* call a constructor
1883 for this instance.
1884
1885 For types with constructors, the data returned is initialized
1886 by the appropriate constructor.
1887
1888 Whether the type has a constructor or not, if it has a pointer
1889 to a virtual function table, then that pointer is set up
1890 here.
1891
1892 Unless I am mistaken, a call to new () will return initialized
1893 data regardless of whether the constructor itself is private or
8926095f 1894 not. NOPE; new fails if the constructor is private (jcm).
8d08fdba
MS
1895
1896 Note that build_new does nothing to assure that any special
1897 alignment requirements of the type are met. Rather, it leaves
1898 it up to malloc to do the right thing. Otherwise, folding to
1899 the right alignment cal cause problems if the user tries to later
1900 free the memory returned by `new'.
1901
1902 PLACEMENT is the `placement' list for user-defined operator new (). */
1903
1904tree
1905build_new (placement, decl, init, use_global_new)
1906 tree placement;
1907 tree decl, init;
1908 int use_global_new;
1909{
a0d5fba7 1910 tree type, rval;
a703fb38 1911 tree nelts = NULL_TREE, t;
8926095f 1912 int has_array = 0;
8d08fdba 1913
8d08fdba
MS
1914 if (decl == error_mark_node)
1915 return error_mark_node;
1916
1917 if (TREE_CODE (decl) == TREE_LIST)
1918 {
1919 tree absdcl = TREE_VALUE (decl);
1920 tree last_absdcl = NULL_TREE;
8d08fdba
MS
1921
1922 if (current_function_decl
1923 && DECL_CONSTRUCTOR_P (current_function_decl))
2aa3110a 1924 my_friendly_assert (immediate_size_expand == 0, 19990926);
8d08fdba
MS
1925
1926 nelts = integer_one_node;
1927
1928 if (absdcl && TREE_CODE (absdcl) == CALL_EXPR)
a98facb0 1929 abort ();
8d08fdba
MS
1930 while (absdcl && TREE_CODE (absdcl) == INDIRECT_REF)
1931 {
1932 last_absdcl = absdcl;
1933 absdcl = TREE_OPERAND (absdcl, 0);
1934 }
1935
1936 if (absdcl && TREE_CODE (absdcl) == ARRAY_REF)
1937 {
1938 /* probably meant to be a vec new */
1939 tree this_nelts;
1940
51c184be
MS
1941 while (TREE_OPERAND (absdcl, 0)
1942 && TREE_CODE (TREE_OPERAND (absdcl, 0)) == ARRAY_REF)
1943 {
1944 last_absdcl = absdcl;
1945 absdcl = TREE_OPERAND (absdcl, 0);
1946 }
1947
8d08fdba
MS
1948 has_array = 1;
1949 this_nelts = TREE_OPERAND (absdcl, 1);
1950 if (this_nelts != error_mark_node)
1951 {
1952 if (this_nelts == NULL_TREE)
8251199e 1953 error ("new of array type fails to specify size");
5156628f 1954 else if (processing_template_decl)
5566b478
MS
1955 {
1956 nelts = this_nelts;
1957 absdcl = TREE_OPERAND (absdcl, 0);
1958 }
8d08fdba
MS
1959 else
1960 {
12fa82db 1961 if (build_expr_type_conversion (WANT_INT | WANT_ENUM,
b746c5dc 1962 this_nelts, false)
6a8f78d5
JM
1963 == NULL_TREE)
1964 pedwarn ("size in array new must have integral type");
1965
37c46b43 1966 this_nelts = save_expr (cp_convert (sizetype, this_nelts));
8d08fdba
MS
1967 absdcl = TREE_OPERAND (absdcl, 0);
1968 if (this_nelts == integer_zero_node)
1969 {
8251199e 1970 warning ("zero size array reserves no space");
8d08fdba
MS
1971 nelts = integer_zero_node;
1972 }
1973 else
ab76ca54 1974 nelts = cp_build_binary_op (MULT_EXPR, nelts, this_nelts);
8d08fdba
MS
1975 }
1976 }
1977 else
1978 nelts = integer_zero_node;
1979 }
1980
1981 if (last_absdcl)
1982 TREE_OPERAND (last_absdcl, 0) = absdcl;
1983 else
1984 TREE_VALUE (decl) = absdcl;
1985
a0d5fba7 1986 type = groktypename (decl);
8926095f 1987 if (! type || type == error_mark_node)
2aa3110a 1988 return error_mark_node;
8d08fdba
MS
1989 }
1990 else if (TREE_CODE (decl) == IDENTIFIER_NODE)
1991 {
1992 if (IDENTIFIER_HAS_TYPE_VALUE (decl))
1993 {
1994 /* An aggregate type. */
1995 type = IDENTIFIER_TYPE_VALUE (decl);
d2e5ee5c 1996 decl = TYPE_MAIN_DECL (type);
8d08fdba
MS
1997 }
1998 else
1999 {
2000 /* A builtin type. */
2001 decl = lookup_name (decl, 1);
2002 my_friendly_assert (TREE_CODE (decl) == TYPE_DECL, 215);
2003 type = TREE_TYPE (decl);
2004 }
8d08fdba
MS
2005 }
2006 else if (TREE_CODE (decl) == TYPE_DECL)
2007 {
2008 type = TREE_TYPE (decl);
8d08fdba
MS
2009 }
2010 else
2011 {
2012 type = decl;
d2e5ee5c 2013 decl = TYPE_MAIN_DECL (type);
8d08fdba
MS
2014 }
2015
5156628f 2016 if (processing_template_decl)
5566b478 2017 {
5566b478 2018 if (has_array)
a09ba2e0
MM
2019 t = tree_cons (tree_cons (NULL_TREE, type, NULL_TREE),
2020 build_min_nt (ARRAY_REF, NULL_TREE, nelts),
2021 NULL_TREE);
5566b478
MS
2022 else
2023 t = type;
2024
c006d942
MM
2025 rval = build_min (NEW_EXPR, build_pointer_type (type),
2026 placement, t, init);
5566b478
MS
2027 NEW_EXPR_USE_GLOBAL (rval) = use_global_new;
2028 return rval;
2029 }
2030
8926095f
MS
2031 /* ``A reference cannot be created by the new operator. A reference
2032 is not an object (8.2.2, 8.4.3), so a pointer to it could not be
2033 returned by new.'' ARM 5.3.3 */
2034 if (TREE_CODE (type) == REFERENCE_TYPE)
8d08fdba 2035 {
8251199e 2036 error ("new cannot be applied to a reference type");
a0d5fba7 2037 type = TREE_TYPE (type);
8d08fdba
MS
2038 }
2039
b7484fbe
MS
2040 if (TREE_CODE (type) == FUNCTION_TYPE)
2041 {
8251199e 2042 error ("new cannot be applied to a function type");
b7484fbe
MS
2043 return error_mark_node;
2044 }
2045
8926095f
MS
2046 /* When the object being created is an array, the new-expression yields a
2047 pointer to the initial element (if any) of the array. For example,
2048 both new int and new int[10] return an int*. 5.3.4. */
2049 if (TREE_CODE (type) == ARRAY_TYPE && has_array == 0)
8d08fdba 2050 {
8926095f
MS
2051 nelts = array_type_nelts_top (type);
2052 has_array = 1;
a0d5fba7 2053 type = TREE_TYPE (type);
8d08fdba
MS
2054 }
2055
a0d5fba7
JM
2056 if (has_array)
2057 t = build_nt (ARRAY_REF, type, nelts);
2058 else
2059 t = type;
2060
2061 rval = build (NEW_EXPR, build_pointer_type (type), placement, t, init);
2062 NEW_EXPR_USE_GLOBAL (rval) = use_global_new;
2063 TREE_SIDE_EFFECTS (rval) = 1;
b3ab27f3
MM
2064 rval = build_new_1 (rval);
2065 if (rval == error_mark_node)
2066 return error_mark_node;
a0d5fba7
JM
2067
2068 /* Wrap it in a NOP_EXPR so warn_if_unused_value doesn't complain. */
2069 rval = build1 (NOP_EXPR, TREE_TYPE (rval), rval);
2070 TREE_NO_UNUSED_WARNING (rval) = 1;
2071
a0d5fba7
JM
2072 return rval;
2073}
2074
c6002625 2075/* Given a Java class, return a decl for the corresponding java.lang.Class. */
743f140d 2076
e97f22c9 2077tree
743f140d
PB
2078build_java_class_ref (type)
2079 tree type;
2080{
ae0ed63a 2081 tree name = NULL_TREE, class_decl;
d1a458c4
TT
2082 static tree CL_suffix = NULL_TREE;
2083 if (CL_suffix == NULL_TREE)
2084 CL_suffix = get_identifier("class$");
743f140d
PB
2085 if (jclass_node == NULL_TREE)
2086 {
400500c4 2087 jclass_node = IDENTIFIER_GLOBAL_VALUE (get_identifier ("jclass"));
743f140d 2088 if (jclass_node == NULL_TREE)
400500c4
RK
2089 fatal_error ("call to Java constructor, while `jclass' undefined");
2090
743f140d
PB
2091 jclass_node = TREE_TYPE (jclass_node);
2092 }
23d4e4cc 2093
3461fba7 2094 /* Mangle the class$ field */
1f84ec23
MM
2095 {
2096 tree field;
2097 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
2098 if (DECL_NAME (field) == CL_suffix)
2099 {
92643fea
MM
2100 mangle_decl (field);
2101 name = DECL_ASSEMBLER_NAME (field);
1f84ec23
MM
2102 break;
2103 }
2104 if (!field)
1f978f5f 2105 internal_error ("can't find class$");
23d4e4cc 2106 }
23d4e4cc 2107
743f140d
PB
2108 class_decl = IDENTIFIER_GLOBAL_VALUE (name);
2109 if (class_decl == NULL_TREE)
2110 {
743f140d
PB
2111 class_decl = build_decl (VAR_DECL, name, TREE_TYPE (jclass_node));
2112 TREE_STATIC (class_decl) = 1;
2113 DECL_EXTERNAL (class_decl) = 1;
2114 TREE_PUBLIC (class_decl) = 1;
2115 DECL_ARTIFICIAL (class_decl) = 1;
2116 DECL_IGNORED_P (class_decl) = 1;
2117 pushdecl_top_level (class_decl);
3e411c3f 2118 make_decl_rtl (class_decl, NULL);
743f140d
PB
2119 }
2120 return class_decl;
2121}
2122
d1a458c4 2123/* Returns the size of the cookie to use when allocating an array
834c6dff
MM
2124 whose elements have the indicated TYPE. Assumes that it is already
2125 known that a cookie is needed. */
2126
2127static tree
2128get_cookie_size (type)
2129 tree type;
2130{
2131 tree cookie_size;
2132
3461fba7
NS
2133 /* We need to allocate an additional max (sizeof (size_t), alignof
2134 (true_type)) bytes. */
1f84ec23
MM
2135 tree sizetype_size;
2136 tree type_align;
2137
2138 sizetype_size = size_in_bytes (sizetype);
2139 type_align = size_int (TYPE_ALIGN_UNIT (type));
2140 if (INT_CST_LT_UNSIGNED (type_align, sizetype_size))
2141 cookie_size = sizetype_size;
834c6dff 2142 else
1f84ec23 2143 cookie_size = type_align;
834c6dff
MM
2144
2145 return cookie_size;
2146}
2147
a0d5fba7
JM
2148/* Called from cplus_expand_expr when expanding a NEW_EXPR. The return
2149 value is immediately handed to expand_expr. */
2150
834c6dff 2151static tree
a0d5fba7
JM
2152build_new_1 (exp)
2153 tree exp;
2154{
56c5d8bf 2155 tree placement, init;
f4f4610e
MM
2156 tree true_type, size, rval, t;
2157 /* The type of the new-expression. (This type is always a pointer
2158 type.) */
2159 tree pointer_type;
2160 /* The type pointed to by POINTER_TYPE. */
2161 tree type;
2162 /* The type being allocated. For "new T[...]" this will be an
2163 ARRAY_TYPE. */
f30efcb7 2164 tree full_type;
f4f4610e
MM
2165 /* A pointer type pointing to to the FULL_TYPE. */
2166 tree full_pointer_type;
a48cccea 2167 tree outer_nelts = NULL_TREE;
a703fb38 2168 tree nelts = NULL_TREE;
f4f4610e
MM
2169 tree alloc_call, alloc_expr;
2170 /* The address returned by the call to "operator new". This node is
2171 a VAR_DECL and is therefore reusable. */
2172 tree alloc_node;
46ff5047 2173 tree alloc_fn;
8b5e2ce4 2174 tree cookie_expr, init_expr;
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));
8b5e2ce4 2360 alloc_node = TARGET_EXPR_SLOT (alloc_expr);
d18c083e 2361
089d6ea7 2362 if (cookie_size)
8d08fdba 2363 {
96790071 2364 tree cookie;
f4f4610e
MM
2365
2366 /* Adjust so we're pointing to the start of the object. */
2367 data_addr = get_target_expr (build (PLUS_EXPR, full_pointer_type,
2368 alloc_node, cookie_size));
96790071 2369
834c6dff 2370 /* Store the number of bytes allocated so that we can know how
3461fba7
NS
2371 many elements to destroy later. We use the last sizeof
2372 (size_t) bytes to store the number of elements. */
1f84ec23 2373 cookie = build (MINUS_EXPR, build_pointer_type (sizetype),
f4f4610e 2374 data_addr, size_in_bytes (sizetype));
3e411c3f 2375 cookie = build_indirect_ref (cookie, NULL);
1f84ec23 2376
f4f4610e 2377 cookie_expr = build (MODIFY_EXPR, sizetype, cookie, nelts);
8b5e2ce4 2378 data_addr = TARGET_EXPR_SLOT (data_addr);
8d08fdba 2379 }
96790071 2380 else
8b5e2ce4
JM
2381 {
2382 cookie_expr = NULL_TREE;
2383 data_addr = alloc_node;
2384 }
8d08fdba 2385
96790071 2386 /* Now initialize the allocated object. */
f4f4610e 2387 if (is_initialized)
8d08fdba 2388 {
f4f4610e 2389 init_expr = build_indirect_ref (data_addr, NULL);
f30efcb7
JM
2390
2391 if (init == void_zero_node)
1cb8292f 2392 init = build_default_init (full_type, nelts);
f30efcb7 2393 else if (init && pedantic && has_array)
33bd39a2 2394 pedwarn ("ISO C++ forbids initialization in array new");
f30efcb7
JM
2395
2396 if (has_array)
a48cccea
JM
2397 init_expr
2398 = build_vec_init (init_expr,
2399 cp_build_binary_op (MINUS_EXPR, outer_nelts,
2400 integer_one_node),
2401 init, /*from_array=*/0);
f30efcb7 2402 else if (TYPE_NEEDS_CONSTRUCTING (type))
4ba126e4
MM
2403 init_expr = build_special_member_call (init_expr,
2404 complete_ctor_identifier,
2405 init, TYPE_BINFO (true_type),
2406 LOOKUP_NORMAL);
f30efcb7 2407 else
8d08fdba 2408 {
01240200
MM
2409 /* We are processing something like `new int (10)', which
2410 means allocate an int, and initialize it with 10. */
f30efcb7
JM
2411
2412 if (TREE_CODE (init) == TREE_LIST)
7215f9a0 2413 {
f30efcb7
JM
2414 if (TREE_CHAIN (init) != NULL_TREE)
2415 pedwarn
2416 ("initializer list being treated as compound expression");
2417 init = build_compound_expr (init);
2418 }
2419 else if (TREE_CODE (init) == CONSTRUCTOR
2420 && TREE_TYPE (init) == NULL_TREE)
2421 {
2422 pedwarn ("ISO C++ forbids aggregate initializer to new");
2423 init = digest_init (type, init, 0);
7215f9a0 2424 }
80170791 2425
f30efcb7 2426 init_expr = build_modify_expr (init_expr, INIT_EXPR, init);
96790071
JM
2427 }
2428
2429 if (init_expr == error_mark_node)
2430 return error_mark_node;
1f109f0f 2431
20c39572
JM
2432 /* If any part of the object initialization terminates by throwing an
2433 exception and a suitable deallocation function can be found, the
2434 deallocation function is called to free the memory in which the
2435 object was being constructed, after which the exception continues
2436 to propagate in the context of the new-expression. If no
2437 unambiguous matching deallocation function can be found,
2438 propagating the exception does not cause the object's memory to be
2439 freed. */
96790071 2440 if (flag_exceptions && ! use_java_new)
1f109f0f 2441 {
2face519 2442 enum tree_code dcode = has_array ? VEC_DELETE_EXPR : DELETE_EXPR;
96790071 2443 tree cleanup;
834c6dff
MM
2444 int flags = (LOOKUP_NORMAL
2445 | (globally_qualified_p * LOOKUP_GLOBAL));
a7d87521 2446
5355deec 2447 /* The Standard is unclear here, but the right thing to do
f4f4610e
MM
2448 is to use the same method for finding deallocation
2449 functions that we use for finding allocation functions. */
5355deec
AO
2450 flags |= LOOKUP_SPECULATIVELY;
2451
f4f4610e 2452 cleanup = build_op_delete_call (dcode, alloc_node, size, flags,
3f41ffd8
MM
2453 (placement_allocation_fn_p
2454 ? alloc_call : NULL_TREE));
2bb14213 2455
2face519
JM
2456 /* Ack! First we allocate the memory. Then we set our sentry
2457 variable to true, and expand a cleanup that deletes the memory
96790071
JM
2458 if sentry is true. Then we run the constructor, and finally
2459 clear the sentry.
2460
2461 It would be nice to be able to handle this without the sentry
2462 variable, perhaps with a TRY_CATCH_EXPR, but this doesn't
2463 work. We allocate the space first, so if there are any
2464 temporaries with cleanups in the constructor args we need this
2465 EH region to extend until end of full-expression to preserve
2466 nesting.
2467
2468 If the backend had some mechanism so that we could force the
2469 allocation to be expanded after all the other args to the
2470 constructor, that would fix the nesting problem and we could
2471 do away with this complexity. But that would complicate other
2472 things; in particular, it would make it difficult to bail out
8e51619a
JM
2473 if the allocation function returns null. Er, no, it wouldn't;
2474 we just don't run the constructor. The standard says it's
4977bab6
ZW
2475 unspecified whether or not the args are evaluated.
2476
2477 FIXME FIXME FIXME inline invisible refs as refs. That way we
2478 can preevaluate value parameters. */
2face519 2479
da4768fe
JM
2480 if (cleanup)
2481 {
96790071 2482 tree end, sentry, begin;
2face519
JM
2483
2484 begin = get_target_expr (boolean_true_node);
659e5a7a 2485 CLEANUP_EH_ONLY (begin) = 1;
2face519 2486
659e5a7a
JM
2487 sentry = TARGET_EXPR_SLOT (begin);
2488
2489 TARGET_EXPR_CLEANUP (begin)
2face519
JM
2490 = build (COND_EXPR, void_type_node, sentry,
2491 cleanup, void_zero_node);
2face519 2492
2face519
JM
2493 end = build (MODIFY_EXPR, TREE_TYPE (sentry),
2494 sentry, boolean_false_node);
2face519 2495
96790071
JM
2496 init_expr
2497 = build (COMPOUND_EXPR, void_type_node, begin,
2498 build (COMPOUND_EXPR, void_type_node, init_expr,
2499 end));
da4768fe 2500 }
1f109f0f 2501 }
f4f4610e 2502 }
8b5e2ce4
JM
2503 else
2504 init_expr = NULL_TREE;
2505
2506 /* Now build up the return value in reverse order. */
96790071 2507
8b5e2ce4 2508 rval = data_addr;
2face519 2509
8b5e2ce4
JM
2510 if (init_expr)
2511 rval = build (COMPOUND_EXPR, TREE_TYPE (rval), init_expr, rval);
2512 if (cookie_expr)
2513 rval = build (COMPOUND_EXPR, TREE_TYPE (rval), cookie_expr, rval);
2514
2515 if (rval == alloc_node)
2516 /* If we don't have an initializer or a cookie, strip the TARGET_EXPR
2517 and return the call (which doesn't need to be adjusted). */
2518 rval = TARGET_EXPR_INITIAL (alloc_expr);
2519 else
d18c083e 2520 {
8b5e2ce4
JM
2521 if (check_new)
2522 {
2523 tree ifexp = cp_build_binary_op (NE_EXPR, alloc_node,
2524 integer_zero_node);
2525 rval = build_conditional_expr (ifexp, rval, alloc_node);
2526 }
d18c083e 2527
8b5e2ce4
JM
2528 /* Perform the allocation before anything else, so that ALLOC_NODE
2529 has been initialized before we start using it. */
2530 rval = build (COMPOUND_EXPR, TREE_TYPE (rval), alloc_expr, rval);
2531 }
51c184be 2532
f4f4610e
MM
2533 /* Convert to the final type. */
2534 return build_nop (pointer_type, rval);
8d08fdba
MS
2535}
2536\f
f30432d7 2537static tree
c7edeea3 2538build_vec_delete_1 (base, maxindex, type, auto_delete_vec, use_global_delete)
f30432d7 2539 tree base, maxindex, type;
86f45d2c 2540 special_function_kind auto_delete_vec;
f30432d7
MS
2541 int use_global_delete;
2542{
2543 tree virtual_size;
e92cc029 2544 tree ptype = build_pointer_type (type = complete_type (type));
f30432d7
MS
2545 tree size_exp = size_in_bytes (type);
2546
2547 /* Temporary variables used by the loop. */
2548 tree tbase, tbase_init;
2549
2550 /* This is the body of the loop that implements the deletion of a
2551 single element, and moves temp variables to next elements. */
2552 tree body;
2553
2554 /* This is the LOOP_EXPR that governs the deletion of the elements. */
2555 tree loop;
2556
2557 /* This is the thing that governs what to do after the loop has run. */
2558 tree deallocate_expr = 0;
2559
2560 /* This is the BIND_EXPR which holds the outermost iterator of the
2561 loop. It is convenient to set this variable up and test it before
2562 executing any other code in the loop.
2563 This is also the containing expression returned by this function. */
2564 tree controller = NULL_TREE;
2565
b2153b98
KL
2566 /* We should only have 1-D arrays here. */
2567 if (TREE_CODE (type) == ARRAY_TYPE)
2568 abort ();
2569
834c6dff 2570 if (! IS_AGGR_TYPE (type) || TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
f30432d7
MS
2571 {
2572 loop = integer_zero_node;
2573 goto no_destructor;
2574 }
2575
708cae97 2576 /* The below is short by the cookie size. */
fed3cef0
RK
2577 virtual_size = size_binop (MULT_EXPR, size_exp,
2578 convert (sizetype, maxindex));
f30432d7 2579
46e8c075 2580 tbase = create_temporary_var (ptype);
f30432d7
MS
2581 tbase_init = build_modify_expr (tbase, NOP_EXPR,
2582 fold (build (PLUS_EXPR, ptype,
2583 base,
2584 virtual_size)));
2585 DECL_REGISTER (tbase) = 1;
4dabb379 2586 controller = build (BIND_EXPR, void_type_node, tbase, NULL_TREE, NULL_TREE);
f30432d7 2587 TREE_SIDE_EFFECTS (controller) = 1;
f30432d7 2588
c7edeea3 2589 body = NULL_TREE;
f30432d7 2590
e1b3e07d 2591 body = tree_cons (NULL_TREE,
86f45d2c 2592 build_delete (ptype, tbase, sfk_complete_destructor,
f30432d7
MS
2593 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1),
2594 body);
2595
e1b3e07d 2596 body = tree_cons (NULL_TREE,
f30432d7
MS
2597 build_modify_expr (tbase, NOP_EXPR, build (MINUS_EXPR, ptype, tbase, size_exp)),
2598 body);
2599
e1b3e07d 2600 body = tree_cons (NULL_TREE,
f30432d7
MS
2601 build (EXIT_EXPR, void_type_node,
2602 build (EQ_EXPR, boolean_type_node, base, tbase)),
2603 body);
2604
2605 loop = build (LOOP_EXPR, void_type_node, build_compound_expr (body));
2606
e1b3e07d
MM
2607 loop = tree_cons (NULL_TREE, tbase_init,
2608 tree_cons (NULL_TREE, loop, NULL_TREE));
f30432d7
MS
2609 loop = build_compound_expr (loop);
2610
2611 no_destructor:
2612 /* If the delete flag is one, or anything else with the low bit set,
2613 delete the storage. */
86f45d2c
MM
2614 deallocate_expr = integer_zero_node;
2615 if (auto_delete_vec != sfk_base_destructor)
f30432d7
MS
2616 {
2617 tree base_tbd;
2618
708cae97 2619 /* The below is short by the cookie size. */
fed3cef0
RK
2620 virtual_size = size_binop (MULT_EXPR, size_exp,
2621 convert (sizetype, maxindex));
f30432d7
MS
2622
2623 if (! TYPE_VEC_NEW_USES_COOKIE (type))
2624 /* no header */
2625 base_tbd = base;
2626 else
2627 {
834c6dff
MM
2628 tree cookie_size;
2629
2630 cookie_size = get_cookie_size (type);
2631 base_tbd
2632 = cp_convert (ptype,
ab76ca54
MM
2633 cp_build_binary_op (MINUS_EXPR,
2634 cp_convert (string_type_node,
2635 base),
2636 cookie_size));
e92cc029 2637 /* True size with header. */
834c6dff 2638 virtual_size = size_binop (PLUS_EXPR, virtual_size, cookie_size);
f30432d7 2639 }
86f45d2c
MM
2640
2641 if (auto_delete_vec == sfk_deleting_destructor)
2642 deallocate_expr = build_x_delete (base_tbd,
2643 2 | use_global_delete,
2644 virtual_size);
f30432d7
MS
2645 }
2646
2647 if (loop && deallocate_expr != integer_zero_node)
2648 {
e1b3e07d
MM
2649 body = tree_cons (NULL_TREE, loop,
2650 tree_cons (NULL_TREE, deallocate_expr, NULL_TREE));
f30432d7
MS
2651 body = build_compound_expr (body);
2652 }
2653 else
2654 body = loop;
2655
2656 /* Outermost wrapper: If pointer is null, punt. */
37f88e3e
JM
2657 body = fold (build (COND_EXPR, void_type_node,
2658 fold (build (NE_EXPR, boolean_type_node, base,
2659 integer_zero_node)),
2660 body, integer_zero_node));
f30432d7
MS
2661 body = build1 (NOP_EXPR, void_type_node, body);
2662
2663 if (controller)
2664 {
2665 TREE_OPERAND (controller, 1) = body;
4e8dca1c 2666 body = controller;
f30432d7 2667 }
4e8dca1c
JM
2668
2669 if (TREE_CODE (base) == SAVE_EXPR)
2670 /* Pre-evaluate the SAVE_EXPR outside of the BIND_EXPR. */
2671 body = build (COMPOUND_EXPR, void_type_node, base, body);
2672
2673 return cp_convert (void_type_node, body);
f30432d7
MS
2674}
2675
c395453c
MM
2676/* Create an unnamed variable of the indicated TYPE. */
2677
f1dedc31
MM
2678tree
2679create_temporary_var (type)
8a72a046
MM
2680 tree type;
2681{
f1dedc31
MM
2682 tree decl;
2683
2684 decl = build_decl (VAR_DECL, NULL_TREE, type);
2685 TREE_USED (decl) = 1;
2686 DECL_ARTIFICIAL (decl) = 1;
82a98427 2687 DECL_SOURCE_LOCATION (decl) = input_location;
f1dedc31 2688 DECL_IGNORED_P (decl) = 1;
b35d4555 2689 DECL_CONTEXT (decl) = current_function_decl;
f1dedc31 2690
f1dedc31 2691 return decl;
8a72a046
MM
2692}
2693
f1dedc31
MM
2694/* Create a new temporary variable of the indicated TYPE, initialized
2695 to INIT.
8a72a046 2696
f1dedc31
MM
2697 It is not entered into current_binding_level, because that breaks
2698 things when it comes time to do final cleanups (which take place
2699 "outside" the binding contour of the function). */
2700
2701static tree
2702get_temp_regvar (type, init)
2703 tree type, init;
f30432d7 2704{
f1dedc31 2705 tree decl;
8a72a046 2706
f1dedc31 2707 decl = create_temporary_var (type);
24bef158
MM
2708 if (building_stmt_tree ())
2709 add_decl_stmt (decl);
4e8dca1c 2710 else
19e7881c 2711 SET_DECL_RTL (decl, assign_temp (type, 2, 0, 1));
f1dedc31 2712 finish_expr_stmt (build_modify_expr (decl, INIT_EXPR, init));
8a72a046 2713
f1dedc31 2714 return decl;
f30432d7
MS
2715}
2716
f1dedc31
MM
2717/* `build_vec_init' returns tree structure that performs
2718 initialization of a vector of aggregate types.
8d08fdba 2719
f30efcb7 2720 BASE is a reference to the vector, of ARRAY_TYPE.
a48cccea
JM
2721 MAXINDEX is the maximum index of the array (one less than the
2722 number of elements). It is only used if
2723 TYPE_DOMAIN (TREE_TYPE (BASE)) == NULL_TREE.
8d08fdba
MS
2724 INIT is the (possibly NULL) initializer.
2725
2726 FROM_ARRAY is 0 if we should init everything with INIT
2727 (i.e., every element initialized from INIT).
2728 FROM_ARRAY is 1 if we should index into INIT in parallel
2729 with initialization of DECL.
2730 FROM_ARRAY is 2 if we should index into INIT in parallel,
2731 but use assignment instead of initialization. */
2732
2733tree
a48cccea
JM
2734build_vec_init (base, maxindex, init, from_array)
2735 tree base, init, maxindex;
8d08fdba
MS
2736 int from_array;
2737{
2738 tree rval;
8a72a046 2739 tree base2 = NULL_TREE;
8d08fdba 2740 tree size;
e833cb11 2741 tree itype = NULL_TREE;
8a72a046 2742 tree iterator;
f30efcb7
JM
2743 /* The type of the array. */
2744 tree atype = TREE_TYPE (base);
f1dedc31 2745 /* The type of an element in the array. */
f30efcb7 2746 tree type = TREE_TYPE (atype);
f1dedc31
MM
2747 /* The type of a pointer to an element in the array. */
2748 tree ptype;
2749 tree stmt_expr;
2750 tree compound_stmt;
2751 int destroy_temps;
f5984164 2752 tree try_block = NULL_TREE;
486837a7 2753 tree try_body = NULL_TREE;
8a72a046 2754 int num_initialized_elts = 0;
8d08fdba 2755
a48cccea
JM
2756 if (TYPE_DOMAIN (atype))
2757 maxindex = array_type_nelts (atype);
2758
2759 if (maxindex == NULL_TREE || maxindex == error_mark_node)
8d08fdba
MS
2760 return error_mark_node;
2761
c8a3d889
AO
2762 if (init
2763 && (from_array == 2
2764 ? (!CLASS_TYPE_P (type) || !TYPE_HAS_COMPLEX_ASSIGN_REF (type))
2765 : !TYPE_NEEDS_CONSTRUCTING (type))
f30efcb7
JM
2766 && ((TREE_CODE (init) == CONSTRUCTOR
2767 /* Don't do this if the CONSTRUCTOR might contain something
2768 that might throw and require us to clean up. */
2769 && (CONSTRUCTOR_ELTS (init) == NULL_TREE
2770 || ! TYPE_HAS_NONTRIVIAL_DESTRUCTOR (target_type (type))))
2771 || from_array))
2772 {
2773 /* Do non-default initialization of POD arrays resulting from
2774 brace-enclosed initializers. In this case, digest_init and
2775 store_constructor will handle the semantics for us. */
2776
2777 stmt_expr = build (INIT_EXPR, atype, base, init);
f30efcb7
JM
2778 return stmt_expr;
2779 }
2780
2781 maxindex = cp_convert (ptrdiff_type_node, maxindex);
f1dedc31 2782 ptype = build_pointer_type (type);
8d08fdba 2783 size = size_in_bytes (type);
f30efcb7
JM
2784 if (TREE_CODE (TREE_TYPE (base)) == ARRAY_TYPE)
2785 base = cp_convert (ptype, default_conversion (base));
8d08fdba 2786
f1dedc31
MM
2787 /* The code we are generating looks like:
2788
2789 T* t1 = (T*) base;
f30efcb7 2790 T* rval = t1;
f1dedc31
MM
2791 ptrdiff_t iterator = maxindex;
2792 try {
4977bab6 2793 for (; iterator != -1; --iterator) {
f30efcb7
JM
2794 ... initialize *t1 ...
2795 ++t1;
4977bab6 2796 }
f1dedc31
MM
2797 } catch (...) {
2798 ... destroy elements that were constructed ...
2799 }
f30efcb7 2800 return rval;
f1dedc31
MM
2801
2802 We can omit the try and catch blocks if we know that the
2803 initialization will never throw an exception, or if the array
f30efcb7 2804 elements do not have destructors. We can omit the loop completely if
f1dedc31
MM
2805 the elements of the array do not have constructors.
2806
2807 We actually wrap the entire body of the above in a STMT_EXPR, for
2808 tidiness.
2809
2810 When copying from array to another, when the array elements have
2811 only trivial copy constructors, we should use __builtin_memcpy
2812 rather than generating a loop. That way, we could take advantage
2813 of whatever cleverness the back-end has for dealing with copies
2814 of blocks of memory. */
2815
2816 begin_init_stmts (&stmt_expr, &compound_stmt);
f2c5f623 2817 destroy_temps = stmts_are_full_exprs_p ();
ae499cce 2818 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
f30efcb7 2819 rval = get_temp_regvar (ptype, base);
f1dedc31 2820 base = get_temp_regvar (ptype, rval);
8a72a046 2821 iterator = get_temp_regvar (ptrdiff_type_node, maxindex);
8d08fdba 2822
8a72a046 2823 /* Protect the entire array initialization so that we can destroy
f30efcb7
JM
2824 the partially constructed array if an exception is thrown.
2825 But don't do this if we're assigning. */
2826 if (flag_exceptions && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
2827 && from_array != 2)
ed5511d9
MM
2828 {
2829 try_block = begin_try_block ();
2830 try_body = begin_compound_stmt (/*has_no_scope=*/1);
2831 }
8a72a046 2832
f30efcb7 2833 if (init != NULL_TREE && TREE_CODE (init) == CONSTRUCTOR)
8d08fdba 2834 {
f30efcb7
JM
2835 /* Do non-default initialization of non-POD arrays resulting from
2836 brace-enclosed initializers. */
8a72a046
MM
2837
2838 tree elts;
094fe153
JM
2839 from_array = 0;
2840
8a72a046 2841 for (elts = CONSTRUCTOR_ELTS (init); elts; elts = TREE_CHAIN (elts))
8d08fdba 2842 {
8a72a046 2843 tree elt = TREE_VALUE (elts);
f1dedc31 2844 tree baseref = build1 (INDIRECT_REF, type, base);
8d08fdba 2845
8a72a046 2846 num_initialized_elts++;
8d08fdba 2847
8a72a046 2848 if (IS_AGGR_TYPE (type) || TREE_CODE (type) == ARRAY_TYPE)
f1dedc31 2849 finish_expr_stmt (build_aggr_init (baseref, elt, 0));
8a72a046 2850 else
f1dedc31
MM
2851 finish_expr_stmt (build_modify_expr (baseref, NOP_EXPR,
2852 elt));
8a72a046 2853
f30efcb7
JM
2854 finish_expr_stmt (build_unary_op (PREINCREMENT_EXPR, base, 0));
2855 finish_expr_stmt (build_unary_op (PREDECREMENT_EXPR, iterator, 0));
8d08fdba 2856 }
8d08fdba 2857
8a72a046
MM
2858 /* Clear out INIT so that we don't get confused below. */
2859 init = NULL_TREE;
8d08fdba 2860 }
8a72a046 2861 else if (from_array)
8d08fdba 2862 {
8a72a046
MM
2863 /* If initializing one array from another, initialize element by
2864 element. We rely upon the below calls the do argument
2865 checking. */
8a72a046
MM
2866 if (init)
2867 {
2868 base2 = default_conversion (init);
2869 itype = TREE_TYPE (base2);
2870 base2 = get_temp_regvar (itype, base2);
2871 itype = TREE_TYPE (itype);
2872 }
2873 else if (TYPE_LANG_SPECIFIC (type)
2874 && TYPE_NEEDS_CONSTRUCTING (type)
2875 && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
2876 {
2877 error ("initializer ends prematurely");
2878 return error_mark_node;
2879 }
2880 }
8d08fdba 2881
8a72a046
MM
2882 /* Now, default-initialize any remaining elements. We don't need to
2883 do that if a) the type does not need constructing, or b) we've
094fe153
JM
2884 already initialized all the elements.
2885
2886 We do need to keep going if we're copying an array. */
2887
2888 if (from_array
2889 || (TYPE_NEEDS_CONSTRUCTING (type)
665f2503 2890 && ! (host_integerp (maxindex, 0)
05bccae2 2891 && (num_initialized_elts
665f2503 2892 == tree_low_cst (maxindex, 0) + 1))))
8a72a046 2893 {
37e05cd5 2894 /* If the ITERATOR is equal to -1, then we don't have to loop;
8a72a046 2895 we've already initialized all the elements. */
4977bab6
ZW
2896 tree for_stmt;
2897 tree for_body;
f1dedc31
MM
2898 tree elt_init;
2899
4977bab6
ZW
2900 for_stmt = begin_for_stmt ();
2901 finish_for_init_stmt (for_stmt);
2902 finish_for_cond (build (NE_EXPR, boolean_type_node,
2903 iterator, integer_minus_one_node),
2904 for_stmt);
2905 finish_for_expr (build_unary_op (PREDECREMENT_EXPR, iterator, 0),
2906 for_stmt);
8d08fdba 2907
8a72a046 2908 /* Otherwise, loop through the elements. */
4977bab6 2909 for_body = begin_compound_stmt (/*has_no_scope=*/1);
f1dedc31
MM
2910
2911 /* When we're not building a statement-tree, things are a little
2912 complicated. If, when we recursively call build_aggr_init,
2913 an expression containing a TARGET_EXPR is expanded, then it
2914 may get a cleanup. Then, the result of that expression is
2915 passed to finish_expr_stmt, which will call
2916 expand_start_target_temps/expand_end_target_temps. However,
2917 the latter call will not cause the cleanup to run because
2918 that block will still be on the block stack. So, we call
2919 expand_start_target_temps here manually; the corresponding
2920 call to expand_end_target_temps below will cause the cleanup
2921 to be performed. */
2922 if (!building_stmt_tree ())
2923 expand_start_target_temps ();
0fac6b0b 2924
8d08fdba
MS
2925 if (from_array)
2926 {
2927 tree to = build1 (INDIRECT_REF, type, base);
2928 tree from;
2929
2930 if (base2)
2931 from = build1 (INDIRECT_REF, itype, base2);
2932 else
2933 from = NULL_TREE;
2934
2935 if (from_array == 2)
f1dedc31 2936 elt_init = build_modify_expr (to, NOP_EXPR, from);
8d08fdba 2937 else if (TYPE_NEEDS_CONSTRUCTING (type))
f1dedc31 2938 elt_init = build_aggr_init (to, from, 0);
8d08fdba 2939 else if (from)
f1dedc31 2940 elt_init = build_modify_expr (to, NOP_EXPR, from);
8d08fdba 2941 else
a98facb0 2942 abort ();
8d08fdba
MS
2943 }
2944 else if (TREE_CODE (type) == ARRAY_TYPE)
2945 {
2946 if (init != 0)
f30efcb7
JM
2947 sorry
2948 ("cannot initialize multi-dimensional array with initializer");
2949 elt_init = build_vec_init (build1 (INDIRECT_REF, type, base),
a48cccea 2950 0, 0, 0);
f1dedc31
MM
2951 }
2952 else
2953 elt_init = build_aggr_init (build1 (INDIRECT_REF, type, base),
2954 init, 0);
2955
2956 /* The initialization of each array element is a
f30efcb7 2957 full-expression, as per core issue 124. */
f1dedc31
MM
2958 if (!building_stmt_tree ())
2959 {
35b1567d 2960 genrtl_expr_stmt (elt_init);
f1dedc31 2961 expand_end_target_temps ();
8d08fdba
MS
2962 }
2963 else
f1dedc31 2964 {
ae499cce 2965 current_stmt_tree ()->stmts_are_full_exprs_p = 1;
f1dedc31 2966 finish_expr_stmt (elt_init);
ae499cce 2967 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
f1dedc31 2968 }
8d08fdba 2969
f30efcb7 2970 finish_expr_stmt (build_unary_op (PREINCREMENT_EXPR, base, 0));
8d08fdba 2971 if (base2)
f30efcb7 2972 finish_expr_stmt (build_unary_op (PREINCREMENT_EXPR, base2, 0));
0fac6b0b 2973
4977bab6
ZW
2974 finish_compound_stmt (/*has_no_scope=*/1, for_body);
2975 finish_for_stmt (for_stmt);
8d08fdba 2976 }
8a72a046
MM
2977
2978 /* Make sure to cleanup any partially constructed elements. */
f30efcb7
JM
2979 if (flag_exceptions && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
2980 && from_array != 2)
f1dedc31
MM
2981 {
2982 tree e;
b2153b98
KL
2983 tree m = cp_build_binary_op (MINUS_EXPR, maxindex, iterator);
2984
2985 /* Flatten multi-dimensional array since build_vec_delete only
2986 expects one-dimensional array. */
2987 if (TREE_CODE (type) == ARRAY_TYPE)
2988 {
2989 m = cp_build_binary_op (MULT_EXPR, m,
2990 array_type_nelts_total (type));
2991 type = strip_array_types (type);
2992 }
8d08fdba 2993
ed5511d9
MM
2994 finish_compound_stmt (/*has_no_scope=*/1, try_body);
2995 finish_cleanup_try_block (try_block);
b2153b98 2996 e = build_vec_delete_1 (rval, m,
f1dedc31 2997 type,
86f45d2c 2998 sfk_base_destructor,
f1dedc31 2999 /*use_global_delete=*/0);
f1dedc31
MM
3000 finish_cleanup (e, try_block);
3001 }
3002
f1dedc31
MM
3003 /* The value of the array initialization is the address of the
3004 first element in the array. */
3005 finish_expr_stmt (rval);
3006
3007 stmt_expr = finish_init_stmts (stmt_expr, compound_stmt);
ae499cce 3008 current_stmt_tree ()->stmts_are_full_exprs_p = destroy_temps;
f1dedc31 3009 return stmt_expr;
8d08fdba
MS
3010}
3011
3012/* Free up storage of type TYPE, at address ADDR.
3013
3014 TYPE is a POINTER_TYPE and can be ptr_type_node for no special type
3015 of pointer.
3016
3017 VIRTUAL_SIZE is the amount of storage that was allocated, and is
3018 used as the second argument to operator delete. It can include
3019 things like padding and magic size cookies. It has virtual in it,
3020 because if you have a base pointer and you delete through a virtual
3021 destructor, it should be the size of the dynamic object, not the
cab1f180 3022 static object, see Free Store 12.5 ISO C++.
8d08fdba
MS
3023
3024 This does not call any destructors. */
e92cc029 3025
8d08fdba 3026tree
b370501f
KG
3027build_x_delete (addr, which_delete, virtual_size)
3028 tree addr;
a28e3c7f 3029 int which_delete;
8d08fdba
MS
3030 tree virtual_size;
3031{
a28e3c7f
MS
3032 int use_global_delete = which_delete & 1;
3033 int use_vec_delete = !!(which_delete & 2);
a28e3c7f 3034 enum tree_code code = use_vec_delete ? VEC_DELETE_EXPR : DELETE_EXPR;
da4768fe 3035 int flags = LOOKUP_NORMAL | (use_global_delete * LOOKUP_GLOBAL);
8d08fdba 3036
519ebd1e 3037 return build_op_delete_call (code, addr, virtual_size, flags, NULL_TREE);
8d08fdba
MS
3038}
3039
86f45d2c
MM
3040/* Call the DTOR_KIND destructor for EXP. FLAGS are as for
3041 build_delete. */
298d6f60
MM
3042
3043static tree
86f45d2c 3044build_dtor_call (exp, dtor_kind, flags)
298d6f60 3045 tree exp;
86f45d2c 3046 special_function_kind dtor_kind;
298d6f60
MM
3047 int flags;
3048{
86f45d2c
MM
3049 tree name;
3050
3051 switch (dtor_kind)
3052 {
3053 case sfk_complete_destructor:
3054 name = complete_dtor_identifier;
3055 break;
3056
3057 case sfk_base_destructor:
3058 name = base_dtor_identifier;
3059 break;
3060
3061 case sfk_deleting_destructor:
3062 name = deleting_dtor_identifier;
3063 break;
3064
3065 default:
a98facb0 3066 abort ();
86f45d2c 3067 }
4ba126e4
MM
3068 return build_method_call (exp, name, NULL_TREE,
3069 TYPE_BINFO (TREE_TYPE (exp)), flags);
298d6f60
MM
3070}
3071
8d08fdba
MS
3072/* Generate a call to a destructor. TYPE is the type to cast ADDR to.
3073 ADDR is an expression which yields the store to be destroyed.
86f45d2c
MM
3074 AUTO_DELETE is the name of the destructor to call, i.e., either
3075 sfk_complete_destructor, sfk_base_destructor, or
3076 sfk_deleting_destructor.
8d08fdba
MS
3077
3078 FLAGS is the logical disjunction of zero or more LOOKUP_
ade3dc07 3079 flags. See cp-tree.h for more info. */
e92cc029 3080
8d08fdba
MS
3081tree
3082build_delete (type, addr, auto_delete, flags, use_global_delete)
3083 tree type, addr;
86f45d2c 3084 special_function_kind auto_delete;
8d08fdba
MS
3085 int flags;
3086 int use_global_delete;
3087{
8d08fdba 3088 tree expr;
8d08fdba
MS
3089
3090 if (addr == error_mark_node)
3091 return error_mark_node;
3092
3093 /* Can happen when CURRENT_EXCEPTION_OBJECT gets its type
3094 set to `error_mark_node' before it gets properly cleaned up. */
3095 if (type == error_mark_node)
3096 return error_mark_node;
3097
3098 type = TYPE_MAIN_VARIANT (type);
3099
3100 if (TREE_CODE (type) == POINTER_TYPE)
3101 {
2986ae00 3102 type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
8d08fdba
MS
3103 if (TREE_CODE (type) == ARRAY_TYPE)
3104 goto handle_array;
23b4deba
AO
3105
3106 if (VOID_TYPE_P (type)
3107 /* We don't want to warn about delete of void*, only other
3108 incomplete types. Deleting other incomplete types
3109 invokes undefined behavior, but it is not ill-formed, so
3110 compile to something that would even do The Right Thing
3111 (TM) should the type have a trivial dtor and no delete
3112 operator. */
3113 || !complete_type_or_diagnostic (type, addr, 1)
3114 || !IS_AGGR_TYPE (type))
8d08fdba
MS
3115 {
3116 /* Call the builtin operator delete. */
c787dd82 3117 return build_builtin_delete_call (addr);
8d08fdba
MS
3118 }
3119 if (TREE_SIDE_EFFECTS (addr))
3120 addr = save_expr (addr);
2986ae00
MS
3121
3122 /* throw away const and volatile on target type of addr */
6060a796 3123 addr = convert_force (build_pointer_type (type), addr, 0);
8d08fdba
MS
3124 }
3125 else if (TREE_CODE (type) == ARRAY_TYPE)
3126 {
3127 handle_array:
6742d92b 3128
c407792d
RK
3129 if (TYPE_DOMAIN (type) == NULL_TREE)
3130 {
8251199e 3131 error ("unknown array size in delete");
c407792d
RK
3132 return error_mark_node;
3133 }
8d08fdba 3134 return build_vec_delete (addr, array_type_nelts (type),
c7edeea3 3135 auto_delete, use_global_delete);
8d08fdba
MS
3136 }
3137 else
3138 {
3139 /* Don't check PROTECT here; leave that decision to the
3140 destructor. If the destructor is accessible, call it,
3141 else report error. */
3142 addr = build_unary_op (ADDR_EXPR, addr, 0);
3143 if (TREE_SIDE_EFFECTS (addr))
3144 addr = save_expr (addr);
3145
60696c53 3146 addr = convert_force (build_pointer_type (type), addr, 0);
8d08fdba
MS
3147 }
3148
3149 my_friendly_assert (IS_AGGR_TYPE (type), 220);
3150
834c6dff 3151 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
8d08fdba 3152 {
60696c53 3153 if (auto_delete != sfk_deleting_destructor)
8d08fdba
MS
3154 return void_zero_node;
3155
da4768fe 3156 return build_op_delete_call
ea793912 3157 (DELETE_EXPR, addr, cxx_sizeof_nowarn (type),
519ebd1e
JM
3158 LOOKUP_NORMAL | (use_global_delete * LOOKUP_GLOBAL),
3159 NULL_TREE);
8d08fdba 3160 }
ade3dc07 3161 else
8d08fdba 3162 {
700f8a87 3163 tree do_delete = NULL_TREE;
bd6dd845 3164 tree ifexp;
700f8a87 3165
ade3dc07
JM
3166 my_friendly_assert (TYPE_HAS_DESTRUCTOR (type), 20011213);
3167
52682a1b
MM
3168 /* For `::delete x', we must not use the deleting destructor
3169 since then we would not be sure to get the global `operator
3170 delete'. */
86f45d2c 3171 if (use_global_delete && auto_delete == sfk_deleting_destructor)
700f8a87 3172 {
1b4a93f7
MM
3173 /* We will use ADDR multiple times so we must save it. */
3174 addr = save_expr (addr);
c6002625 3175 /* Delete the object. */
86f45d2c
MM
3176 do_delete = build_builtin_delete_call (addr);
3177 /* Otherwise, treat this like a complete object destructor
3178 call. */
3179 auto_delete = sfk_complete_destructor;
700f8a87 3180 }
52682a1b
MM
3181 /* If the destructor is non-virtual, there is no deleting
3182 variant. Instead, we must explicitly call the appropriate
3183 `operator delete' here. */
3184 else if (!DECL_VIRTUAL_P (CLASSTYPE_DESTRUCTORS (type))
3185 && auto_delete == sfk_deleting_destructor)
3186 {
1b4a93f7
MM
3187 /* We will use ADDR multiple times so we must save it. */
3188 addr = save_expr (addr);
3189 /* Build the call. */
52682a1b
MM
3190 do_delete = build_op_delete_call (DELETE_EXPR,
3191 addr,
ea793912 3192 cxx_sizeof_nowarn (type),
52682a1b
MM
3193 LOOKUP_NORMAL,
3194 NULL_TREE);
3195 /* Call the complete object destructor. */
3196 auto_delete = sfk_complete_destructor;
3197 }
e3fe84e5
JM
3198 else if (auto_delete == sfk_deleting_destructor
3199 && TYPE_GETS_REG_DELETE (type))
3200 {
3201 /* Make sure we have access to the member op delete, even though
3202 we'll actually be calling it from the destructor. */
ea793912 3203 build_op_delete_call (DELETE_EXPR, addr, cxx_sizeof_nowarn (type),
e3fe84e5
JM
3204 LOOKUP_NORMAL, NULL_TREE);
3205 }
8d08fdba 3206
3e411c3f 3207 expr = build_dtor_call (build_indirect_ref (addr, NULL),
1b4a93f7 3208 auto_delete, flags);
bd6dd845
MS
3209 if (do_delete)
3210 expr = build (COMPOUND_EXPR, void_type_node, expr, do_delete);
9e9ff709 3211
bd6dd845
MS
3212 if (flags & LOOKUP_DESTRUCTOR)
3213 /* Explicit destructor call; don't check for null pointer. */
3214 ifexp = integer_one_node;
8d08fdba 3215 else
bd6dd845 3216 /* Handle deleting a null pointer. */
ab76ca54 3217 ifexp = fold (cp_build_binary_op (NE_EXPR, addr, integer_zero_node));
8d08fdba 3218
bd6dd845
MS
3219 if (ifexp != integer_one_node)
3220 expr = build (COND_EXPR, void_type_node,
3221 ifexp, expr, void_zero_node);
8d08fdba 3222
8d08fdba
MS
3223 return expr;
3224 }
ade3dc07 3225}
8d08fdba 3226
ade3dc07
JM
3227/* At the beginning of a destructor, push cleanups that will call the
3228 destructors for our base classes and members.
2a2480e1 3229
a29e1034 3230 Called from begin_destructor_body. */
8d08fdba 3231
ade3dc07
JM
3232void
3233push_base_cleanups ()
3234{
3235 tree binfos;
3236 int i, n_baseclasses;
3237 tree member;
3238 tree expr;
8d08fdba 3239
ade3dc07
JM
3240 /* Run destructors for all virtual baseclasses. */
3241 if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
3242 {
3243 tree vbases;
3244 tree cond = (condition_conversion
3245 (build (BIT_AND_EXPR, integer_type_node,
3246 current_in_charge_parm,
3247 integer_two_node)));
8d08fdba 3248
ade3dc07
JM
3249 vbases = CLASSTYPE_VBASECLASSES (current_class_type);
3250 /* The CLASSTYPE_VBASECLASSES list is in initialization
3251 order, which is also the right order for pushing cleanups. */
3252 for (; vbases;
3253 vbases = TREE_CHAIN (vbases))
8d08fdba 3254 {
ade3dc07
JM
3255 tree vbase = TREE_VALUE (vbases);
3256 tree base_type = BINFO_TYPE (vbase);
3257
3258 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (base_type))
8d08fdba 3259 {
4ba126e4
MM
3260 expr = build_special_member_call (current_class_ref,
3261 base_dtor_identifier,
3262 NULL_TREE,
3263 vbase,
3264 (LOOKUP_NORMAL
3265 | LOOKUP_NONVIRTUAL));
ade3dc07
JM
3266 expr = build (COND_EXPR, void_type_node, cond,
3267 expr, void_zero_node);
3268 finish_decl_cleanup (NULL_TREE, expr);
8d08fdba
MS
3269 }
3270 }
ade3dc07
JM
3271 }
3272
3273 binfos = BINFO_BASETYPES (TYPE_BINFO (current_class_type));
3274 n_baseclasses = CLASSTYPE_N_BASECLASSES (current_class_type);
8d08fdba 3275
ade3dc07
JM
3276 /* Take care of the remaining baseclasses. */
3277 for (i = 0; i < n_baseclasses; i++)
3278 {
3279 tree base_binfo = TREE_VEC_ELT (binfos, i);
3280 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo))
3281 || TREE_VIA_VIRTUAL (base_binfo))
3282 continue;
3283
4ba126e4
MM
3284 expr = build_special_member_call (current_class_ref,
3285 base_dtor_identifier,
3286 NULL_TREE, base_binfo,
3287 LOOKUP_NORMAL | LOOKUP_NONVIRTUAL);
ade3dc07
JM
3288 finish_decl_cleanup (NULL_TREE, expr);
3289 }
3290
3291 for (member = TYPE_FIELDS (current_class_type); member;
3292 member = TREE_CHAIN (member))
3293 {
17bbb839 3294 if (TREE_CODE (member) != FIELD_DECL || DECL_ARTIFICIAL (member))
ade3dc07
JM
3295 continue;
3296 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (member)))
3297 {
50ad9642
MM
3298 tree this_member = (build_class_member_access_expr
3299 (current_class_ref, member,
3300 /*access_path=*/NULL_TREE,
3301 /*preserve_reference=*/false));
ade3dc07
JM
3302 tree this_type = TREE_TYPE (member);
3303 expr = build_delete (this_type, this_member,
3304 sfk_complete_destructor,
3305 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_NORMAL,
3306 0);
3307 finish_decl_cleanup (NULL_TREE, expr);
3308 }
8d08fdba
MS
3309 }
3310}
3311
3312/* For type TYPE, delete the virtual baseclass objects of DECL. */
3313
3314tree
3315build_vbase_delete (type, decl)
3316 tree type, decl;
3317{
3318 tree vbases = CLASSTYPE_VBASECLASSES (type);
3319 tree result = NULL_TREE;
3320 tree addr = build_unary_op (ADDR_EXPR, decl, 0);
3321
3322 my_friendly_assert (addr != error_mark_node, 222);
3323
3324 while (vbases)
3325 {
a55583e9
MM
3326 tree this_addr
3327 = convert_force (build_pointer_type (BINFO_TYPE (TREE_VALUE (vbases))),
3328 addr, 0);
e1b3e07d 3329 result = tree_cons (NULL_TREE,
8d08fdba 3330 build_delete (TREE_TYPE (this_addr), this_addr,
86f45d2c 3331 sfk_base_destructor,
8d08fdba
MS
3332 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 0),
3333 result);
3334 vbases = TREE_CHAIN (vbases);
3335 }
3336 return build_compound_expr (nreverse (result));
3337}
3338
3339/* Build a C++ vector delete expression.
3340 MAXINDEX is the number of elements to be deleted.
3341 ELT_SIZE is the nominal size of each element in the vector.
3342 BASE is the expression that should yield the store to be deleted.
8d08fdba
MS
3343 This function expands (or synthesizes) these calls itself.
3344 AUTO_DELETE_VEC says whether the container (vector) should be deallocated.
8d08fdba
MS
3345
3346 This also calls delete for virtual baseclasses of elements of the vector.
3347
3348 Update: MAXINDEX is no longer needed. The size can be extracted from the
3349 start of the vector for pointers, and from the type for arrays. We still
3350 use MAXINDEX for arrays because it happens to already have one of the
3351 values we'd have to extract. (We could use MAXINDEX with pointers to
3352 confirm the size, and trap if the numbers differ; not clear that it'd
3353 be worth bothering.) */
e92cc029 3354
8d08fdba 3355tree
c7edeea3 3356build_vec_delete (base, maxindex, auto_delete_vec, use_global_delete)
5566b478 3357 tree base, maxindex;
86f45d2c 3358 special_function_kind auto_delete_vec;
a28e3c7f 3359 int use_global_delete;
8d08fdba 3360{
f30432d7 3361 tree type;
8d08fdba 3362
c407792d
RK
3363 if (TREE_CODE (base) == OFFSET_REF)
3364 base = resolve_offset_ref (base);
3365
f30432d7 3366 type = TREE_TYPE (base);
c407792d 3367
8d08fdba
MS
3368 base = stabilize_reference (base);
3369
f30432d7 3370 if (TREE_CODE (type) == POINTER_TYPE)
8d08fdba
MS
3371 {
3372 /* Step back one from start of vector, and read dimension. */
834c6dff
MM
3373 tree cookie_addr;
3374
6742d92b
NS
3375 if (TREE_SIDE_EFFECTS (base))
3376 base = save_expr (base);
708cae97 3377 type = strip_array_types (TREE_TYPE (type));
1f84ec23
MM
3378 cookie_addr = build (MINUS_EXPR,
3379 build_pointer_type (sizetype),
3380 base,
3381 TYPE_SIZE_UNIT (sizetype));
3e411c3f 3382 maxindex = build_indirect_ref (cookie_addr, NULL);
8d08fdba 3383 }
f30432d7 3384 else if (TREE_CODE (type) == ARRAY_TYPE)
8d08fdba
MS
3385 {
3386 /* get the total number of things in the array, maxindex is a bad name */
f30432d7 3387 maxindex = array_type_nelts_total (type);
834c6dff 3388 type = strip_array_types (type);
8d08fdba 3389 base = build_unary_op (ADDR_EXPR, base, 1);
6742d92b
NS
3390 if (TREE_SIDE_EFFECTS (base))
3391 base = save_expr (base);
8d08fdba
MS
3392 }
3393 else
3394 {
9e9ff709 3395 if (base != error_mark_node)
8251199e 3396 error ("type to vector delete is neither pointer or array type");
8d08fdba
MS
3397 return error_mark_node;
3398 }
8d08fdba 3399
c7edeea3 3400 return build_vec_delete_1 (base, maxindex, type, auto_delete_vec,
f30432d7 3401 use_global_delete);
8d08fdba 3402}