OSDN Git Service

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