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