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