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