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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [cp/] [init.c] - Blame information for rev 833

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

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

powered by: WebSVN 2.1.0

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