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