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