xref: /dragonfly/contrib/gcc-4.7/gcc/cp/init.c (revision d9f85b33)
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 
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 
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 
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       base = mark_rvalue_use (base);
3919       if (TREE_SIDE_EFFECTS (base))
3920 	{
3921 	  base_init = get_target_expr (base);
3922 	  base = TARGET_EXPR_SLOT (base_init);
3923 	}
3924       type = strip_array_types (TREE_TYPE (type));
3925       cookie_addr = fold_build1_loc (input_location, NEGATE_EXPR,
3926 				 sizetype, TYPE_SIZE_UNIT (sizetype));
3927       cookie_addr = fold_build_pointer_plus (fold_convert (size_ptr_type, base),
3928 					     cookie_addr);
3929       maxindex = cp_build_indirect_ref (cookie_addr, RO_NULL, complain);
3930     }
3931   else if (TREE_CODE (type) == ARRAY_TYPE)
3932     {
3933       /* Get the total number of things in the array, maxindex is a
3934 	 bad name.  */
3935       maxindex = array_type_nelts_total (type);
3936       type = strip_array_types (type);
3937       base = cp_build_addr_expr (base, complain);
3938       if (base == error_mark_node)
3939 	return error_mark_node;
3940       if (TREE_SIDE_EFFECTS (base))
3941 	{
3942 	  base_init = get_target_expr (base);
3943 	  base = TARGET_EXPR_SLOT (base_init);
3944 	}
3945     }
3946   else
3947     {
3948       if (base != error_mark_node && !(complain & tf_error))
3949 	error ("type to vector delete is neither pointer or array type");
3950       return error_mark_node;
3951     }
3952 
3953   rval = build_vec_delete_1 (base, maxindex, type, auto_delete_vec,
3954 			     use_global_delete, complain);
3955   if (base_init && rval != error_mark_node)
3956     rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), base_init, rval);
3957 
3958   return rval;
3959 }
3960