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