OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.5.1/] [gcc/] [cp/] [init.c] - Blame information for rev 461

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.