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