OSDN Git Service

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