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