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