7f974bf7132c25e197cc5ea94f6cb8a51475ecf3
[dragonfly.git] / contrib / gcc-3.4 / 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 (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
1157     expr = build_aggr_init (decl, init, flags);
1158   else if (CLASS_TYPE_P (TREE_TYPE (decl)))
1159     expr = build_special_member_call (decl, complete_ctor_identifier,
1160                                       build_tree_list (NULL_TREE, init),
1161                                       TYPE_BINFO (TREE_TYPE (decl)),
1162                                       LOOKUP_NORMAL|flags);
1163   else
1164     expr = build (INIT_EXPR, TREE_TYPE (decl), decl, init);
1165
1166   return expr;
1167 }
1168
1169 static void
1170 expand_default_init (tree binfo, tree true_exp, tree exp, tree init, int flags)
1171 {
1172   tree type = TREE_TYPE (exp);
1173   tree ctor_name;
1174
1175   /* It fails because there may not be a constructor which takes
1176      its own type as the first (or only parameter), but which does
1177      take other types via a conversion.  So, if the thing initializing
1178      the expression is a unit element of type X, first try X(X&),
1179      followed by initialization by X.  If neither of these work
1180      out, then look hard.  */
1181   tree rval;
1182   tree parms;
1183
1184   if (init && TREE_CODE (init) != TREE_LIST
1185       && (flags & LOOKUP_ONLYCONVERTING))
1186     {
1187       /* Base subobjects should only get direct-initialization.  */
1188       if (true_exp != exp)
1189         abort ();
1190
1191       if (flags & DIRECT_BIND)
1192         /* Do nothing.  We hit this in two cases:  Reference initialization,
1193            where we aren't initializing a real variable, so we don't want
1194            to run a new constructor; and catching an exception, where we
1195            have already built up the constructor call so we could wrap it
1196            in an exception region.  */;
1197       else if (TREE_CODE (init) == CONSTRUCTOR 
1198                && TREE_HAS_CONSTRUCTOR (init))
1199         {
1200           /* A brace-enclosed initializer for an aggregate.  */
1201           my_friendly_assert (CP_AGGREGATE_TYPE_P (type), 20021016);
1202           init = digest_init (type, init, (tree *)NULL);
1203         }
1204       else
1205         init = ocp_convert (type, init, CONV_IMPLICIT|CONV_FORCE_TEMP, flags);
1206
1207       if (TREE_CODE (init) == MUST_NOT_THROW_EXPR)
1208         /* We need to protect the initialization of a catch parm with a
1209            call to terminate(), which shows up as a MUST_NOT_THROW_EXPR
1210            around the TARGET_EXPR for the copy constructor.  See
1211            initialize_handler_parm.  */
1212         {
1213           TREE_OPERAND (init, 0) = build (INIT_EXPR, TREE_TYPE (exp), exp,
1214                                           TREE_OPERAND (init, 0));
1215           TREE_TYPE (init) = void_type_node;
1216         }
1217       else
1218         init = build (INIT_EXPR, TREE_TYPE (exp), exp, init);
1219       TREE_SIDE_EFFECTS (init) = 1;
1220       finish_expr_stmt (init);
1221       return;
1222     }
1223
1224   if (init == NULL_TREE
1225       || (TREE_CODE (init) == TREE_LIST && ! TREE_TYPE (init)))
1226     {
1227       parms = init;
1228       if (parms)
1229         init = TREE_VALUE (parms);
1230     }
1231   else
1232     parms = build_tree_list (NULL_TREE, init);
1233
1234   if (true_exp == exp)
1235     ctor_name = complete_ctor_identifier;
1236   else
1237     ctor_name = base_ctor_identifier;
1238
1239   rval = build_special_member_call (exp, ctor_name, parms, binfo, flags);
1240   if (TREE_SIDE_EFFECTS (rval))
1241     finish_expr_stmt (convert_to_void (rval, NULL));
1242 }
1243
1244 /* This function is responsible for initializing EXP with INIT
1245    (if any).
1246
1247    BINFO is the binfo of the type for who we are performing the
1248    initialization.  For example, if W is a virtual base class of A and B,
1249    and C : A, B.
1250    If we are initializing B, then W must contain B's W vtable, whereas
1251    were we initializing C, W must contain C's W vtable.
1252
1253    TRUE_EXP is nonzero if it is the true expression being initialized.
1254    In this case, it may be EXP, or may just contain EXP.  The reason we
1255    need this is because if EXP is a base element of TRUE_EXP, we
1256    don't necessarily know by looking at EXP where its virtual
1257    baseclass fields should really be pointing.  But we do know
1258    from TRUE_EXP.  In constructors, we don't know anything about
1259    the value being initialized.
1260
1261    FLAGS is just passed to `build_new_method_call'.  See that function
1262    for its description.  */
1263
1264 static void
1265 expand_aggr_init_1 (tree binfo, tree true_exp, tree exp, tree init, int flags)
1266 {
1267   tree type = TREE_TYPE (exp);
1268
1269   my_friendly_assert (init != error_mark_node && type != error_mark_node, 211);
1270   my_friendly_assert (building_stmt_tree (), 20021010);
1271
1272   /* Use a function returning the desired type to initialize EXP for us.
1273      If the function is a constructor, and its first argument is
1274      NULL_TREE, know that it was meant for us--just slide exp on
1275      in and expand the constructor.  Constructors now come
1276      as TARGET_EXPRs.  */
1277
1278   if (init && TREE_CODE (exp) == VAR_DECL
1279       && TREE_CODE (init) == CONSTRUCTOR
1280       && TREE_HAS_CONSTRUCTOR (init))
1281     {
1282       /* If store_init_value returns NULL_TREE, the INIT has been
1283          record in the DECL_INITIAL for EXP.  That means there's
1284          nothing more we have to do.  */
1285       init = store_init_value (exp, init);
1286       if (init)
1287         finish_expr_stmt (init);
1288       return;
1289     }
1290
1291   /* We know that expand_default_init can handle everything we want
1292      at this point.  */
1293   expand_default_init (binfo, true_exp, exp, init, flags);
1294 }
1295
1296 /* Report an error if TYPE is not a user-defined, aggregate type.  If
1297    OR_ELSE is nonzero, give an error message.  */
1298
1299 int
1300 is_aggr_type (tree type, int or_else)
1301 {
1302   if (type == error_mark_node)
1303     return 0;
1304
1305   if (! IS_AGGR_TYPE (type)
1306       && TREE_CODE (type) != TEMPLATE_TYPE_PARM
1307       && TREE_CODE (type) != BOUND_TEMPLATE_TEMPLATE_PARM)
1308     {
1309       if (or_else)
1310         error ("`%T' is not an aggregate type", type);
1311       return 0;
1312     }
1313   return 1;
1314 }
1315
1316 /* Like is_aggr_typedef, but returns typedef if successful.  */
1317
1318 tree
1319 get_aggr_from_typedef (tree name, int or_else)
1320 {
1321   tree type;
1322
1323   if (name == error_mark_node)
1324     return NULL_TREE;
1325
1326   if (IDENTIFIER_HAS_TYPE_VALUE (name))
1327     type = IDENTIFIER_TYPE_VALUE (name);
1328   else
1329     {
1330       if (or_else)
1331         error ("`%T' fails to be an aggregate typedef", name);
1332       return NULL_TREE;
1333     }
1334
1335   if (! IS_AGGR_TYPE (type)
1336       && TREE_CODE (type) != TEMPLATE_TYPE_PARM
1337       && TREE_CODE (type) != BOUND_TEMPLATE_TEMPLATE_PARM)
1338     {
1339       if (or_else)
1340         error ("type `%T' is of non-aggregate type", type);
1341       return NULL_TREE;
1342     }
1343   return type;
1344 }
1345
1346 tree
1347 get_type_value (tree name)
1348 {
1349   if (name == error_mark_node)
1350     return NULL_TREE;
1351
1352   if (IDENTIFIER_HAS_TYPE_VALUE (name))
1353     return IDENTIFIER_TYPE_VALUE (name);
1354   else
1355     return NULL_TREE;
1356 }
1357
1358 /* Build a reference to a member of an aggregate.  This is not a C++
1359    `&', but really something which can have its address taken, and
1360    then act as a pointer to member, for example TYPE :: FIELD can have
1361    its address taken by saying & TYPE :: FIELD.  ADDRESS_P is true if
1362    this expression is the operand of "&".
1363
1364    @@ Prints out lousy diagnostics for operator <typename>
1365    @@ fields.
1366
1367    @@ This function should be rewritten and placed in search.c.  */
1368
1369 tree
1370 build_offset_ref (tree type, tree name, bool address_p)
1371 {
1372   tree decl;
1373   tree member;
1374   tree basebinfo = NULL_TREE;
1375   tree orig_name = name;
1376
1377   /* class templates can come in as TEMPLATE_DECLs here.  */
1378   if (TREE_CODE (name) == TEMPLATE_DECL)
1379     return name;
1380
1381   if (dependent_type_p (type) || type_dependent_expression_p (name))
1382     return build_min_nt (SCOPE_REF, type, name);
1383
1384   if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
1385     {
1386       /* If the NAME is a TEMPLATE_ID_EXPR, we are looking at
1387          something like `a.template f<int>' or the like.  For the most
1388          part, we treat this just like a.f.  We do remember, however,
1389          the template-id that was used.  */
1390       name = TREE_OPERAND (orig_name, 0);
1391
1392       if (DECL_P (name))
1393         name = DECL_NAME (name);
1394       else
1395         {
1396           if (TREE_CODE (name) == COMPONENT_REF)
1397             name = TREE_OPERAND (name, 1);
1398           if (TREE_CODE (name) == OVERLOAD)
1399             name = DECL_NAME (OVL_CURRENT (name));
1400         }
1401
1402       my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 0);
1403     }
1404
1405   if (type == NULL_TREE)
1406     return error_mark_node;
1407   
1408   /* Handle namespace names fully here.  */
1409   if (TREE_CODE (type) == NAMESPACE_DECL)
1410     {
1411       tree t = lookup_namespace_name (type, name);
1412       if (t == error_mark_node)
1413         return t;
1414       if (TREE_CODE (orig_name) == TEMPLATE_ID_EXPR)
1415         /* Reconstruct the TEMPLATE_ID_EXPR.  */
1416         t = build (TEMPLATE_ID_EXPR, TREE_TYPE (t),
1417                    t, TREE_OPERAND (orig_name, 1));
1418       if (! type_unknown_p (t))
1419         {
1420           mark_used (t);
1421           t = convert_from_reference (t);
1422         }
1423       return t;
1424     }
1425
1426   if (! is_aggr_type (type, 1))
1427     return error_mark_node;
1428
1429   if (TREE_CODE (name) == BIT_NOT_EXPR)
1430     {
1431       if (! check_dtor_name (type, name))
1432         error ("qualified type `%T' does not match destructor name `~%T'",
1433                   type, TREE_OPERAND (name, 0));
1434       name = dtor_identifier;
1435     }
1436
1437   if (!COMPLETE_TYPE_P (complete_type (type))
1438       && !TYPE_BEING_DEFINED (type))
1439     {
1440       error ("incomplete type `%T' does not have member `%D'", type,
1441                 name);
1442       return error_mark_node;
1443     }
1444
1445   /* Set up BASEBINFO for member lookup.  */
1446   decl = maybe_dummy_object (type, &basebinfo);
1447
1448   if (BASELINK_P (name) || DECL_P (name))
1449     member = name;
1450   else
1451     {
1452       member = lookup_member (basebinfo, name, 1, 0);
1453       
1454       if (member == error_mark_node)
1455         return error_mark_node;
1456     }
1457
1458   if (!member)
1459     {
1460       error ("`%D' is not a member of type `%T'", name, type);
1461       return error_mark_node;
1462     }
1463
1464   if (processing_template_decl)
1465     {
1466       if (TREE_CODE (orig_name) == TEMPLATE_ID_EXPR)
1467         return build_min (SCOPE_REF, TREE_TYPE (member), type, orig_name);
1468       else
1469         return build_min (SCOPE_REF, TREE_TYPE (member), type, name);
1470     }
1471
1472   if (TREE_CODE (member) == TYPE_DECL)
1473     {
1474       TREE_USED (member) = 1;
1475       return member;
1476     }
1477   /* static class members and class-specific enum
1478      values can be returned without further ado.  */
1479   if (TREE_CODE (member) == VAR_DECL || TREE_CODE (member) == CONST_DECL)
1480     {
1481       mark_used (member);
1482       return convert_from_reference (member);
1483     }
1484
1485   if (TREE_CODE (member) == FIELD_DECL && DECL_C_BIT_FIELD (member))
1486     {
1487       error ("invalid pointer to bit-field `%D'", member);
1488       return error_mark_node;
1489     }
1490
1491   /* A lot of this logic is now handled in lookup_member.  */
1492   if (BASELINK_P (member))
1493     {
1494       /* Go from the TREE_BASELINK to the member function info.  */
1495       tree fnfields = member;
1496       tree t = BASELINK_FUNCTIONS (fnfields);
1497
1498       if (TREE_CODE (orig_name) == TEMPLATE_ID_EXPR)
1499         {
1500           /* The FNFIELDS are going to contain functions that aren't
1501              necessarily templates, and templates that don't
1502              necessarily match the explicit template parameters.  We
1503              save all the functions, and the explicit parameters, and
1504              then figure out exactly what to instantiate with what
1505              arguments in instantiate_type.  */
1506
1507           if (TREE_CODE (t) != OVERLOAD)
1508             /* The code in instantiate_type which will process this
1509                expects to encounter OVERLOADs, not raw functions.  */
1510             t = ovl_cons (t, NULL_TREE);
1511
1512           t = build (TEMPLATE_ID_EXPR, TREE_TYPE (t), t,
1513                      TREE_OPERAND (orig_name, 1));
1514           t = build (OFFSET_REF, unknown_type_node, decl, t);
1515           
1516           PTRMEM_OK_P (t) = 1;
1517                   
1518           return t;
1519         }
1520
1521       if (TREE_CODE (t) != TEMPLATE_ID_EXPR && !really_overloaded_fn (t))
1522         {
1523           /* Get rid of a potential OVERLOAD around it.  */
1524           t = OVL_CURRENT (t);
1525
1526           /* Unique functions are handled easily.  */
1527
1528           /* For non-static member of base class, we need a special rule
1529              for access checking [class.protected]:
1530
1531                If the access is to form a pointer to member, the
1532                nested-name-specifier shall name the derived class
1533                (or any class derived from that class).  */
1534           if (address_p && DECL_P (t)
1535               && DECL_NONSTATIC_MEMBER_P (t))
1536             perform_or_defer_access_check (TYPE_BINFO (type), t);
1537           else
1538             perform_or_defer_access_check (basebinfo, t);
1539
1540           mark_used (t);
1541           if (DECL_STATIC_FUNCTION_P (t))
1542             return t;
1543           member = t;
1544         }
1545       else
1546         {
1547           TREE_TYPE (fnfields) = unknown_type_node;
1548           member = fnfields;
1549         }
1550     }
1551   else if (address_p && TREE_CODE (member) == FIELD_DECL)
1552     /* We need additional test besides the one in
1553        check_accessibility_of_qualified_id in case it is
1554        a pointer to non-static member.  */
1555     perform_or_defer_access_check (TYPE_BINFO (type), member);
1556
1557   if (!address_p)
1558     {
1559       /* If MEMBER is non-static, then the program has fallen afoul of
1560          [expr.prim]:
1561
1562            An id-expression that denotes a nonstatic data member or
1563            nonstatic member function of a class can only be used:
1564
1565            -- as part of a class member access (_expr.ref_) in which the
1566            object-expression refers to the member's class or a class
1567            derived from that class, or
1568
1569            -- to form a pointer to member (_expr.unary.op_), or
1570
1571            -- in the body of a nonstatic member function of that class or
1572            of a class derived from that class (_class.mfct.nonstatic_), or
1573
1574            -- in a mem-initializer for a constructor for that class or for
1575            a class derived from that class (_class.base.init_).  */
1576       if (DECL_NONSTATIC_MEMBER_FUNCTION_P (member))
1577         {
1578           /* Build a representation of a the qualified name suitable
1579              for use as the operand to "&" -- even though the "&" is
1580              not actually present.  */
1581           member = build (OFFSET_REF, TREE_TYPE (member), decl, member);
1582           /* In Microsoft mode, treat a non-static member function as if
1583              it were a pointer-to-member.  */
1584           if (flag_ms_extensions)
1585             {
1586               PTRMEM_OK_P (member) = 1;
1587               return build_unary_op (ADDR_EXPR, member, 0);
1588             }
1589           error ("invalid use of non-static member function `%D'", 
1590                  TREE_OPERAND (member, 1));
1591           return member;
1592         }
1593       else if (TREE_CODE (member) == FIELD_DECL)
1594         {
1595           error ("invalid use of non-static data member `%D'", member);
1596           return error_mark_node;
1597         }
1598       return member;
1599     }
1600
1601   /* In member functions, the form `type::name' is no longer
1602      equivalent to `this->type::name', at least not until
1603      resolve_offset_ref.  */
1604   member = build (OFFSET_REF, TREE_TYPE (member), decl, member);
1605   PTRMEM_OK_P (member) = 1;
1606   return member;
1607 }
1608
1609 /* If DECL is a `const' declaration, and its value is a known
1610    constant, then return that value.  */
1611
1612 tree
1613 decl_constant_value (tree decl)
1614 {
1615   /* When we build a COND_EXPR, we don't know whether it will be used
1616      as an lvalue or as an rvalue.  If it is an lvalue, it's not safe
1617      to replace the second and third operands with their
1618      initializers.  So, we do that here.  */
1619   if (TREE_CODE (decl) == COND_EXPR)
1620     {
1621       tree d1;
1622       tree d2;
1623
1624       d1 = decl_constant_value (TREE_OPERAND (decl, 1));
1625       d2 = decl_constant_value (TREE_OPERAND (decl, 2));
1626
1627       if (d1 != TREE_OPERAND (decl, 1) || d2 != TREE_OPERAND (decl, 2))
1628         return build (COND_EXPR,
1629                       TREE_TYPE (decl),
1630                       TREE_OPERAND (decl, 0), d1, d2);
1631     }
1632
1633   if (DECL_P (decl)
1634       && (/* Enumeration constants are constant.  */
1635           TREE_CODE (decl) == CONST_DECL
1636           /* And so are variables with a 'const' type -- unless they
1637              are also 'volatile'.  */
1638           || CP_TYPE_CONST_NON_VOLATILE_P (TREE_TYPE (decl)))
1639       && DECL_INITIAL (decl)
1640       && DECL_INITIAL (decl) != error_mark_node
1641       /* This is invalid if initial value is not constant.
1642          If it has either a function call, a memory reference,
1643          or a variable, then re-evaluating it could give different results.  */
1644       && TREE_CONSTANT (DECL_INITIAL (decl))
1645       /* Check for cases where this is sub-optimal, even though valid.  */
1646       && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR)
1647     return DECL_INITIAL (decl);
1648   return decl;
1649 }
1650 \f
1651 /* Common subroutines of build_new and build_vec_delete.  */
1652
1653 /* Call the global __builtin_delete to delete ADDR.  */
1654
1655 static tree
1656 build_builtin_delete_call (tree addr)
1657 {
1658   mark_used (global_delete_fndecl);
1659   return build_call (global_delete_fndecl, build_tree_list (NULL_TREE, addr));
1660 }
1661 \f
1662 /* Generate a C++ "new" expression. DECL is either a TREE_LIST
1663    (which needs to go through some sort of groktypename) or it
1664    is the name of the class we are newing. INIT is an initialization value.
1665    It is either an EXPRLIST, an EXPR_NO_COMMAS, or something in braces.
1666    If INIT is void_type_node, it means do *not* call a constructor
1667    for this instance.
1668
1669    For types with constructors, the data returned is initialized
1670    by the appropriate constructor.
1671
1672    Whether the type has a constructor or not, if it has a pointer
1673    to a virtual function table, then that pointer is set up
1674    here.
1675
1676    Unless I am mistaken, a call to new () will return initialized
1677    data regardless of whether the constructor itself is private or
1678    not.  NOPE; new fails if the constructor is private (jcm).
1679
1680    Note that build_new does nothing to assure that any special
1681    alignment requirements of the type are met.  Rather, it leaves
1682    it up to malloc to do the right thing.  Otherwise, folding to
1683    the right alignment cal cause problems if the user tries to later
1684    free the memory returned by `new'.
1685
1686    PLACEMENT is the `placement' list for user-defined operator new ().  */
1687
1688 tree
1689 build_new (tree placement, tree decl, tree init, int use_global_new)
1690 {
1691   tree type, rval;
1692   tree nelts = NULL_TREE, t;
1693   int has_array = 0;
1694
1695   if (decl == error_mark_node)
1696     return error_mark_node;
1697
1698   if (TREE_CODE (decl) == TREE_LIST)
1699     {
1700       tree absdcl = TREE_VALUE (decl);
1701       tree last_absdcl = NULL_TREE;
1702
1703       if (current_function_decl
1704           && DECL_CONSTRUCTOR_P (current_function_decl))
1705         my_friendly_assert (immediate_size_expand == 0, 19990926);
1706
1707       nelts = integer_one_node;
1708
1709       if (absdcl && TREE_CODE (absdcl) == CALL_EXPR)
1710         abort ();
1711       while (absdcl && TREE_CODE (absdcl) == INDIRECT_REF)
1712         {
1713           last_absdcl = absdcl;
1714           absdcl = TREE_OPERAND (absdcl, 0);
1715         }
1716
1717       if (absdcl && TREE_CODE (absdcl) == ARRAY_REF)
1718         {
1719           /* Probably meant to be a vec new.  */
1720           tree this_nelts;
1721
1722           while (TREE_OPERAND (absdcl, 0)
1723                  && TREE_CODE (TREE_OPERAND (absdcl, 0)) == ARRAY_REF)
1724             {
1725               last_absdcl = absdcl;
1726               absdcl = TREE_OPERAND (absdcl, 0);
1727             }
1728
1729           has_array = 1;
1730           this_nelts = TREE_OPERAND (absdcl, 1);
1731           if (this_nelts != error_mark_node)
1732             {
1733               if (this_nelts == NULL_TREE)
1734                 error ("new of array type fails to specify size");
1735               else if (processing_template_decl)
1736                 {
1737                   nelts = this_nelts;
1738                   absdcl = TREE_OPERAND (absdcl, 0);
1739                 }
1740               else
1741                 {
1742                   if (build_expr_type_conversion (WANT_INT | WANT_ENUM, 
1743                                                   this_nelts, false)
1744                       == NULL_TREE)
1745                     pedwarn ("size in array new must have integral type");
1746
1747                   this_nelts = save_expr (cp_convert (sizetype, this_nelts));
1748                   absdcl = TREE_OPERAND (absdcl, 0);
1749                   if (this_nelts == integer_zero_node)
1750                     {
1751                       warning ("zero size array reserves no space");
1752                       nelts = integer_zero_node;
1753                     }
1754                   else
1755                     nelts = cp_build_binary_op (MULT_EXPR, nelts, this_nelts);
1756                 }
1757             }
1758           else
1759             nelts = integer_zero_node;
1760         }
1761
1762       if (last_absdcl)
1763         TREE_OPERAND (last_absdcl, 0) = absdcl;
1764       else
1765         TREE_VALUE (decl) = absdcl;
1766
1767       type = groktypename (decl);
1768       if (! type || type == error_mark_node)
1769         return error_mark_node;
1770     }
1771   else if (TREE_CODE (decl) == IDENTIFIER_NODE)
1772     {
1773       if (IDENTIFIER_HAS_TYPE_VALUE (decl))
1774         {
1775           /* An aggregate type.  */
1776           type = IDENTIFIER_TYPE_VALUE (decl);
1777           decl = TYPE_MAIN_DECL (type);
1778         }
1779       else
1780         {
1781           /* A builtin type.  */
1782           decl = lookup_name (decl, 1);
1783           my_friendly_assert (TREE_CODE (decl) == TYPE_DECL, 215);
1784           type = TREE_TYPE (decl);
1785         }
1786     }
1787   else if (TREE_CODE (decl) == TYPE_DECL)
1788     {
1789       type = TREE_TYPE (decl);
1790     }
1791   else
1792     {
1793       type = decl;
1794       decl = TYPE_MAIN_DECL (type);
1795     }
1796
1797   if (processing_template_decl)
1798     {
1799       if (has_array)
1800         t = tree_cons (tree_cons (NULL_TREE, type, NULL_TREE),
1801                        build_min_nt (ARRAY_REF, NULL_TREE, nelts),
1802                        NULL_TREE);
1803       else
1804         t = type;
1805         
1806       rval = build_min (NEW_EXPR, build_pointer_type (type), 
1807                         placement, t, init);
1808       NEW_EXPR_USE_GLOBAL (rval) = use_global_new;
1809       TREE_SIDE_EFFECTS (rval) = 1;
1810       return rval;
1811     }
1812
1813   /* ``A reference cannot be created by the new operator.  A reference
1814      is not an object (8.2.2, 8.4.3), so a pointer to it could not be
1815      returned by new.'' ARM 5.3.3 */
1816   if (TREE_CODE (type) == REFERENCE_TYPE)
1817     {
1818       error ("new cannot be applied to a reference type");
1819       type = TREE_TYPE (type);
1820     }
1821
1822   if (TREE_CODE (type) == FUNCTION_TYPE)
1823     {
1824       error ("new cannot be applied to a function type");
1825       return error_mark_node;
1826     }
1827
1828   /* When the object being created is an array, the new-expression yields a
1829      pointer to the initial element (if any) of the array.  For example,
1830      both new int and new int[10] return an int*.  5.3.4.  */
1831   if (TREE_CODE (type) == ARRAY_TYPE && has_array == 0)
1832     {
1833       nelts = array_type_nelts_top (type);
1834       has_array = 1;
1835       type = TREE_TYPE (type);
1836     }
1837
1838   if (has_array)
1839     t = build_nt (ARRAY_REF, type, nelts);
1840   else
1841     t = type;
1842
1843   rval = build (NEW_EXPR, build_pointer_type (type), placement, t, init);
1844   NEW_EXPR_USE_GLOBAL (rval) = use_global_new;
1845   TREE_SIDE_EFFECTS (rval) = 1;
1846   rval = build_new_1 (rval);
1847   if (rval == error_mark_node)
1848     return error_mark_node;
1849
1850   /* Wrap it in a NOP_EXPR so warn_if_unused_value doesn't complain.  */
1851   rval = build1 (NOP_EXPR, TREE_TYPE (rval), rval);
1852   TREE_NO_UNUSED_WARNING (rval) = 1;
1853
1854   return rval;
1855 }
1856
1857 /* Given a Java class, return a decl for the corresponding java.lang.Class.  */
1858
1859 tree
1860 build_java_class_ref (tree type)
1861 {
1862   tree name = NULL_TREE, class_decl;
1863   static tree CL_suffix = NULL_TREE;
1864   if (CL_suffix == NULL_TREE)
1865     CL_suffix = get_identifier("class$");
1866   if (jclass_node == NULL_TREE)
1867     {
1868       jclass_node = IDENTIFIER_GLOBAL_VALUE (get_identifier ("jclass"));
1869       if (jclass_node == NULL_TREE)
1870         fatal_error ("call to Java constructor, while `jclass' undefined");
1871
1872       jclass_node = TREE_TYPE (jclass_node);
1873     }
1874
1875   /* Mangle the class$ field.  */
1876   {
1877     tree field;
1878     for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
1879       if (DECL_NAME (field) == CL_suffix)
1880         {
1881           mangle_decl (field);
1882           name = DECL_ASSEMBLER_NAME (field);
1883           break;
1884         }
1885     if (!field)
1886       internal_error ("can't find class$");
1887     }
1888
1889   class_decl = IDENTIFIER_GLOBAL_VALUE (name);
1890   if (class_decl == NULL_TREE)
1891     {
1892       class_decl = build_decl (VAR_DECL, name, TREE_TYPE (jclass_node));
1893       TREE_STATIC (class_decl) = 1;
1894       DECL_EXTERNAL (class_decl) = 1;
1895       TREE_PUBLIC (class_decl) = 1;
1896       DECL_ARTIFICIAL (class_decl) = 1;
1897       DECL_IGNORED_P (class_decl) = 1;
1898       pushdecl_top_level (class_decl);
1899       make_decl_rtl (class_decl, NULL);
1900     }
1901   return class_decl;
1902 }
1903
1904 /* Returns the size of the cookie to use when allocating an array
1905    whose elements have the indicated TYPE.  Assumes that it is already
1906    known that a cookie is needed.  */
1907
1908 static tree
1909 get_cookie_size (tree type)
1910 {
1911   tree cookie_size;
1912
1913   /* We need to allocate an additional max (sizeof (size_t), alignof
1914      (true_type)) bytes.  */
1915   tree sizetype_size;
1916   tree type_align;
1917   
1918   sizetype_size = size_in_bytes (sizetype);
1919   type_align = size_int (TYPE_ALIGN_UNIT (type));
1920   if (INT_CST_LT_UNSIGNED (type_align, sizetype_size))
1921     cookie_size = sizetype_size;
1922   else
1923     cookie_size = type_align;
1924
1925   return cookie_size;
1926 }
1927
1928 /* Called from cplus_expand_expr when expanding a NEW_EXPR.  The return
1929    value is immediately handed to expand_expr.  */
1930
1931 static tree
1932 build_new_1 (tree exp)
1933 {
1934   tree placement, init;
1935   tree true_type, size, rval;
1936   /* The type of the new-expression.  (This type is always a pointer
1937      type.)  */
1938   tree pointer_type;
1939   /* The type pointed to by POINTER_TYPE.  */
1940   tree type;
1941   /* The type being allocated.  For "new T[...]" this will be an
1942      ARRAY_TYPE.  */
1943   tree full_type;
1944   /* A pointer type pointing to to the FULL_TYPE.  */
1945   tree full_pointer_type;
1946   tree outer_nelts = NULL_TREE;
1947   tree nelts = NULL_TREE;
1948   tree alloc_call, alloc_expr;
1949   /* The address returned by the call to "operator new".  This node is
1950      a VAR_DECL and is therefore reusable.  */
1951   tree alloc_node;
1952   tree alloc_fn;
1953   tree cookie_expr, init_expr;
1954   int has_array = 0;
1955   enum tree_code code;
1956   int nothrow, check_new;
1957   /* Nonzero if the user wrote `::new' rather than just `new'.  */
1958   int globally_qualified_p;
1959   int use_java_new = 0;
1960   /* If non-NULL, the number of extra bytes to allocate at the
1961      beginning of the storage allocated for an array-new expression in
1962      order to store the number of elements.  */
1963   tree cookie_size = NULL_TREE;
1964   /* True if the function we are calling is a placement allocation
1965      function.  */
1966   bool placement_allocation_fn_p;
1967   tree args = NULL_TREE;
1968   /* True if the storage must be initialized, either by a constructor
1969      or due to an explicit new-initializer.  */
1970   bool is_initialized;
1971   /* The address of the thing allocated, not including any cookie.  In
1972      particular, if an array cookie is in use, DATA_ADDR is the
1973      address of the first array element.  This node is a VAR_DECL, and
1974      is therefore reusable.  */
1975   tree data_addr;
1976   tree init_preeval_expr = NULL_TREE;
1977
1978   placement = TREE_OPERAND (exp, 0);
1979   type = TREE_OPERAND (exp, 1);
1980   init = TREE_OPERAND (exp, 2);
1981   globally_qualified_p = NEW_EXPR_USE_GLOBAL (exp);
1982
1983   if (TREE_CODE (type) == ARRAY_REF)
1984     {
1985       has_array = 1;
1986       nelts = outer_nelts = TREE_OPERAND (type, 1);
1987       type = TREE_OPERAND (type, 0);
1988
1989       /* Use an incomplete array type to avoid VLA headaches.  */
1990       full_type = build_cplus_array_type (type, NULL_TREE);
1991     }
1992   else
1993     full_type = type;
1994
1995   true_type = type;
1996
1997   code = has_array ? VEC_NEW_EXPR : NEW_EXPR;
1998
1999   /* If our base type is an array, then make sure we know how many elements
2000      it has.  */
2001   while (TREE_CODE (true_type) == ARRAY_TYPE)
2002     {
2003       tree this_nelts = array_type_nelts_top (true_type);
2004       nelts = cp_build_binary_op (MULT_EXPR, nelts, this_nelts);
2005       true_type = TREE_TYPE (true_type);
2006     }
2007
2008   if (!complete_type_or_else (true_type, exp))
2009     return error_mark_node;
2010
2011   if (TREE_CODE (true_type) == VOID_TYPE)
2012     {
2013       error ("invalid type `void' for new");
2014       return error_mark_node;
2015     }
2016
2017   if (abstract_virtuals_error (NULL_TREE, true_type))
2018     return error_mark_node;
2019
2020   is_initialized = (TYPE_NEEDS_CONSTRUCTING (type) || init);
2021   if (CP_TYPE_CONST_P (true_type) && !is_initialized)
2022     {
2023       error ("uninitialized const in `new' of `%#T'", true_type);
2024       return error_mark_node;
2025     }
2026
2027   size = size_in_bytes (true_type);
2028   if (has_array)
2029     size = size_binop (MULT_EXPR, size, convert (sizetype, nelts));
2030
2031   /* Allocate the object.  */
2032   if (! placement && TYPE_FOR_JAVA (true_type))
2033     {
2034       tree class_addr, alloc_decl;
2035       tree class_decl = build_java_class_ref (true_type);
2036       tree class_size = size_in_bytes (true_type);
2037       static const char alloc_name[] = "_Jv_AllocObject";
2038       use_java_new = 1;
2039       if (!get_global_value_if_present (get_identifier (alloc_name), 
2040                                         &alloc_decl))
2041         {
2042           error ("call to Java constructor with `%s' undefined", alloc_name);
2043           return error_mark_node;
2044         }
2045       else if (really_overloaded_fn (alloc_decl))
2046         {
2047           error ("`%D' should never be overloaded", alloc_decl);
2048           return error_mark_node;
2049         }
2050       alloc_decl = OVL_CURRENT (alloc_decl);
2051       class_addr = build1 (ADDR_EXPR, jclass_node, class_decl);
2052       alloc_call = (build_function_call
2053                     (alloc_decl,
2054                      tree_cons (NULL_TREE, class_addr,
2055                                 build_tree_list (NULL_TREE, class_size))));
2056     }
2057   else
2058     {
2059       tree fnname;
2060       tree fns;
2061
2062       fnname = ansi_opname (code);
2063
2064       if (!globally_qualified_p 
2065           && CLASS_TYPE_P (true_type)
2066           && (has_array
2067               ? TYPE_HAS_ARRAY_NEW_OPERATOR (true_type)
2068               : TYPE_HAS_NEW_OPERATOR (true_type)))
2069         {
2070           /* Use a class-specific operator new.  */
2071           /* If a cookie is required, add some extra space.  */
2072           if (has_array && TYPE_VEC_NEW_USES_COOKIE (true_type))
2073             {
2074               cookie_size = get_cookie_size (true_type);
2075               size = size_binop (PLUS_EXPR, size, cookie_size);
2076             }
2077           /* Create the argument list.  */
2078           args = tree_cons (NULL_TREE, size, placement);
2079           /* Do name-lookup to find the appropriate operator.  */
2080           fns = lookup_fnfields (true_type, fnname, /*protect=*/2);
2081           if (!fns)
2082             {
2083               /* See PR 15967. This should never happen (and it is
2084                  fixed correctly in mainline), but on the release branch
2085                  we prefer this less-intrusive approacch.  */
2086               error ("no suitable or ambiguous `%D' found in class `%T'",
2087                      fnname, true_type);
2088               return error_mark_node;
2089             }
2090           if (TREE_CODE (fns) == TREE_LIST)
2091             {
2092               error ("request for member `%D' is ambiguous", fnname);
2093               print_candidates (fns);
2094               return error_mark_node;
2095             }
2096           alloc_call = build_new_method_call (build_dummy_object (true_type),
2097                                               fns, args,
2098                                               /*conversion_path=*/NULL_TREE,
2099                                               LOOKUP_NORMAL);
2100         }
2101       else
2102         {
2103           /* Use a global operator new.  */
2104           /* See if a cookie might be required.  */
2105           if (has_array && TYPE_VEC_NEW_USES_COOKIE (true_type))
2106             cookie_size = get_cookie_size (true_type);
2107           else
2108             cookie_size = NULL_TREE;
2109
2110           alloc_call = build_operator_new_call (fnname, placement, 
2111                                                 &size, &cookie_size);
2112         }
2113     }
2114
2115   if (alloc_call == error_mark_node)
2116     return error_mark_node;
2117
2118   /* In the simple case, we can stop now.  */
2119   pointer_type = build_pointer_type (type);
2120   if (!cookie_size && !is_initialized)
2121     return build_nop (pointer_type, alloc_call);
2122
2123   /* While we're working, use a pointer to the type we've actually
2124      allocated. Store the result of the call in a variable so that we
2125      can use it more than once.  */
2126   full_pointer_type = build_pointer_type (full_type);
2127   alloc_expr = get_target_expr (build_nop (full_pointer_type, alloc_call));
2128   alloc_node = TARGET_EXPR_SLOT (alloc_expr);
2129
2130   /* Strip any COMPOUND_EXPRs from ALLOC_CALL.  */
2131   while (TREE_CODE (alloc_call) == COMPOUND_EXPR) 
2132     alloc_call = TREE_OPERAND (alloc_call, 1);
2133   alloc_fn = get_callee_fndecl (alloc_call);
2134   my_friendly_assert (alloc_fn != NULL_TREE, 20020325);
2135
2136   /* Now, check to see if this function is actually a placement
2137      allocation function.  This can happen even when PLACEMENT is NULL
2138      because we might have something like:
2139
2140        struct S { void* operator new (size_t, int i = 0); };
2141
2142      A call to `new S' will get this allocation function, even though
2143      there is no explicit placement argument.  If there is more than
2144      one argument, or there are variable arguments, then this is a
2145      placement allocation function.  */
2146   placement_allocation_fn_p 
2147     = (type_num_arguments (TREE_TYPE (alloc_fn)) > 1 
2148        || varargs_function_p (alloc_fn));
2149
2150   /* Preevaluate the placement args so that we don't reevaluate them for a
2151      placement delete.  */
2152   if (placement_allocation_fn_p)
2153     {
2154       tree inits;
2155       stabilize_call (alloc_call, &inits);
2156       if (inits)
2157         alloc_expr = build (COMPOUND_EXPR, TREE_TYPE (alloc_expr), inits,
2158                             alloc_expr);
2159     }
2160
2161   /*        unless an allocation function is declared with an empty  excep-
2162      tion-specification  (_except.spec_),  throw(), it indicates failure to
2163      allocate storage by throwing a bad_alloc exception  (clause  _except_,
2164      _lib.bad.alloc_); it returns a non-null pointer otherwise If the allo-
2165      cation function is declared  with  an  empty  exception-specification,
2166      throw(), it returns null to indicate failure to allocate storage and a
2167      non-null pointer otherwise.
2168
2169      So check for a null exception spec on the op new we just called.  */
2170
2171   nothrow = TYPE_NOTHROW_P (TREE_TYPE (alloc_fn));
2172   check_new = (flag_check_new || nothrow) && ! use_java_new;
2173
2174   if (cookie_size)
2175     {
2176       tree cookie;
2177
2178       /* Adjust so we're pointing to the start of the object.  */
2179       data_addr = get_target_expr (build (PLUS_EXPR, full_pointer_type,
2180                                           alloc_node, cookie_size));
2181
2182       /* Store the number of bytes allocated so that we can know how
2183          many elements to destroy later.  We use the last sizeof
2184          (size_t) bytes to store the number of elements.  */
2185       cookie = build (MINUS_EXPR, build_pointer_type (sizetype),
2186                       data_addr, size_in_bytes (sizetype));
2187       cookie = build_indirect_ref (cookie, NULL);
2188
2189       cookie_expr = build (MODIFY_EXPR, sizetype, cookie, nelts);
2190       data_addr = TARGET_EXPR_SLOT (data_addr);
2191     }
2192   else
2193     {
2194       cookie_expr = NULL_TREE;
2195       data_addr = alloc_node;
2196     }
2197
2198   /* Now initialize the allocated object.  Note that we preevaluate the
2199      initialization expression, apart from the actual constructor call or
2200      assignment--we do this because we want to delay the allocation as long
2201      as possible in order to minimize the size of the exception region for
2202      placement delete.  */
2203   if (is_initialized)
2204     {
2205       bool stable;
2206
2207       init_expr = build_indirect_ref (data_addr, NULL);
2208
2209       if (init == void_zero_node)
2210         init = build_default_init (full_type, nelts);
2211       else if (init && has_array)
2212         pedwarn ("ISO C++ forbids initialization in array new");
2213
2214       if (has_array)
2215         {
2216           init_expr
2217             = build_vec_init (init_expr,
2218                               cp_build_binary_op (MINUS_EXPR, outer_nelts,
2219                                                   integer_one_node),
2220                               init, /*from_array=*/0);
2221
2222           /* An array initialization is stable because the initialization
2223              of each element is a full-expression, so the temporaries don't
2224              leak out.  */
2225           stable = true;
2226         }
2227       else if (TYPE_NEEDS_CONSTRUCTING (type))
2228         {
2229           init_expr = build_special_member_call (init_expr, 
2230                                                  complete_ctor_identifier,
2231                                                  init, TYPE_BINFO (true_type),
2232                                                  LOOKUP_NORMAL);
2233           stable = stabilize_init (init_expr, &init_preeval_expr);
2234         }
2235       else
2236         {
2237           /* We are processing something like `new int (10)', which
2238              means allocate an int, and initialize it with 10.  */
2239
2240           if (TREE_CODE (init) == TREE_LIST)
2241             init = build_x_compound_expr_from_list (init, "new initializer");
2242
2243           else if (TREE_CODE (init) == CONSTRUCTOR
2244                    && TREE_TYPE (init) == NULL_TREE)
2245             abort ();
2246
2247           init_expr = build_modify_expr (init_expr, INIT_EXPR, init);
2248           stable = stabilize_init (init_expr, &init_preeval_expr);
2249         }
2250
2251       if (init_expr == error_mark_node)
2252         return error_mark_node;
2253
2254       /* If any part of the object initialization terminates by throwing an
2255          exception and a suitable deallocation function can be found, the
2256          deallocation function is called to free the memory in which the
2257          object was being constructed, after which the exception continues
2258          to propagate in the context of the new-expression. If no
2259          unambiguous matching deallocation function can be found,
2260          propagating the exception does not cause the object's memory to be
2261          freed.  */
2262       if (flag_exceptions && ! use_java_new)
2263         {
2264           enum tree_code dcode = has_array ? VEC_DELETE_EXPR : DELETE_EXPR;
2265           tree cleanup;
2266           int flags = (LOOKUP_NORMAL 
2267                        | (globally_qualified_p * LOOKUP_GLOBAL));
2268
2269           /* The Standard is unclear here, but the right thing to do
2270              is to use the same method for finding deallocation
2271              functions that we use for finding allocation functions.  */
2272           flags |= LOOKUP_SPECULATIVELY;
2273
2274           cleanup = build_op_delete_call (dcode, alloc_node, size, flags,
2275                                           (placement_allocation_fn_p 
2276                                            ? alloc_call : NULL_TREE));
2277
2278           if (!cleanup)
2279             /* We're done.  */;
2280           else if (stable)
2281             /* This is much simpler if we were able to preevaluate all of
2282                the arguments to the constructor call.  */
2283             init_expr = build (TRY_CATCH_EXPR, void_type_node,
2284                                init_expr, cleanup);
2285           else
2286             /* Ack!  First we allocate the memory.  Then we set our sentry
2287                variable to true, and expand a cleanup that deletes the
2288                memory if sentry is true.  Then we run the constructor, and
2289                finally clear the sentry.
2290
2291                We need to do this because we allocate the space first, so
2292                if there are any temporaries with cleanups in the
2293                constructor args and we weren't able to preevaluate them, we
2294                need this EH region to extend until end of full-expression
2295                to preserve nesting.  */
2296             {
2297               tree end, sentry, begin;
2298
2299               begin = get_target_expr (boolean_true_node);
2300               CLEANUP_EH_ONLY (begin) = 1;
2301
2302               sentry = TARGET_EXPR_SLOT (begin);
2303
2304               TARGET_EXPR_CLEANUP (begin)
2305                 = build (COND_EXPR, void_type_node, sentry,
2306                          cleanup, void_zero_node);
2307
2308               end = build (MODIFY_EXPR, TREE_TYPE (sentry),
2309                            sentry, boolean_false_node);
2310
2311               init_expr
2312                 = build (COMPOUND_EXPR, void_type_node, begin,
2313                          build (COMPOUND_EXPR, void_type_node, init_expr,
2314                                 end));
2315             }
2316             
2317         }
2318     }
2319   else
2320     init_expr = NULL_TREE;
2321
2322   /* Now build up the return value in reverse order.  */
2323
2324   rval = data_addr;
2325
2326   if (init_expr)
2327     rval = build (COMPOUND_EXPR, TREE_TYPE (rval), init_expr, rval);
2328   if (cookie_expr)
2329     rval = build (COMPOUND_EXPR, TREE_TYPE (rval), cookie_expr, rval);
2330
2331   if (rval == alloc_node)
2332     /* If we don't have an initializer or a cookie, strip the TARGET_EXPR
2333        and return the call (which doesn't need to be adjusted).  */
2334     rval = TARGET_EXPR_INITIAL (alloc_expr);
2335   else
2336     {
2337       if (check_new)
2338         {
2339           tree ifexp = cp_build_binary_op (NE_EXPR, alloc_node,
2340                                            integer_zero_node);
2341           rval = build_conditional_expr (ifexp, rval, alloc_node);
2342         }
2343
2344       /* Perform the allocation before anything else, so that ALLOC_NODE
2345          has been initialized before we start using it.  */
2346       rval = build (COMPOUND_EXPR, TREE_TYPE (rval), alloc_expr, rval);
2347     }
2348
2349   if (init_preeval_expr)
2350     rval = build (COMPOUND_EXPR, TREE_TYPE (rval), init_preeval_expr, rval);
2351
2352   /* Convert to the final type.  */
2353   rval = build_nop (pointer_type, rval);
2354
2355   /* A new-expression is never an lvalue.  */
2356   if (real_lvalue_p (rval))
2357     rval = build1 (NON_LVALUE_EXPR, TREE_TYPE (rval), rval);
2358
2359   return rval;
2360 }
2361 \f
2362 static tree
2363 build_vec_delete_1 (tree base, tree maxindex, tree type,
2364     special_function_kind auto_delete_vec, int use_global_delete)
2365 {
2366   tree virtual_size;
2367   tree ptype = build_pointer_type (type = complete_type (type));
2368   tree size_exp = size_in_bytes (type);
2369
2370   /* Temporary variables used by the loop.  */
2371   tree tbase, tbase_init;
2372
2373   /* This is the body of the loop that implements the deletion of a
2374      single element, and moves temp variables to next elements.  */
2375   tree body;
2376
2377   /* This is the LOOP_EXPR that governs the deletion of the elements.  */
2378   tree loop = 0;
2379
2380   /* This is the thing that governs what to do after the loop has run.  */
2381   tree deallocate_expr = 0;
2382
2383   /* This is the BIND_EXPR which holds the outermost iterator of the
2384      loop.  It is convenient to set this variable up and test it before
2385      executing any other code in the loop.
2386      This is also the containing expression returned by this function.  */
2387   tree controller = NULL_TREE;
2388
2389   /* We should only have 1-D arrays here.  */
2390   if (TREE_CODE (type) == ARRAY_TYPE)
2391     abort ();
2392
2393   if (! IS_AGGR_TYPE (type) || TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
2394     goto no_destructor;
2395
2396   /* The below is short by the cookie size.  */
2397   virtual_size = size_binop (MULT_EXPR, size_exp,
2398                              convert (sizetype, maxindex));
2399
2400   tbase = create_temporary_var (ptype);
2401   tbase_init = build_modify_expr (tbase, NOP_EXPR,
2402                                   fold (build (PLUS_EXPR, ptype,
2403                                                base,
2404                                                virtual_size)));
2405   DECL_REGISTER (tbase) = 1;
2406   controller = build (BIND_EXPR, void_type_node, tbase, NULL_TREE, NULL_TREE);
2407   TREE_SIDE_EFFECTS (controller) = 1;
2408
2409   body = build (EXIT_EXPR, void_type_node,
2410                 build (EQ_EXPR, boolean_type_node, base, tbase));
2411   body = build_compound_expr
2412     (body, build_modify_expr (tbase, NOP_EXPR,
2413                               build (MINUS_EXPR, ptype, tbase, size_exp)));
2414   body = build_compound_expr
2415     (body, build_delete (ptype, tbase, sfk_complete_destructor,
2416                          LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1));
2417
2418   loop = build (LOOP_EXPR, void_type_node, body);
2419   loop = build_compound_expr (tbase_init, loop);
2420
2421  no_destructor:
2422   /* If the delete flag is one, or anything else with the low bit set,
2423      delete the storage.  */
2424   if (auto_delete_vec != sfk_base_destructor)
2425     {
2426       tree base_tbd;
2427
2428       /* The below is short by the cookie size.  */
2429       virtual_size = size_binop (MULT_EXPR, size_exp,
2430                                  convert (sizetype, maxindex));
2431
2432       if (! TYPE_VEC_NEW_USES_COOKIE (type))
2433         /* no header */
2434         base_tbd = base;
2435       else
2436         {
2437           tree cookie_size;
2438
2439           cookie_size = get_cookie_size (type);
2440           base_tbd 
2441             = cp_convert (ptype,
2442                           cp_build_binary_op (MINUS_EXPR,
2443                                               cp_convert (string_type_node, 
2444                                                           base),
2445                                               cookie_size));
2446           /* True size with header.  */
2447           virtual_size = size_binop (PLUS_EXPR, virtual_size, cookie_size);
2448         }
2449
2450       if (auto_delete_vec == sfk_deleting_destructor)
2451         deallocate_expr = build_x_delete (base_tbd,
2452                                           2 | use_global_delete,
2453                                           virtual_size);
2454     }
2455
2456   body = loop;
2457   if (!deallocate_expr)
2458     ;
2459   else if (!body)
2460     body = deallocate_expr;
2461   else
2462     body = build_compound_expr (body, deallocate_expr);
2463   
2464   if (!body)
2465     body = integer_zero_node;
2466   
2467   /* Outermost wrapper: If pointer is null, punt.  */
2468   body = fold (build (COND_EXPR, void_type_node,
2469                       fold (build (NE_EXPR, boolean_type_node, base,
2470                                    integer_zero_node)),
2471                       body, integer_zero_node));
2472   body = build1 (NOP_EXPR, void_type_node, body);
2473
2474   if (controller)
2475     {
2476       TREE_OPERAND (controller, 1) = body;
2477       body = controller;
2478     }
2479
2480   if (TREE_CODE (base) == SAVE_EXPR)
2481     /* Pre-evaluate the SAVE_EXPR outside of the BIND_EXPR.  */
2482     body = build (COMPOUND_EXPR, void_type_node, base, body);
2483
2484   return convert_to_void (body, /*implicit=*/NULL);
2485 }
2486
2487 /* Create an unnamed variable of the indicated TYPE.  */ 
2488
2489 tree
2490 create_temporary_var (tree type)
2491 {
2492   tree decl;
2493  
2494   decl = build_decl (VAR_DECL, NULL_TREE, type);
2495   TREE_USED (decl) = 1;
2496   DECL_ARTIFICIAL (decl) = 1;
2497   DECL_SOURCE_LOCATION (decl) = input_location;
2498   DECL_IGNORED_P (decl) = 1;
2499   DECL_CONTEXT (decl) = current_function_decl;
2500
2501   return decl;
2502 }
2503
2504 /* Create a new temporary variable of the indicated TYPE, initialized
2505    to INIT.
2506
2507    It is not entered into current_binding_level, because that breaks
2508    things when it comes time to do final cleanups (which take place
2509    "outside" the binding contour of the function).  */
2510
2511 static tree
2512 get_temp_regvar (tree type, tree init)
2513 {
2514   tree decl;
2515
2516   decl = create_temporary_var (type);
2517   add_decl_stmt (decl);
2518   
2519   finish_expr_stmt (build_modify_expr (decl, INIT_EXPR, init));
2520
2521   return decl;
2522 }
2523
2524 /* `build_vec_init' returns tree structure that performs
2525    initialization of a vector of aggregate types.
2526
2527    BASE is a reference to the vector, of ARRAY_TYPE.
2528    MAXINDEX is the maximum index of the array (one less than the
2529      number of elements).  It is only used if
2530      TYPE_DOMAIN (TREE_TYPE (BASE)) == NULL_TREE.
2531    INIT is the (possibly NULL) initializer.
2532
2533    FROM_ARRAY is 0 if we should init everything with INIT
2534    (i.e., every element initialized from INIT).
2535    FROM_ARRAY is 1 if we should index into INIT in parallel
2536    with initialization of DECL.
2537    FROM_ARRAY is 2 if we should index into INIT in parallel,
2538    but use assignment instead of initialization.  */
2539
2540 tree
2541 build_vec_init (tree base, tree maxindex, tree init, int from_array)
2542 {
2543   tree rval;
2544   tree base2 = NULL_TREE;
2545   tree size;
2546   tree itype = NULL_TREE;
2547   tree iterator;
2548   /* The type of the array.  */
2549   tree atype = TREE_TYPE (base);
2550   /* The type of an element in the array.  */
2551   tree type = TREE_TYPE (atype);
2552   /* The type of a pointer to an element in the array.  */
2553   tree ptype;
2554   tree stmt_expr;
2555   tree compound_stmt;
2556   int destroy_temps;
2557   tree try_block = NULL_TREE;
2558   tree try_body = NULL_TREE;
2559   int num_initialized_elts = 0;
2560   bool is_global;
2561   
2562   if (TYPE_DOMAIN (atype))
2563     maxindex = array_type_nelts (atype);
2564
2565   if (maxindex == NULL_TREE || maxindex == error_mark_node)
2566     return error_mark_node;
2567
2568   if (init
2569       && (from_array == 2
2570           ? (!CLASS_TYPE_P (type) || !TYPE_HAS_COMPLEX_ASSIGN_REF (type))
2571           : !TYPE_NEEDS_CONSTRUCTING (type))
2572       && ((TREE_CODE (init) == CONSTRUCTOR
2573            /* Don't do this if the CONSTRUCTOR might contain something
2574               that might throw and require us to clean up.  */
2575            && (CONSTRUCTOR_ELTS (init) == NULL_TREE
2576                || ! TYPE_HAS_NONTRIVIAL_DESTRUCTOR (target_type (type))))
2577           || from_array))
2578     {
2579       /* Do non-default initialization of POD arrays resulting from
2580          brace-enclosed initializers.  In this case, digest_init and
2581          store_constructor will handle the semantics for us.  */
2582
2583       stmt_expr = build (INIT_EXPR, atype, base, init);
2584       return stmt_expr;
2585     }
2586
2587   maxindex = cp_convert (ptrdiff_type_node, maxindex);
2588   ptype = build_pointer_type (type);
2589   size = size_in_bytes (type);
2590   if (TREE_CODE (TREE_TYPE (base)) == ARRAY_TYPE)
2591     base = cp_convert (ptype, decay_conversion (base));
2592
2593   /* The code we are generating looks like:
2594      ({
2595        T* t1 = (T*) base;
2596        T* rval = t1;
2597        ptrdiff_t iterator = maxindex;
2598        try {
2599          for (; iterator != -1; --iterator) {
2600            ... initialize *t1 ...
2601            ++t1;
2602          }
2603        } catch (...) {
2604          ... destroy elements that were constructed ...
2605        }
2606        rval;
2607      })
2608        
2609      We can omit the try and catch blocks if we know that the
2610      initialization will never throw an exception, or if the array
2611      elements do not have destructors.  We can omit the loop completely if
2612      the elements of the array do not have constructors.  
2613
2614      We actually wrap the entire body of the above in a STMT_EXPR, for
2615      tidiness.  
2616
2617      When copying from array to another, when the array elements have
2618      only trivial copy constructors, we should use __builtin_memcpy
2619      rather than generating a loop.  That way, we could take advantage
2620      of whatever cleverness the back-end has for dealing with copies
2621      of blocks of memory.  */
2622
2623   is_global = begin_init_stmts (&stmt_expr, &compound_stmt);
2624   destroy_temps = stmts_are_full_exprs_p ();
2625   current_stmt_tree ()->stmts_are_full_exprs_p = 0;
2626   rval = get_temp_regvar (ptype, base);
2627   base = get_temp_regvar (ptype, rval);
2628   iterator = get_temp_regvar (ptrdiff_type_node, maxindex);
2629
2630   /* Protect the entire array initialization so that we can destroy
2631      the partially constructed array if an exception is thrown.
2632      But don't do this if we're assigning.  */
2633   if (flag_exceptions && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
2634       && from_array != 2)
2635     {
2636       try_block = begin_try_block ();
2637       try_body = begin_compound_stmt (/*has_no_scope=*/true);
2638     }
2639
2640   if (init != NULL_TREE && TREE_CODE (init) == CONSTRUCTOR)
2641     {
2642       /* Do non-default initialization of non-POD arrays resulting from
2643          brace-enclosed initializers.  */
2644
2645       tree elts;
2646       from_array = 0;
2647
2648       for (elts = CONSTRUCTOR_ELTS (init); elts; elts = TREE_CHAIN (elts))
2649         {
2650           tree elt = TREE_VALUE (elts);
2651           tree baseref = build1 (INDIRECT_REF, type, base);
2652
2653           num_initialized_elts++;
2654
2655           current_stmt_tree ()->stmts_are_full_exprs_p = 1;
2656           if (IS_AGGR_TYPE (type) || TREE_CODE (type) == ARRAY_TYPE)
2657             finish_expr_stmt (build_aggr_init (baseref, elt, 0));
2658           else
2659             finish_expr_stmt (build_modify_expr (baseref, NOP_EXPR,
2660                                                  elt));
2661           current_stmt_tree ()->stmts_are_full_exprs_p = 0;
2662
2663           finish_expr_stmt (build_unary_op (PREINCREMENT_EXPR, base, 0));
2664           finish_expr_stmt (build_unary_op (PREDECREMENT_EXPR, iterator, 0));
2665         }
2666
2667       /* Clear out INIT so that we don't get confused below.  */
2668       init = NULL_TREE;
2669     }
2670   else if (from_array)
2671     {
2672       /* If initializing one array from another, initialize element by
2673          element.  We rely upon the below calls the do argument
2674          checking.  */ 
2675       if (init)
2676         {
2677           base2 = decay_conversion (init);
2678           itype = TREE_TYPE (base2);
2679           base2 = get_temp_regvar (itype, base2);
2680           itype = TREE_TYPE (itype);
2681         }
2682       else if (TYPE_LANG_SPECIFIC (type)
2683                && TYPE_NEEDS_CONSTRUCTING (type)
2684                && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
2685         {
2686           error ("initializer ends prematurely");
2687           return error_mark_node;
2688         }
2689     }
2690
2691   /* Now, default-initialize any remaining elements.  We don't need to
2692      do that if a) the type does not need constructing, or b) we've
2693      already initialized all the elements.
2694
2695      We do need to keep going if we're copying an array.  */
2696
2697   if (from_array
2698       || (TYPE_NEEDS_CONSTRUCTING (type)
2699           && ! (host_integerp (maxindex, 0)
2700                 && (num_initialized_elts
2701                     == tree_low_cst (maxindex, 0) + 1))))
2702     {
2703       /* If the ITERATOR is equal to -1, then we don't have to loop;
2704          we've already initialized all the elements.  */
2705       tree for_stmt;
2706       tree for_body;
2707       tree elt_init;
2708
2709       for_stmt = begin_for_stmt ();
2710       finish_for_init_stmt (for_stmt);
2711       finish_for_cond (build (NE_EXPR, boolean_type_node,
2712                               iterator, integer_minus_one_node),
2713                        for_stmt);
2714       finish_for_expr (build_unary_op (PREDECREMENT_EXPR, iterator, 0),
2715                        for_stmt);
2716
2717       /* Otherwise, loop through the elements.  */
2718       for_body = begin_compound_stmt (/*has_no_scope=*/true);
2719
2720       if (from_array)
2721         {
2722           tree to = build1 (INDIRECT_REF, type, base);
2723           tree from;
2724
2725           if (base2)
2726             from = build1 (INDIRECT_REF, itype, base2);
2727           else
2728             from = NULL_TREE;
2729
2730           if (from_array == 2)
2731             elt_init = build_modify_expr (to, NOP_EXPR, from);
2732           else if (TYPE_NEEDS_CONSTRUCTING (type))
2733             elt_init = build_aggr_init (to, from, 0);
2734           else if (from)
2735             elt_init = build_modify_expr (to, NOP_EXPR, from);
2736           else
2737             abort ();
2738         }
2739       else if (TREE_CODE (type) == ARRAY_TYPE)
2740         {
2741           if (init != 0)
2742             sorry
2743               ("cannot initialize multi-dimensional array with initializer");
2744           elt_init = build_vec_init (build1 (INDIRECT_REF, type, base),
2745                                      0, 0, 0);
2746         }
2747       else
2748         elt_init = build_aggr_init (build1 (INDIRECT_REF, type, base), 
2749                                     init, 0);
2750       
2751       current_stmt_tree ()->stmts_are_full_exprs_p = 1;
2752       finish_expr_stmt (elt_init);
2753       current_stmt_tree ()->stmts_are_full_exprs_p = 0;
2754
2755       finish_expr_stmt (build_unary_op (PREINCREMENT_EXPR, base, 0));
2756       if (base2)
2757         finish_expr_stmt (build_unary_op (PREINCREMENT_EXPR, base2, 0));
2758
2759       finish_compound_stmt (for_body);
2760       finish_for_stmt (for_stmt);
2761     }
2762
2763   /* Make sure to cleanup any partially constructed elements.  */
2764   if (flag_exceptions && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
2765       && from_array != 2)
2766     {
2767       tree e;
2768       tree m = cp_build_binary_op (MINUS_EXPR, maxindex, iterator);
2769
2770       /* Flatten multi-dimensional array since build_vec_delete only
2771          expects one-dimensional array.  */
2772       if (TREE_CODE (type) == ARRAY_TYPE)
2773         {
2774           m = cp_build_binary_op (MULT_EXPR, m,
2775                                   array_type_nelts_total (type));
2776           type = strip_array_types (type);
2777         }
2778
2779       finish_compound_stmt (try_body);
2780       finish_cleanup_try_block (try_block);
2781       e = build_vec_delete_1 (rval, m, type, sfk_base_destructor,
2782                               /*use_global_delete=*/0);
2783       finish_cleanup (e, try_block);
2784     }
2785
2786   /* The value of the array initialization is the array itself, RVAL
2787      is a pointer to the first element.  */
2788   finish_stmt_expr_expr (rval);
2789
2790   stmt_expr = finish_init_stmts (is_global, stmt_expr, compound_stmt);
2791
2792   /* Now convert make the result have the correct type.  */
2793   atype = build_pointer_type (atype);
2794   stmt_expr = build1 (NOP_EXPR, atype, stmt_expr);
2795   stmt_expr = build_indirect_ref (stmt_expr, NULL);
2796   
2797   current_stmt_tree ()->stmts_are_full_exprs_p = destroy_temps;
2798   return stmt_expr;
2799 }
2800
2801 /* Free up storage of type TYPE, at address ADDR.
2802
2803    TYPE is a POINTER_TYPE and can be ptr_type_node for no special type
2804    of pointer.
2805
2806    VIRTUAL_SIZE is the amount of storage that was allocated, and is
2807    used as the second argument to operator delete.  It can include
2808    things like padding and magic size cookies.  It has virtual in it,
2809    because if you have a base pointer and you delete through a virtual
2810    destructor, it should be the size of the dynamic object, not the
2811    static object, see Free Store 12.5 ISO C++.
2812
2813    This does not call any destructors.  */
2814
2815 tree
2816 build_x_delete (tree addr, int which_delete, tree virtual_size)
2817 {
2818   int use_global_delete = which_delete & 1;
2819   int use_vec_delete = !!(which_delete & 2);
2820   enum tree_code code = use_vec_delete ? VEC_DELETE_EXPR : DELETE_EXPR;
2821   int flags = LOOKUP_NORMAL | (use_global_delete * LOOKUP_GLOBAL);
2822
2823   return build_op_delete_call (code, addr, virtual_size, flags, NULL_TREE);
2824 }
2825
2826 /* Call the DTOR_KIND destructor for EXP.  FLAGS are as for
2827    build_delete.  */
2828
2829 static tree
2830 build_dtor_call (tree exp, special_function_kind dtor_kind, int flags)
2831 {
2832   tree name;
2833   tree fn;
2834   switch (dtor_kind)
2835     {
2836     case sfk_complete_destructor:
2837       name = complete_dtor_identifier;
2838       break;
2839
2840     case sfk_base_destructor:
2841       name = base_dtor_identifier;
2842       break;
2843
2844     case sfk_deleting_destructor:
2845       name = deleting_dtor_identifier;
2846       break;
2847
2848     default:
2849       abort ();
2850     }
2851
2852   exp = convert_from_reference (exp);
2853   fn = lookup_fnfields (TREE_TYPE (exp), name, /*protect=*/2);
2854   return build_new_method_call (exp, fn, 
2855                                 /*args=*/NULL_TREE,
2856                                 /*conversion_path=*/NULL_TREE,
2857                                 flags);
2858 }
2859
2860 /* Generate a call to a destructor. TYPE is the type to cast ADDR to.
2861    ADDR is an expression which yields the store to be destroyed.
2862    AUTO_DELETE is the name of the destructor to call, i.e., either
2863    sfk_complete_destructor, sfk_base_destructor, or
2864    sfk_deleting_destructor.
2865
2866    FLAGS is the logical disjunction of zero or more LOOKUP_
2867    flags.  See cp-tree.h for more info.  */
2868
2869 tree
2870 build_delete (tree type, tree addr, special_function_kind auto_delete,
2871     int flags, int use_global_delete)
2872 {
2873   tree expr;
2874
2875   if (addr == error_mark_node)
2876     return error_mark_node;
2877
2878   /* Can happen when CURRENT_EXCEPTION_OBJECT gets its type
2879      set to `error_mark_node' before it gets properly cleaned up.  */
2880   if (type == error_mark_node)
2881     return error_mark_node;
2882
2883   type = TYPE_MAIN_VARIANT (type);
2884
2885   if (TREE_CODE (type) == POINTER_TYPE)
2886     {
2887       bool complete_p = true;
2888
2889       type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
2890       if (TREE_CODE (type) == ARRAY_TYPE)
2891         goto handle_array;
2892
2893       /* We don't want to warn about delete of void*, only other
2894           incomplete types.  Deleting other incomplete types
2895           invokes undefined behavior, but it is not ill-formed, so
2896           compile to something that would even do The Right Thing
2897           (TM) should the type have a trivial dtor and no delete
2898           operator.  */
2899       if (!VOID_TYPE_P (type))
2900         {
2901           complete_type (type);
2902           if (!COMPLETE_TYPE_P (type))
2903             {
2904               warning ("possible problem detected in invocation of "
2905                        "delete operator:");
2906               cxx_incomplete_type_diagnostic (addr, type, 1);
2907               inform ("neither the destructor nor the class-specific "
2908                       "operator delete will be called, even if they are "
2909                       "declared when the class is defined.");
2910               complete_p = false;
2911             }
2912         }
2913       if (VOID_TYPE_P (type) || !complete_p || !IS_AGGR_TYPE (type))
2914         /* Call the builtin operator delete.  */
2915         return build_builtin_delete_call (addr);
2916       if (TREE_SIDE_EFFECTS (addr))
2917         addr = save_expr (addr);
2918
2919       /* Throw away const and volatile on target type of addr.  */
2920       addr = convert_force (build_pointer_type (type), addr, 0);
2921     }
2922   else if (TREE_CODE (type) == ARRAY_TYPE)
2923     {
2924     handle_array:
2925       
2926       if (TYPE_DOMAIN (type) == NULL_TREE)
2927         {
2928           error ("unknown array size in delete");
2929           return error_mark_node;
2930         }
2931       return build_vec_delete (addr, array_type_nelts (type),
2932                                auto_delete, use_global_delete);
2933     }
2934   else
2935     {
2936       /* Don't check PROTECT here; leave that decision to the
2937          destructor.  If the destructor is accessible, call it,
2938          else report error.  */
2939       addr = build_unary_op (ADDR_EXPR, addr, 0);
2940       if (TREE_SIDE_EFFECTS (addr))
2941         addr = save_expr (addr);
2942
2943       addr = convert_force (build_pointer_type (type), addr, 0);
2944     }
2945
2946   my_friendly_assert (IS_AGGR_TYPE (type), 220);
2947
2948   if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
2949     {
2950       if (auto_delete != sfk_deleting_destructor)
2951         return void_zero_node;
2952
2953       return build_op_delete_call
2954         (DELETE_EXPR, addr, cxx_sizeof_nowarn (type),
2955          LOOKUP_NORMAL | (use_global_delete * LOOKUP_GLOBAL),
2956          NULL_TREE);
2957     }
2958   else
2959     {
2960       tree do_delete = NULL_TREE;
2961       tree ifexp;
2962
2963       my_friendly_assert (TYPE_HAS_DESTRUCTOR (type), 20011213);
2964
2965       /* For `::delete x', we must not use the deleting destructor
2966          since then we would not be sure to get the global `operator
2967          delete'.  */
2968       if (use_global_delete && auto_delete == sfk_deleting_destructor)
2969         {
2970           /* We will use ADDR multiple times so we must save it.  */
2971           addr = save_expr (addr);
2972           /* Delete the object.  */
2973           do_delete = build_builtin_delete_call (addr);
2974           /* Otherwise, treat this like a complete object destructor
2975              call.  */
2976           auto_delete = sfk_complete_destructor;
2977         }
2978       /* If the destructor is non-virtual, there is no deleting
2979          variant.  Instead, we must explicitly call the appropriate
2980          `operator delete' here.  */
2981       else if (!DECL_VIRTUAL_P (CLASSTYPE_DESTRUCTORS (type))
2982                && auto_delete == sfk_deleting_destructor)
2983         {
2984           /* We will use ADDR multiple times so we must save it.  */
2985           addr = save_expr (addr);
2986           /* Build the call.  */
2987           do_delete = build_op_delete_call (DELETE_EXPR,
2988                                             addr,
2989                                             cxx_sizeof_nowarn (type),
2990                                             LOOKUP_NORMAL,
2991                                             NULL_TREE);
2992           /* Call the complete object destructor.  */
2993           auto_delete = sfk_complete_destructor;
2994         }
2995       else if (auto_delete == sfk_deleting_destructor
2996                && TYPE_GETS_REG_DELETE (type))
2997         {
2998           /* Make sure we have access to the member op delete, even though
2999              we'll actually be calling it from the destructor.  */
3000           build_op_delete_call (DELETE_EXPR, addr, cxx_sizeof_nowarn (type),
3001                                 LOOKUP_NORMAL, NULL_TREE);
3002         }
3003
3004       expr = build_dtor_call (build_indirect_ref (addr, NULL),
3005                               auto_delete, flags);
3006       if (do_delete)
3007         expr = build (COMPOUND_EXPR, void_type_node, expr, do_delete);
3008
3009       if (flags & LOOKUP_DESTRUCTOR)
3010         /* Explicit destructor call; don't check for null pointer.  */
3011         ifexp = integer_one_node;
3012       else
3013         /* Handle deleting a null pointer.  */
3014         ifexp = fold (cp_build_binary_op (NE_EXPR, addr, integer_zero_node));
3015
3016       if (ifexp != integer_one_node)
3017         expr = build (COND_EXPR, void_type_node,
3018                       ifexp, expr, void_zero_node);
3019
3020       return expr;
3021     }
3022 }
3023
3024 /* At the beginning of a destructor, push cleanups that will call the
3025    destructors for our base classes and members.
3026
3027    Called from begin_destructor_body.  */
3028
3029 void
3030 push_base_cleanups (void)
3031 {
3032   tree binfos;
3033   int i, n_baseclasses;
3034   tree member;
3035   tree expr;
3036
3037   /* Run destructors for all virtual baseclasses.  */
3038   if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
3039     {
3040       tree vbases;
3041       tree cond = (condition_conversion
3042                    (build (BIT_AND_EXPR, integer_type_node,
3043                            current_in_charge_parm,
3044                            integer_two_node)));
3045
3046       vbases = CLASSTYPE_VBASECLASSES (current_class_type);
3047       /* The CLASSTYPE_VBASECLASSES list is in initialization
3048          order, which is also the right order for pushing cleanups.  */
3049       for (; vbases;
3050            vbases = TREE_CHAIN (vbases))
3051         {
3052           tree vbase = TREE_VALUE (vbases);
3053           tree base_type = BINFO_TYPE (vbase);
3054
3055           if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (base_type))
3056             {
3057               expr = build_special_member_call (current_class_ref, 
3058                                                 base_dtor_identifier,
3059                                                 NULL_TREE,
3060                                                 vbase,
3061                                                 (LOOKUP_NORMAL 
3062                                                  | LOOKUP_NONVIRTUAL));
3063               expr = build (COND_EXPR, void_type_node, cond,
3064                             expr, void_zero_node);
3065               finish_decl_cleanup (NULL_TREE, expr);
3066             }
3067         }
3068     }
3069
3070   binfos = BINFO_BASETYPES (TYPE_BINFO (current_class_type));
3071   n_baseclasses = CLASSTYPE_N_BASECLASSES (current_class_type);
3072
3073   /* Take care of the remaining baseclasses.  */
3074   for (i = 0; i < n_baseclasses; i++)
3075     {
3076       tree base_binfo = TREE_VEC_ELT (binfos, i);
3077       if (TYPE_HAS_TRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo))
3078           || TREE_VIA_VIRTUAL (base_binfo))
3079         continue;
3080
3081       expr = build_special_member_call (current_class_ref, 
3082                                         base_dtor_identifier,
3083                                         NULL_TREE, base_binfo, 
3084                                         LOOKUP_NORMAL | LOOKUP_NONVIRTUAL);
3085       finish_decl_cleanup (NULL_TREE, expr);
3086     }
3087
3088   for (member = TYPE_FIELDS (current_class_type); member;
3089        member = TREE_CHAIN (member))
3090     {
3091       if (TREE_CODE (member) != FIELD_DECL || DECL_ARTIFICIAL (member))
3092         continue;
3093       if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (member)))
3094         {
3095           tree this_member = (build_class_member_access_expr 
3096                               (current_class_ref, member, 
3097                                /*access_path=*/NULL_TREE,
3098                                /*preserve_reference=*/false));
3099           tree this_type = TREE_TYPE (member);
3100           expr = build_delete (this_type, this_member,
3101                                sfk_complete_destructor,
3102                                LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_NORMAL,
3103                                0);
3104           finish_decl_cleanup (NULL_TREE, expr);
3105         }
3106     }
3107 }
3108
3109 /* For type TYPE, delete the virtual baseclass objects of DECL.  */
3110
3111 tree
3112 build_vbase_delete (tree type, tree decl)
3113 {
3114   tree vbases = CLASSTYPE_VBASECLASSES (type);
3115   tree result;
3116   tree addr = build_unary_op (ADDR_EXPR, decl, 0);
3117
3118   my_friendly_assert (addr != error_mark_node, 222);
3119
3120   for (result = convert_to_void (integer_zero_node, NULL);
3121        vbases; vbases = TREE_CHAIN (vbases))
3122     {
3123       tree base_addr = convert_force
3124         (build_pointer_type (BINFO_TYPE (TREE_VALUE (vbases))), addr, 0);
3125       tree base_delete = build_delete
3126         (TREE_TYPE (base_addr), base_addr, sfk_base_destructor,
3127          LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 0);
3128       
3129       result = build_compound_expr (result, base_delete);
3130     }
3131   return result;
3132 }
3133
3134 /* Build a C++ vector delete expression.
3135    MAXINDEX is the number of elements to be deleted.
3136    ELT_SIZE is the nominal size of each element in the vector.
3137    BASE is the expression that should yield the store to be deleted.
3138    This function expands (or synthesizes) these calls itself.
3139    AUTO_DELETE_VEC says whether the container (vector) should be deallocated.
3140
3141    This also calls delete for virtual baseclasses of elements of the vector.
3142
3143    Update: MAXINDEX is no longer needed.  The size can be extracted from the
3144    start of the vector for pointers, and from the type for arrays.  We still
3145    use MAXINDEX for arrays because it happens to already have one of the
3146    values we'd have to extract.  (We could use MAXINDEX with pointers to
3147    confirm the size, and trap if the numbers differ; not clear that it'd
3148    be worth bothering.)  */
3149
3150 tree
3151 build_vec_delete (tree base, tree maxindex,
3152     special_function_kind auto_delete_vec, int use_global_delete)
3153 {
3154   tree type;
3155   tree rval;
3156   tree base_init = NULL_TREE;
3157
3158   type = TREE_TYPE (base);
3159
3160   if (TREE_CODE (type) == POINTER_TYPE)
3161     {
3162       /* Step back one from start of vector, and read dimension.  */
3163       tree cookie_addr;
3164
3165       if (TREE_SIDE_EFFECTS (base))
3166         {
3167           base_init = get_target_expr (base);
3168           base = TARGET_EXPR_SLOT (base_init);
3169         }
3170       type = strip_array_types (TREE_TYPE (type));
3171       cookie_addr = build (MINUS_EXPR,
3172                            build_pointer_type (sizetype),
3173                            base,
3174                            TYPE_SIZE_UNIT (sizetype));
3175       maxindex = build_indirect_ref (cookie_addr, NULL);
3176     }
3177   else if (TREE_CODE (type) == ARRAY_TYPE)
3178     {
3179       /* Get the total number of things in the array, maxindex is a
3180          bad name.  */
3181       maxindex = array_type_nelts_total (type);
3182       type = strip_array_types (type);
3183       base = build_unary_op (ADDR_EXPR, base, 1);
3184       if (TREE_SIDE_EFFECTS (base))
3185         {
3186           base_init = get_target_expr (base);
3187           base = TARGET_EXPR_SLOT (base_init);
3188         }
3189     }
3190   else
3191     {
3192       if (base != error_mark_node)
3193         error ("type to vector delete is neither pointer or array type");
3194       return error_mark_node;
3195     }
3196
3197   rval = build_vec_delete_1 (base, maxindex, type, auto_delete_vec,
3198                              use_global_delete);
3199   if (base_init)
3200     rval = build (COMPOUND_EXPR, TREE_TYPE (rval), base_init, rval);
3201
3202   return rval;
3203 }