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