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