OSDN Git Service

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