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