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