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