OSDN Git Service

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