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