OSDN Git Service

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