]> 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 1003 expr = fold_build3 (COND_EXPR, void_type_node,
ba47d38d 1004 c_common_truthvalue_conversion (input_location, flag),
7866705a 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))
ba47d38d
AH
1880 nelts = cp_build_binary_op (input_location,
1881 MULT_EXPR, nelts,
5ade1ed2
DG
1882 array_type_nelts_top (elt_type),
1883 complain);
5566b478 1884
d746e87d 1885 if (TREE_CODE (elt_type) == VOID_TYPE)
e1cd6e56 1886 {
5ade1ed2
DG
1887 if (complain & tf_error)
1888 error ("invalid type %<void%> for new");
e1cd6e56
MS
1889 return error_mark_node;
1890 }
1891
d746e87d 1892 if (abstract_virtuals_error (NULL_TREE, elt_type))
a7a64a77 1893 return error_mark_node;
8926095f 1894
d746e87d 1895 is_initialized = (TYPE_NEEDS_CONSTRUCTING (elt_type) || init);
b87d79e6
JM
1896
1897 if (CP_TYPE_CONST_P (elt_type) && !init
1898 && !type_has_user_provided_default_constructor (elt_type))
f4f4610e 1899 {
5ade1ed2
DG
1900 if (complain & tf_error)
1901 error ("uninitialized const in %<new%> of %q#T", elt_type);
f4f4610e
MM
1902 return error_mark_node;
1903 }
1904
d746e87d
MM
1905 size = size_in_bytes (elt_type);
1906 if (array_p)
9117ccad 1907 {
d746e87d
MM
1908 size = size_binop (MULT_EXPR, size, convert (sizetype, nelts));
1909 if (vla_p)
1910 {
1911 tree n, bitsize;
1912
1913 /* Do our own VLA layout. Setting TYPE_SIZE/_UNIT is
1914 necessary in order for the <INIT_EXPR <*foo> <CONSTRUCTOR
1915 ...>> to be valid. */
1916 TYPE_SIZE_UNIT (full_type) = size;
1917 n = convert (bitsizetype, nelts);
1918 bitsize = size_binop (MULT_EXPR, TYPE_SIZE (elt_type), n);
1919 TYPE_SIZE (full_type) = bitsize;
1920 }
9117ccad 1921 }
a28e3c7f 1922
63c9a190
MM
1923 alloc_fn = NULL_TREE;
1924
e92cc029 1925 /* Allocate the object. */
d746e87d 1926 if (! placement && TYPE_FOR_JAVA (elt_type))
743f140d 1927 {
63c9a190 1928 tree class_addr;
d746e87d 1929 tree class_decl = build_java_class_ref (elt_type);
8b60264b 1930 static const char alloc_name[] = "_Jv_AllocObject";
6de9cd9a 1931
a3d536f1
VR
1932 if (class_decl == error_mark_node)
1933 return error_mark_node;
1934
743f140d 1935 use_java_new = 1;
c8094d83 1936 if (!get_global_value_if_present (get_identifier (alloc_name),
63c9a190 1937 &alloc_fn))
b1e5b86c 1938 {
5ade1ed2
DG
1939 if (complain & tf_error)
1940 error ("call to Java constructor with %qs undefined", alloc_name);
6961a592
GB
1941 return error_mark_node;
1942 }
63c9a190 1943 else if (really_overloaded_fn (alloc_fn))
b1e5b86c 1944 {
5ade1ed2
DG
1945 if (complain & tf_error)
1946 error ("%qD should never be overloaded", alloc_fn);
6961a592
GB
1947 return error_mark_node;
1948 }
63c9a190 1949 alloc_fn = OVL_CURRENT (alloc_fn);
743f140d 1950 class_addr = build1 (ADDR_EXPR, jclass_node, class_decl);
5ade1ed2 1951 alloc_call = (cp_build_function_call
63c9a190 1952 (alloc_fn,
5ade1ed2
DG
1953 build_tree_list (NULL_TREE, class_addr),
1954 complain));
743f140d 1955 }
9e1e64ec 1956 else if (TYPE_FOR_JAVA (elt_type) && MAYBE_CLASS_TYPE_P (elt_type))
360f866c
JJ
1957 {
1958 error ("Java class %q#T object allocated using placement new", elt_type);
1959 return error_mark_node;
1960 }
8d08fdba
MS
1961 else
1962 {
834c6dff 1963 tree fnname;
9f880ef9 1964 tree fns;
834c6dff 1965
d746e87d 1966 fnname = ansi_opname (array_p ? VEC_NEW_EXPR : NEW_EXPR);
834c6dff 1967
c8094d83 1968 if (!globally_qualified_p
d746e87d
MM
1969 && CLASS_TYPE_P (elt_type)
1970 && (array_p
1971 ? TYPE_HAS_ARRAY_NEW_OPERATOR (elt_type)
1972 : TYPE_HAS_NEW_OPERATOR (elt_type)))
089d6ea7
MM
1973 {
1974 /* Use a class-specific operator new. */
1975 /* If a cookie is required, add some extra space. */
d746e87d 1976 if (array_p && TYPE_VEC_NEW_USES_COOKIE (elt_type))
089d6ea7 1977 {
d746e87d 1978 cookie_size = targetm.cxx.get_cookie_size (elt_type);
089d6ea7
MM
1979 size = size_binop (PLUS_EXPR, size, cookie_size);
1980 }
1981 /* Create the argument list. */
1982 args = tree_cons (NULL_TREE, size, placement);
9f880ef9 1983 /* Do name-lookup to find the appropriate operator. */
d746e87d 1984 fns = lookup_fnfields (elt_type, fnname, /*protect=*/2);
a85cb0d7
VR
1985 if (fns == NULL_TREE)
1986 {
5ade1ed2
DG
1987 if (complain & tf_error)
1988 error ("no suitable %qD found in class %qT", fnname, elt_type);
a85cb0d7
VR
1989 return error_mark_node;
1990 }
9f880ef9
MM
1991 if (TREE_CODE (fns) == TREE_LIST)
1992 {
5ade1ed2
DG
1993 if (complain & tf_error)
1994 {
1995 error ("request for member %qD is ambiguous", fnname);
1996 print_candidates (fns);
1997 }
9f880ef9
MM
1998 return error_mark_node;
1999 }
d746e87d 2000 alloc_call = build_new_method_call (build_dummy_object (elt_type),
9f880ef9
MM
2001 fns, args,
2002 /*conversion_path=*/NULL_TREE,
63c9a190 2003 LOOKUP_NORMAL,
5ade1ed2
DG
2004 &alloc_fn,
2005 complain);
089d6ea7 2006 }
834c6dff 2007 else
089d6ea7
MM
2008 {
2009 /* Use a global operator new. */
125e6594 2010 /* See if a cookie might be required. */
d746e87d
MM
2011 if (array_p && TYPE_VEC_NEW_USES_COOKIE (elt_type))
2012 cookie_size = targetm.cxx.get_cookie_size (elt_type);
125e6594
MM
2013 else
2014 cookie_size = NULL_TREE;
2015
c8094d83 2016 alloc_call = build_operator_new_call (fnname, placement,
63c9a190
MM
2017 &size, &cookie_size,
2018 &alloc_fn);
089d6ea7 2019 }
8d08fdba
MS
2020 }
2021
96790071 2022 if (alloc_call == error_mark_node)
2bb5d995
JM
2023 return error_mark_node;
2024
63c9a190
MM
2025 gcc_assert (alloc_fn != NULL_TREE);
2026
a9de800a
JJ
2027 /* If PLACEMENT is a simple pointer type and is not passed by reference,
2028 then copy it into PLACEMENT_EXPR. */
2029 if (!processing_template_decl
2030 && placement != NULL_TREE
2031 && TREE_CHAIN (placement) == NULL_TREE
2032 && TREE_CODE (TREE_TYPE (TREE_VALUE (placement))) == POINTER_TYPE
2033 && TREE_CODE (alloc_call) == CALL_EXPR
2034 && call_expr_nargs (alloc_call) == 2
2035 && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (alloc_call, 0))) == INTEGER_TYPE
2036 && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (alloc_call, 1))) == POINTER_TYPE)
2037 {
2038 tree placement_arg = CALL_EXPR_ARG (alloc_call, 1);
2039
2040 if (INTEGRAL_TYPE_P (TREE_TYPE (TREE_TYPE (placement_arg)))
2041 || VOID_TYPE_P (TREE_TYPE (TREE_TYPE (placement_arg))))
2042 {
2043 placement_expr = get_target_expr (TREE_VALUE (placement));
2044 CALL_EXPR_ARG (alloc_call, 1)
2045 = convert (TREE_TYPE (placement_arg), placement_expr);
2046 }
2047 }
2048
a6111661
JM
2049 /* In the simple case, we can stop now. */
2050 pointer_type = build_pointer_type (type);
2051 if (!cookie_size && !is_initialized)
058dcc25
ILT
2052 {
2053 rval = build_nop (pointer_type, alloc_call);
2054 if (placement != NULL)
412bbe81 2055 rval = avoid_placement_new_aliasing (rval, placement_expr);
058dcc25
ILT
2056 return rval;
2057 }
a6111661 2058
10ee5386
JM
2059 /* Store the result of the allocation call in a variable so that we can
2060 use it more than once. */
2061 alloc_expr = get_target_expr (alloc_call);
a6111661
JM
2062 alloc_node = TARGET_EXPR_SLOT (alloc_expr);
2063
2064 /* Strip any COMPOUND_EXPRs from ALLOC_CALL. */
c8094d83 2065 while (TREE_CODE (alloc_call) == COMPOUND_EXPR)
a6111661 2066 alloc_call = TREE_OPERAND (alloc_call, 1);
089d6ea7 2067
3f41ffd8
MM
2068 /* Now, check to see if this function is actually a placement
2069 allocation function. This can happen even when PLACEMENT is NULL
2070 because we might have something like:
2071
2072 struct S { void* operator new (size_t, int i = 0); };
2073
2074 A call to `new S' will get this allocation function, even though
2075 there is no explicit placement argument. If there is more than
2076 one argument, or there are variable arguments, then this is a
2077 placement allocation function. */
c8094d83
MS
2078 placement_allocation_fn_p
2079 = (type_num_arguments (TREE_TYPE (alloc_fn)) > 1
46ff5047 2080 || varargs_function_p (alloc_fn));
96790071 2081
a6111661
JM
2082 /* Preevaluate the placement args so that we don't reevaluate them for a
2083 placement delete. */
2084 if (placement_allocation_fn_p)
2085 {
6de9cd9a
DN
2086 tree inits;
2087 stabilize_call (alloc_call, &inits);
a6111661 2088 if (inits)
f293ce4b
RS
2089 alloc_expr = build2 (COMPOUND_EXPR, TREE_TYPE (alloc_expr), inits,
2090 alloc_expr);
a6111661
JM
2091 }
2092
047f64a3
JM
2093 /* unless an allocation function is declared with an empty excep-
2094 tion-specification (_except.spec_), throw(), it indicates failure to
2095 allocate storage by throwing a bad_alloc exception (clause _except_,
2096 _lib.bad.alloc_); it returns a non-null pointer otherwise If the allo-
2097 cation function is declared with an empty exception-specification,
2098 throw(), it returns null to indicate failure to allocate storage and a
2099 non-null pointer otherwise.
2100
2101 So check for a null exception spec on the op new we just called. */
2102
46ff5047 2103 nothrow = TYPE_NOTHROW_P (TREE_TYPE (alloc_fn));
743f140d 2104 check_new = (flag_check_new || nothrow) && ! use_java_new;
047f64a3 2105
089d6ea7 2106 if (cookie_size)
8d08fdba 2107 {
96790071 2108 tree cookie;
46e995e0 2109 tree cookie_ptr;
b5119fa1 2110 tree size_ptr_type;
f4f4610e
MM
2111
2112 /* Adjust so we're pointing to the start of the object. */
10ee5386
JM
2113 data_addr = build2 (POINTER_PLUS_EXPR, TREE_TYPE (alloc_node),
2114 alloc_node, cookie_size);
96790071 2115
834c6dff 2116 /* Store the number of bytes allocated so that we can know how
3461fba7
NS
2117 many elements to destroy later. We use the last sizeof
2118 (size_t) bytes to store the number of elements. */
10ee5386
JM
2119 cookie_ptr = size_binop (MINUS_EXPR, cookie_size, size_in_bytes (sizetype));
2120 cookie_ptr = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (alloc_node),
2121 alloc_node, cookie_ptr);
b5119fa1 2122 size_ptr_type = build_pointer_type (sizetype);
10ee5386 2123 cookie_ptr = fold_convert (size_ptr_type, cookie_ptr);
5ade1ed2 2124 cookie = cp_build_indirect_ref (cookie_ptr, NULL, complain);
1f84ec23 2125
f293ce4b 2126 cookie_expr = build2 (MODIFY_EXPR, sizetype, cookie, nelts);
46e995e0
PB
2127
2128 if (targetm.cxx.cookie_has_size ())
2129 {
2130 /* Also store the element size. */
b2ec1738
DD
2131 cookie_ptr = build2 (POINTER_PLUS_EXPR, size_ptr_type, cookie_ptr,
2132 fold_build1 (NEGATE_EXPR, sizetype,
2133 size_in_bytes (sizetype)));
2134
5ade1ed2 2135 cookie = cp_build_indirect_ref (cookie_ptr, NULL, complain);
f293ce4b 2136 cookie = build2 (MODIFY_EXPR, sizetype, cookie,
10ee5386 2137 size_in_bytes (elt_type));
f293ce4b
RS
2138 cookie_expr = build2 (COMPOUND_EXPR, TREE_TYPE (cookie_expr),
2139 cookie, cookie_expr);
46e995e0 2140 }
8d08fdba 2141 }
96790071 2142 else
8b5e2ce4
JM
2143 {
2144 cookie_expr = NULL_TREE;
2145 data_addr = alloc_node;
2146 }
8d08fdba 2147
10ee5386
JM
2148 /* Now use a pointer to the type we've actually allocated. */
2149 full_pointer_type = build_pointer_type (full_type);
2150 data_addr = fold_convert (full_pointer_type, data_addr);
2151
6de9cd9a
DN
2152 /* Now initialize the allocated object. Note that we preevaluate the
2153 initialization expression, apart from the actual constructor call or
2154 assignment--we do this because we want to delay the allocation as long
2155 as possible in order to minimize the size of the exception region for
2156 placement delete. */
f4f4610e 2157 if (is_initialized)
8d08fdba 2158 {
6de9cd9a 2159 bool stable;
844ae01d 2160 bool explicit_value_init_p = false;
6de9cd9a 2161
5ade1ed2 2162 init_expr = cp_build_indirect_ref (data_addr, NULL, complain);
f30efcb7 2163
844ae01d 2164 if (init == void_zero_node)
6de9cd9a 2165 {
844ae01d
JM
2166 init = NULL_TREE;
2167 explicit_value_init_p = true;
2168 }
b84f4651 2169
844ae01d
JM
2170 if (array_p)
2171 {
2172 if (init)
5ade1ed2
DG
2173 {
2174 if (complain & tf_error)
cbe5f3b3 2175 permerror (input_location, "ISO C++ forbids initialization in array new");
5ade1ed2
DG
2176 else
2177 return error_mark_node;
2178 }
6de9cd9a
DN
2179 init_expr
2180 = build_vec_init (init_expr,
ba47d38d
AH
2181 cp_build_binary_op (input_location,
2182 MINUS_EXPR, outer_nelts,
5ade1ed2
DG
2183 integer_one_node,
2184 complain),
3db45ab5 2185 init,
844ae01d 2186 explicit_value_init_p,
5ade1ed2
DG
2187 /*from_array=*/0,
2188 complain);
6de9cd9a
DN
2189
2190 /* An array initialization is stable because the initialization
2191 of each element is a full-expression, so the temporaries don't
2192 leak out. */
2193 stable = true;
2194 }
f30efcb7 2195 else
8d08fdba 2196 {
844ae01d 2197 if (TYPE_NEEDS_CONSTRUCTING (type) && !explicit_value_init_p)
b84f4651
MM
2198 {
2199 init_expr = build_special_member_call (init_expr,
2200 complete_ctor_identifier,
2201 init, elt_type,
5ade1ed2
DG
2202 LOOKUP_NORMAL,
2203 complain);
844ae01d
JM
2204 }
2205 else if (explicit_value_init_p)
2206 {
2207 /* Something like `new int()'. */
2208 init_expr = build2 (INIT_EXPR, full_type,
2209 init_expr, build_value_init (full_type));
b84f4651 2210 }
8dc2b103 2211 else
b84f4651
MM
2212 {
2213 /* We are processing something like `new int (10)', which
2214 means allocate an int, and initialize it with 10. */
3db45ab5 2215
b84f4651 2216 if (TREE_CODE (init) == TREE_LIST)
3db45ab5 2217 init = build_x_compound_expr_from_list (init,
b84f4651
MM
2218 "new initializer");
2219 else
2220 gcc_assert (TREE_CODE (init) != CONSTRUCTOR
2221 || TREE_TYPE (init) != NULL_TREE);
3db45ab5 2222
5ade1ed2
DG
2223 init_expr = cp_build_modify_expr (init_expr, INIT_EXPR, init,
2224 complain);
b84f4651 2225 }
844ae01d 2226 stable = stabilize_init (init_expr, &init_preeval_expr);
96790071
JM
2227 }
2228
2229 if (init_expr == error_mark_node)
2230 return error_mark_node;
1f109f0f 2231
20c39572
JM
2232 /* If any part of the object initialization terminates by throwing an
2233 exception and a suitable deallocation function can be found, the
2234 deallocation function is called to free the memory in which the
2235 object was being constructed, after which the exception continues
2236 to propagate in the context of the new-expression. If no
2237 unambiguous matching deallocation function can be found,
2238 propagating the exception does not cause the object's memory to be
2239 freed. */
96790071 2240 if (flag_exceptions && ! use_java_new)
1f109f0f 2241 {
d746e87d 2242 enum tree_code dcode = array_p ? VEC_DELETE_EXPR : DELETE_EXPR;
96790071 2243 tree cleanup;
a7d87521 2244
5355deec 2245 /* The Standard is unclear here, but the right thing to do
f4f4610e
MM
2246 is to use the same method for finding deallocation
2247 functions that we use for finding allocation functions. */
10ee5386
JM
2248 cleanup = (build_op_delete_call
2249 (dcode,
2250 fold_convert (full_pointer_type, alloc_node),
2251 size,
2252 globally_qualified_p,
2253 placement_allocation_fn_p ? alloc_call : NULL_TREE,
2254 alloc_fn));
2bb14213 2255
6de9cd9a
DN
2256 if (!cleanup)
2257 /* We're done. */;
2258 else if (stable)
2259 /* This is much simpler if we were able to preevaluate all of
2260 the arguments to the constructor call. */
f293ce4b
RS
2261 init_expr = build2 (TRY_CATCH_EXPR, void_type_node,
2262 init_expr, cleanup);
6de9cd9a
DN
2263 else
2264 /* Ack! First we allocate the memory. Then we set our sentry
2265 variable to true, and expand a cleanup that deletes the
2266 memory if sentry is true. Then we run the constructor, and
2267 finally clear the sentry.
2268
2269 We need to do this because we allocate the space first, so
2270 if there are any temporaries with cleanups in the
2271 constructor args and we weren't able to preevaluate them, we
2272 need this EH region to extend until end of full-expression
2273 to preserve nesting. */
da4768fe 2274 {
96790071 2275 tree end, sentry, begin;
2face519
JM
2276
2277 begin = get_target_expr (boolean_true_node);
659e5a7a 2278 CLEANUP_EH_ONLY (begin) = 1;
2face519 2279
659e5a7a
JM
2280 sentry = TARGET_EXPR_SLOT (begin);
2281
2282 TARGET_EXPR_CLEANUP (begin)
f293ce4b
RS
2283 = build3 (COND_EXPR, void_type_node, sentry,
2284 cleanup, void_zero_node);
2face519 2285
f293ce4b
RS
2286 end = build2 (MODIFY_EXPR, TREE_TYPE (sentry),
2287 sentry, boolean_false_node);
2face519 2288
96790071 2289 init_expr
f293ce4b
RS
2290 = build2 (COMPOUND_EXPR, void_type_node, begin,
2291 build2 (COMPOUND_EXPR, void_type_node, init_expr,
2292 end));
da4768fe 2293 }
c8094d83 2294
1f109f0f 2295 }
f4f4610e 2296 }
8b5e2ce4
JM
2297 else
2298 init_expr = NULL_TREE;
2299
2300 /* Now build up the return value in reverse order. */
96790071 2301
8b5e2ce4 2302 rval = data_addr;
2face519 2303
8b5e2ce4 2304 if (init_expr)
f293ce4b 2305 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), init_expr, rval);
8b5e2ce4 2306 if (cookie_expr)
f293ce4b 2307 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), cookie_expr, rval);
8b5e2ce4 2308
10ee5386 2309 if (rval == data_addr)
8b5e2ce4
JM
2310 /* If we don't have an initializer or a cookie, strip the TARGET_EXPR
2311 and return the call (which doesn't need to be adjusted). */
2312 rval = TARGET_EXPR_INITIAL (alloc_expr);
2313 else
d18c083e 2314 {
8b5e2ce4
JM
2315 if (check_new)
2316 {
ba47d38d
AH
2317 tree ifexp = cp_build_binary_op (input_location,
2318 NE_EXPR, alloc_node,
5ade1ed2
DG
2319 integer_zero_node,
2320 complain);
2321 rval = build_conditional_expr (ifexp, rval, alloc_node,
2322 complain);
8b5e2ce4 2323 }
d18c083e 2324
8b5e2ce4
JM
2325 /* Perform the allocation before anything else, so that ALLOC_NODE
2326 has been initialized before we start using it. */
f293ce4b 2327 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), alloc_expr, rval);
8b5e2ce4 2328 }
51c184be 2329
6de9cd9a 2330 if (init_preeval_expr)
f293ce4b 2331 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), init_preeval_expr, rval);
6de9cd9a 2332
f4f4610e 2333 /* Convert to the final type. */
d04a575f
MM
2334 rval = build_nop (pointer_type, rval);
2335
2336 /* A new-expression is never an lvalue. */
41990f96 2337 gcc_assert (!lvalue_p (rval));
d04a575f 2338
058dcc25 2339 if (placement != NULL)
412bbe81 2340 rval = avoid_placement_new_aliasing (rval, placement_expr);
058dcc25 2341
d04a575f 2342 return rval;
8d08fdba 2343}
63c9a190
MM
2344
2345/* Generate a representation for a C++ "new" expression. PLACEMENT is
2346 a TREE_LIST of placement-new arguments (or NULL_TREE if none). If
2347 NELTS is NULL, TYPE is the type of the storage to be allocated. If
2348 NELTS is not NULL, then this is an array-new allocation; TYPE is
2349 the type of the elements in the array and NELTS is the number of
2350 elements in the array. INIT, if non-NULL, is the initializer for
2351 the new object, or void_zero_node to indicate an initializer of
2352 "()". If USE_GLOBAL_NEW is true, then the user explicitly wrote
2353 "::new" rather than just "new". */
2354
2355tree
2356build_new (tree placement, tree type, tree nelts, tree init,
5ade1ed2 2357 int use_global_new, tsubst_flags_t complain)
63c9a190
MM
2358{
2359 tree rval;
2360 tree orig_placement;
2361 tree orig_nelts;
2362 tree orig_init;
2363
95fb85c6
VR
2364 if (placement == error_mark_node || type == error_mark_node
2365 || init == error_mark_node)
63c9a190
MM
2366 return error_mark_node;
2367
2368 orig_placement = placement;
2369 orig_nelts = nelts;
2370 orig_init = init;
2371
86a09a9e
JM
2372 if (nelts == NULL_TREE && init != void_zero_node && list_length (init) == 1
2373 && !any_type_dependent_arguments_p (init))
2374 {
2375 tree auto_node = type_uses_auto (type);
2376 if (auto_node)
2377 type = do_auto_deduction (type, TREE_VALUE (init), auto_node);
2378 }
2379
63c9a190
MM
2380 if (processing_template_decl)
2381 {
2382 if (dependent_type_p (type)
2383 || any_type_dependent_arguments_p (placement)
2384 || (nelts && type_dependent_expression_p (nelts))
2385 || (init != void_zero_node
2386 && any_type_dependent_arguments_p (init)))
2387 return build_raw_new_expr (placement, type, nelts, init,
2388 use_global_new);
2389 placement = build_non_dependent_args (placement);
2390 if (nelts)
2391 nelts = build_non_dependent_expr (nelts);
2392 if (init != void_zero_node)
2393 init = build_non_dependent_args (init);
2394 }
2395
2396 if (nelts)
2397 {
2398 if (!build_expr_type_conversion (WANT_INT | WANT_ENUM, nelts, false))
5ade1ed2
DG
2399 {
2400 if (complain & tf_error)
cbe5f3b3 2401 permerror (input_location, "size in array new must have integral type");
5ade1ed2
DG
2402 else
2403 return error_mark_node;
2404 }
b655f214 2405 nelts = cp_save_expr (cp_convert (sizetype, nelts));
63c9a190
MM
2406 }
2407
2408 /* ``A reference cannot be created by the new operator. A reference
2409 is not an object (8.2.2, 8.4.3), so a pointer to it could not be
2410 returned by new.'' ARM 5.3.3 */
2411 if (TREE_CODE (type) == REFERENCE_TYPE)
2412 {
5ade1ed2
DG
2413 if (complain & tf_error)
2414 error ("new cannot be applied to a reference type");
2415 else
2416 return error_mark_node;
63c9a190
MM
2417 type = TREE_TYPE (type);
2418 }
2419
2420 if (TREE_CODE (type) == FUNCTION_TYPE)
2421 {
5ade1ed2
DG
2422 if (complain & tf_error)
2423 error ("new cannot be applied to a function type");
63c9a190
MM
2424 return error_mark_node;
2425 }
2426
57ccb546
MM
2427 /* The type allocated must be complete. If the new-type-id was
2428 "T[N]" then we are just checking that "T" is complete here, but
2429 that is equivalent, since the value of "N" doesn't matter. */
39fb9d72
DB
2430 if (!complete_type_or_else (type, NULL_TREE))
2431 return error_mark_node;
2432
5ade1ed2 2433 rval = build_new_1 (placement, type, nelts, init, use_global_new, complain);
63c9a190
MM
2434 if (rval == error_mark_node)
2435 return error_mark_node;
2436
2437 if (processing_template_decl)
2438 return build_raw_new_expr (orig_placement, type, orig_nelts, orig_init,
2439 use_global_new);
2440
2441 /* Wrap it in a NOP_EXPR so warn_if_unused_value doesn't complain. */
2442 rval = build1 (NOP_EXPR, TREE_TYPE (rval), rval);
2443 TREE_NO_WARNING (rval) = 1;
2444
2445 return rval;
2446}
2447
2448/* Given a Java class, return a decl for the corresponding java.lang.Class. */
2449
2450tree
2451build_java_class_ref (tree type)
2452{
2453 tree name = NULL_TREE, class_decl;
2454 static tree CL_suffix = NULL_TREE;
2455 if (CL_suffix == NULL_TREE)
2456 CL_suffix = get_identifier("class$");
2457 if (jclass_node == NULL_TREE)
2458 {
2459 jclass_node = IDENTIFIER_GLOBAL_VALUE (get_identifier ("jclass"));
2460 if (jclass_node == NULL_TREE)
a3d536f1
VR
2461 {
2462 error ("call to Java constructor, while %<jclass%> undefined");
2463 return error_mark_node;
2464 }
63c9a190
MM
2465 jclass_node = TREE_TYPE (jclass_node);
2466 }
2467
2468 /* Mangle the class$ field. */
2469 {
2470 tree field;
2471 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
2472 if (DECL_NAME (field) == CL_suffix)
2473 {
2474 mangle_decl (field);
2475 name = DECL_ASSEMBLER_NAME (field);
2476 break;
2477 }
2478 if (!field)
a3d536f1
VR
2479 {
2480 error ("can't find %<class$%> in %qT", type);
2481 return error_mark_node;
2482 }
2483 }
63c9a190
MM
2484
2485 class_decl = IDENTIFIER_GLOBAL_VALUE (name);
2486 if (class_decl == NULL_TREE)
2487 {
2488 class_decl = build_decl (VAR_DECL, name, TREE_TYPE (jclass_node));
2489 TREE_STATIC (class_decl) = 1;
2490 DECL_EXTERNAL (class_decl) = 1;
2491 TREE_PUBLIC (class_decl) = 1;
2492 DECL_ARTIFICIAL (class_decl) = 1;
2493 DECL_IGNORED_P (class_decl) = 1;
2494 pushdecl_top_level (class_decl);
2495 make_decl_rtl (class_decl);
2496 }
2497 return class_decl;
2498}
8d08fdba 2499\f
f30432d7 2500static tree
362efdc1
NN
2501build_vec_delete_1 (tree base, tree maxindex, tree type,
2502 special_function_kind auto_delete_vec, int use_global_delete)
f30432d7
MS
2503{
2504 tree virtual_size;
e92cc029 2505 tree ptype = build_pointer_type (type = complete_type (type));
f30432d7
MS
2506 tree size_exp = size_in_bytes (type);
2507
2508 /* Temporary variables used by the loop. */
2509 tree tbase, tbase_init;
2510
2511 /* This is the body of the loop that implements the deletion of a
2512 single element, and moves temp variables to next elements. */
2513 tree body;
2514
2515 /* This is the LOOP_EXPR that governs the deletion of the elements. */
c7b62f14 2516 tree loop = 0;
f30432d7
MS
2517
2518 /* This is the thing that governs what to do after the loop has run. */
2519 tree deallocate_expr = 0;
2520
2521 /* This is the BIND_EXPR which holds the outermost iterator of the
2522 loop. It is convenient to set this variable up and test it before
2523 executing any other code in the loop.
2524 This is also the containing expression returned by this function. */
2525 tree controller = NULL_TREE;
5be014d5 2526 tree tmp;
f30432d7 2527
b2153b98 2528 /* We should only have 1-D arrays here. */
8dc2b103 2529 gcc_assert (TREE_CODE (type) != ARRAY_TYPE);
b2153b98 2530
9e1e64ec 2531 if (! MAYBE_CLASS_TYPE_P (type) || TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
c7b62f14 2532 goto no_destructor;
f30432d7 2533
708cae97 2534 /* The below is short by the cookie size. */
fed3cef0
RK
2535 virtual_size = size_binop (MULT_EXPR, size_exp,
2536 convert (sizetype, maxindex));
f30432d7 2537
46e8c075 2538 tbase = create_temporary_var (ptype);
5ade1ed2
DG
2539 tbase_init = cp_build_modify_expr (tbase, NOP_EXPR,
2540 fold_build2 (POINTER_PLUS_EXPR, ptype,
2541 fold_convert (ptype, base),
2542 virtual_size),
2543 tf_warning_or_error);
f30432d7 2544 DECL_REGISTER (tbase) = 1;
f293ce4b
RS
2545 controller = build3 (BIND_EXPR, void_type_node, tbase,
2546 NULL_TREE, NULL_TREE);
f30432d7 2547 TREE_SIDE_EFFECTS (controller) = 1;
f30432d7 2548
f293ce4b 2549 body = build1 (EXIT_EXPR, void_type_node,
5cd88d68
RS
2550 build2 (EQ_EXPR, boolean_type_node, tbase,
2551 fold_convert (ptype, base)));
5be014d5 2552 tmp = fold_build1 (NEGATE_EXPR, sizetype, size_exp);
c7b62f14 2553 body = build_compound_expr
5ade1ed2
DG
2554 (body, cp_build_modify_expr (tbase, NOP_EXPR,
2555 build2 (POINTER_PLUS_EXPR, ptype, tbase, tmp),
525521b6 2556 tf_warning_or_error));
c7b62f14
NS
2557 body = build_compound_expr
2558 (body, build_delete (ptype, tbase, sfk_complete_destructor,
525521b6 2559 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1));
f30432d7 2560
f293ce4b 2561 loop = build1 (LOOP_EXPR, void_type_node, body);
525521b6 2562 loop = build_compound_expr (tbase_init, loop);
f30432d7
MS
2563
2564 no_destructor:
2565 /* If the delete flag is one, or anything else with the low bit set,
2566 delete the storage. */
86f45d2c 2567 if (auto_delete_vec != sfk_base_destructor)
f30432d7
MS
2568 {
2569 tree base_tbd;
2570
708cae97 2571 /* The below is short by the cookie size. */
fed3cef0
RK
2572 virtual_size = size_binop (MULT_EXPR, size_exp,
2573 convert (sizetype, maxindex));
f30432d7
MS
2574
2575 if (! TYPE_VEC_NEW_USES_COOKIE (type))
2576 /* no header */
2577 base_tbd = base;
2578 else
2579 {
834c6dff
MM
2580 tree cookie_size;
2581
46e995e0 2582 cookie_size = targetm.cxx.get_cookie_size (type);
c8094d83 2583 base_tbd
834c6dff 2584 = cp_convert (ptype,
ba47d38d
AH
2585 cp_build_binary_op (input_location,
2586 MINUS_EXPR,
c8094d83 2587 cp_convert (string_type_node,
ab76ca54 2588 base),
5ade1ed2
DG
2589 cookie_size,
2590 tf_warning_or_error));
e92cc029 2591 /* True size with header. */
834c6dff 2592 virtual_size = size_binop (PLUS_EXPR, virtual_size, cookie_size);
f30432d7 2593 }
86f45d2c
MM
2594
2595 if (auto_delete_vec == sfk_deleting_destructor)
1c71c747
VR
2596 deallocate_expr = build_op_delete_call (VEC_DELETE_EXPR,
2597 base_tbd, virtual_size,
2598 use_global_delete & 1,
3db45ab5 2599 /*placement=*/NULL_TREE,
63c9a190 2600 /*alloc_fn=*/NULL_TREE);
f30432d7
MS
2601 }
2602
c7b62f14
NS
2603 body = loop;
2604 if (!deallocate_expr)
2605 ;
2606 else if (!body)
2607 body = deallocate_expr;
f30432d7 2608 else
525521b6 2609 body = build_compound_expr (body, deallocate_expr);
c8094d83 2610
c7b62f14
NS
2611 if (!body)
2612 body = integer_zero_node;
c8094d83 2613
f30432d7 2614 /* Outermost wrapper: If pointer is null, punt. */
7866705a
SB
2615 body = fold_build3 (COND_EXPR, void_type_node,
2616 fold_build2 (NE_EXPR, boolean_type_node, base,
2617 convert (TREE_TYPE (base),
2618 integer_zero_node)),
2619 body, integer_zero_node);
f30432d7
MS
2620 body = build1 (NOP_EXPR, void_type_node, body);
2621
2622 if (controller)
2623 {
2624 TREE_OPERAND (controller, 1) = body;
4e8dca1c 2625 body = controller;
f30432d7 2626 }
4e8dca1c
JM
2627
2628 if (TREE_CODE (base) == SAVE_EXPR)
2629 /* Pre-evaluate the SAVE_EXPR outside of the BIND_EXPR. */
f293ce4b 2630 body = build2 (COMPOUND_EXPR, void_type_node, base, body);
4e8dca1c 2631
5ade1ed2 2632 return convert_to_void (body, /*implicit=*/NULL, tf_warning_or_error);
f30432d7
MS
2633}
2634
c8094d83 2635/* Create an unnamed variable of the indicated TYPE. */
c395453c 2636
f1dedc31 2637tree
362efdc1 2638create_temporary_var (tree type)
8a72a046 2639{
f1dedc31 2640 tree decl;
c8094d83 2641
f1dedc31
MM
2642 decl = build_decl (VAR_DECL, NULL_TREE, type);
2643 TREE_USED (decl) = 1;
2644 DECL_ARTIFICIAL (decl) = 1;
f1dedc31 2645 DECL_IGNORED_P (decl) = 1;
78e0d62b 2646 DECL_SOURCE_LOCATION (decl) = input_location;
b35d4555 2647 DECL_CONTEXT (decl) = current_function_decl;
f1dedc31 2648
f1dedc31 2649 return decl;
8a72a046
MM
2650}
2651
f1dedc31
MM
2652/* Create a new temporary variable of the indicated TYPE, initialized
2653 to INIT.
8a72a046 2654
f1dedc31
MM
2655 It is not entered into current_binding_level, because that breaks
2656 things when it comes time to do final cleanups (which take place
2657 "outside" the binding contour of the function). */
2658
2659static tree
362efdc1 2660get_temp_regvar (tree type, tree init)
f30432d7 2661{
f1dedc31 2662 tree decl;
8a72a046 2663
f1dedc31 2664 decl = create_temporary_var (type);
350fae66 2665 add_decl_expr (decl);
c8094d83 2666
5ade1ed2
DG
2667 finish_expr_stmt (cp_build_modify_expr (decl, INIT_EXPR, init,
2668 tf_warning_or_error));
8a72a046 2669
f1dedc31 2670 return decl;
f30432d7
MS
2671}
2672
f1dedc31
MM
2673/* `build_vec_init' returns tree structure that performs
2674 initialization of a vector of aggregate types.
8d08fdba 2675
f30efcb7 2676 BASE is a reference to the vector, of ARRAY_TYPE.
a48cccea
JM
2677 MAXINDEX is the maximum index of the array (one less than the
2678 number of elements). It is only used if
2679 TYPE_DOMAIN (TREE_TYPE (BASE)) == NULL_TREE.
b84f4651 2680
8d08fdba
MS
2681 INIT is the (possibly NULL) initializer.
2682
844ae01d
JM
2683 If EXPLICIT_VALUE_INIT_P is true, then INIT must be NULL. All
2684 elements in the array are value-initialized.
b84f4651 2685
8d08fdba
MS
2686 FROM_ARRAY is 0 if we should init everything with INIT
2687 (i.e., every element initialized from INIT).
2688 FROM_ARRAY is 1 if we should index into INIT in parallel
2689 with initialization of DECL.
2690 FROM_ARRAY is 2 if we should index into INIT in parallel,
2691 but use assignment instead of initialization. */
2692
2693tree
3db45ab5 2694build_vec_init (tree base, tree maxindex, tree init,
844ae01d 2695 bool explicit_value_init_p,
5ade1ed2 2696 int from_array, tsubst_flags_t complain)
8d08fdba
MS
2697{
2698 tree rval;
8a72a046 2699 tree base2 = NULL_TREE;
8d08fdba 2700 tree size;
e833cb11 2701 tree itype = NULL_TREE;
8a72a046 2702 tree iterator;
f30efcb7
JM
2703 /* The type of the array. */
2704 tree atype = TREE_TYPE (base);
f1dedc31 2705 /* The type of an element in the array. */
f30efcb7 2706 tree type = TREE_TYPE (atype);
c8094d83 2707 /* The element type reached after removing all outer array
b5af3133
MM
2708 types. */
2709 tree inner_elt_type;
f1dedc31
MM
2710 /* The type of a pointer to an element in the array. */
2711 tree ptype;
2712 tree stmt_expr;
2713 tree compound_stmt;
2714 int destroy_temps;
f5984164 2715 tree try_block = NULL_TREE;
8a72a046 2716 int num_initialized_elts = 0;
2a3398e1 2717 bool is_global;
c8094d83 2718
a48cccea
JM
2719 if (TYPE_DOMAIN (atype))
2720 maxindex = array_type_nelts (atype);
2721
2722 if (maxindex == NULL_TREE || maxindex == error_mark_node)
8d08fdba
MS
2723 return error_mark_node;
2724
844ae01d 2725 if (explicit_value_init_p)
b84f4651
MM
2726 gcc_assert (!init);
2727
b5af3133 2728 inner_elt_type = strip_array_types (atype);
c8a3d889
AO
2729 if (init
2730 && (from_array == 2
c8094d83 2731 ? (!CLASS_TYPE_P (inner_elt_type)
b5af3133 2732 || !TYPE_HAS_COMPLEX_ASSIGN_REF (inner_elt_type))
c8a3d889 2733 : !TYPE_NEEDS_CONSTRUCTING (type))
f30efcb7
JM
2734 && ((TREE_CODE (init) == CONSTRUCTOR
2735 /* Don't do this if the CONSTRUCTOR might contain something
2736 that might throw and require us to clean up. */
4038c495 2737 && (VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (init))
b5af3133 2738 || ! TYPE_HAS_NONTRIVIAL_DESTRUCTOR (inner_elt_type)))
f30efcb7
JM
2739 || from_array))
2740 {
2741 /* Do non-default initialization of POD arrays resulting from
2742 brace-enclosed initializers. In this case, digest_init and
2743 store_constructor will handle the semantics for us. */
2744
f293ce4b 2745 stmt_expr = build2 (INIT_EXPR, atype, base, init);
f30efcb7
JM
2746 return stmt_expr;
2747 }
2748
2749 maxindex = cp_convert (ptrdiff_type_node, maxindex);
f1dedc31 2750 ptype = build_pointer_type (type);
8d08fdba 2751 size = size_in_bytes (type);
f30efcb7 2752 if (TREE_CODE (TREE_TYPE (base)) == ARRAY_TYPE)
0a72704b 2753 base = cp_convert (ptype, decay_conversion (base));
8d08fdba 2754
f1dedc31 2755 /* The code we are generating looks like:
303b7406 2756 ({
f1dedc31 2757 T* t1 = (T*) base;
f30efcb7 2758 T* rval = t1;
f1dedc31
MM
2759 ptrdiff_t iterator = maxindex;
2760 try {
4977bab6 2761 for (; iterator != -1; --iterator) {
f30efcb7
JM
2762 ... initialize *t1 ...
2763 ++t1;
4977bab6 2764 }
f1dedc31 2765 } catch (...) {
0cbd7506 2766 ... destroy elements that were constructed ...
f1dedc31 2767 }
303b7406
NS
2768 rval;
2769 })
c8094d83 2770
f1dedc31
MM
2771 We can omit the try and catch blocks if we know that the
2772 initialization will never throw an exception, or if the array
f30efcb7 2773 elements do not have destructors. We can omit the loop completely if
c8094d83 2774 the elements of the array do not have constructors.
f1dedc31
MM
2775
2776 We actually wrap the entire body of the above in a STMT_EXPR, for
c8094d83 2777 tidiness.
f1dedc31
MM
2778
2779 When copying from array to another, when the array elements have
2780 only trivial copy constructors, we should use __builtin_memcpy
2781 rather than generating a loop. That way, we could take advantage
3b426391 2782 of whatever cleverness the back end has for dealing with copies
f1dedc31
MM
2783 of blocks of memory. */
2784
2a3398e1 2785 is_global = begin_init_stmts (&stmt_expr, &compound_stmt);
f2c5f623 2786 destroy_temps = stmts_are_full_exprs_p ();
ae499cce 2787 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
f30efcb7 2788 rval = get_temp_regvar (ptype, base);
f1dedc31 2789 base = get_temp_regvar (ptype, rval);
8a72a046 2790 iterator = get_temp_regvar (ptrdiff_type_node, maxindex);
8d08fdba 2791
8a72a046 2792 /* Protect the entire array initialization so that we can destroy
f30efcb7
JM
2793 the partially constructed array if an exception is thrown.
2794 But don't do this if we're assigning. */
2795 if (flag_exceptions && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
2796 && from_array != 2)
ed5511d9
MM
2797 {
2798 try_block = begin_try_block ();
ed5511d9 2799 }
8a72a046 2800
f30efcb7 2801 if (init != NULL_TREE && TREE_CODE (init) == CONSTRUCTOR)
8d08fdba 2802 {
f30efcb7
JM
2803 /* Do non-default initialization of non-POD arrays resulting from
2804 brace-enclosed initializers. */
4038c495
GB
2805 unsigned HOST_WIDE_INT idx;
2806 tree elt;
094fe153
JM
2807 from_array = 0;
2808
4038c495 2809 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (init), idx, elt)
8d08fdba 2810 {
f1dedc31 2811 tree baseref = build1 (INDIRECT_REF, type, base);
8d08fdba 2812
8a72a046 2813 num_initialized_elts++;
8d08fdba 2814
67c03833 2815 current_stmt_tree ()->stmts_are_full_exprs_p = 1;
9e1e64ec 2816 if (MAYBE_CLASS_TYPE_P (type) || TREE_CODE (type) == ARRAY_TYPE)
5ade1ed2 2817 finish_expr_stmt (build_aggr_init (baseref, elt, 0, complain));
8a72a046 2818 else
5ade1ed2
DG
2819 finish_expr_stmt (cp_build_modify_expr (baseref, NOP_EXPR,
2820 elt, complain));
67c03833 2821 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
8a72a046 2822
5ade1ed2
DG
2823 finish_expr_stmt (cp_build_unary_op (PREINCREMENT_EXPR, base, 0,
2824 complain));
2825 finish_expr_stmt (cp_build_unary_op (PREDECREMENT_EXPR, iterator, 0,
2826 complain));
8d08fdba 2827 }
8d08fdba 2828
8a72a046
MM
2829 /* Clear out INIT so that we don't get confused below. */
2830 init = NULL_TREE;
8d08fdba 2831 }
8a72a046 2832 else if (from_array)
8d08fdba 2833 {
8a72a046
MM
2834 /* If initializing one array from another, initialize element by
2835 element. We rely upon the below calls the do argument
c8094d83 2836 checking. */
8a72a046
MM
2837 if (init)
2838 {
0a72704b 2839 base2 = decay_conversion (init);
8a72a046
MM
2840 itype = TREE_TYPE (base2);
2841 base2 = get_temp_regvar (itype, base2);
2842 itype = TREE_TYPE (itype);
2843 }
2844 else if (TYPE_LANG_SPECIFIC (type)
2845 && TYPE_NEEDS_CONSTRUCTING (type)
2846 && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
2847 {
5ade1ed2
DG
2848 if (complain & tf_error)
2849 error ("initializer ends prematurely");
8a72a046
MM
2850 return error_mark_node;
2851 }
2852 }
8d08fdba 2853
8a72a046
MM
2854 /* Now, default-initialize any remaining elements. We don't need to
2855 do that if a) the type does not need constructing, or b) we've
094fe153
JM
2856 already initialized all the elements.
2857
2858 We do need to keep going if we're copying an array. */
2859
2860 if (from_array
844ae01d 2861 || ((TYPE_NEEDS_CONSTRUCTING (type) || explicit_value_init_p)
665f2503 2862 && ! (host_integerp (maxindex, 0)
05bccae2 2863 && (num_initialized_elts
665f2503 2864 == tree_low_cst (maxindex, 0) + 1))))
8a72a046 2865 {
37e05cd5 2866 /* If the ITERATOR is equal to -1, then we don't have to loop;
8a72a046 2867 we've already initialized all the elements. */
4977bab6 2868 tree for_stmt;
f1dedc31 2869 tree elt_init;
b84f4651 2870 tree to;
f1dedc31 2871
4977bab6
ZW
2872 for_stmt = begin_for_stmt ();
2873 finish_for_init_stmt (for_stmt);
aab384ae
RG
2874 finish_for_cond (build2 (NE_EXPR, boolean_type_node, iterator,
2875 build_int_cst (TREE_TYPE (iterator), -1)),
4977bab6 2876 for_stmt);
5ade1ed2
DG
2877 finish_for_expr (cp_build_unary_op (PREDECREMENT_EXPR, iterator, 0,
2878 complain),
4977bab6 2879 for_stmt);
8d08fdba 2880
b84f4651
MM
2881 to = build1 (INDIRECT_REF, type, base);
2882
8d08fdba
MS
2883 if (from_array)
2884 {
8d08fdba
MS
2885 tree from;
2886
2887 if (base2)
2888 from = build1 (INDIRECT_REF, itype, base2);
2889 else
2890 from = NULL_TREE;
2891
2892 if (from_array == 2)
5ade1ed2
DG
2893 elt_init = cp_build_modify_expr (to, NOP_EXPR, from,
2894 complain);
8d08fdba 2895 else if (TYPE_NEEDS_CONSTRUCTING (type))
5ade1ed2 2896 elt_init = build_aggr_init (to, from, 0, complain);
8d08fdba 2897 else if (from)
5ade1ed2
DG
2898 elt_init = cp_build_modify_expr (to, NOP_EXPR, from,
2899 complain);
8d08fdba 2900 else
8dc2b103 2901 gcc_unreachable ();
8d08fdba
MS
2902 }
2903 else if (TREE_CODE (type) == ARRAY_TYPE)
2904 {
2905 if (init != 0)
f30efcb7
JM
2906 sorry
2907 ("cannot initialize multi-dimensional array with initializer");
2908 elt_init = build_vec_init (build1 (INDIRECT_REF, type, base),
3db45ab5 2909 0, 0,
844ae01d 2910 explicit_value_init_p,
5ade1ed2 2911 0, complain);
f1dedc31 2912 }
844ae01d
JM
2913 else if (explicit_value_init_p)
2914 elt_init = build2 (INIT_EXPR, type, to,
2915 build_value_init (type));
f1dedc31 2916 else
844ae01d
JM
2917 {
2918 gcc_assert (TYPE_NEEDS_CONSTRUCTING (type));
2919 elt_init = build_aggr_init (to, init, 0, complain);
2920 }
c8094d83 2921
2a3398e1
NS
2922 current_stmt_tree ()->stmts_are_full_exprs_p = 1;
2923 finish_expr_stmt (elt_init);
2924 current_stmt_tree ()->stmts_are_full_exprs_p = 0;
8d08fdba 2925
5ade1ed2
DG
2926 finish_expr_stmt (cp_build_unary_op (PREINCREMENT_EXPR, base, 0,
2927 complain));
8d08fdba 2928 if (base2)
5ade1ed2
DG
2929 finish_expr_stmt (cp_build_unary_op (PREINCREMENT_EXPR, base2, 0,
2930 complain));
0fac6b0b 2931
4977bab6 2932 finish_for_stmt (for_stmt);
8d08fdba 2933 }
8a72a046
MM
2934
2935 /* Make sure to cleanup any partially constructed elements. */
f30efcb7
JM
2936 if (flag_exceptions && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
2937 && from_array != 2)
f1dedc31
MM
2938 {
2939 tree e;
ba47d38d
AH
2940 tree m = cp_build_binary_op (input_location,
2941 MINUS_EXPR, maxindex, iterator,
5ade1ed2 2942 complain);
b2153b98
KL
2943
2944 /* Flatten multi-dimensional array since build_vec_delete only
2945 expects one-dimensional array. */
2946 if (TREE_CODE (type) == ARRAY_TYPE)
ba47d38d
AH
2947 m = cp_build_binary_op (input_location,
2948 MULT_EXPR, m,
5ade1ed2
DG
2949 array_type_nelts_total (type),
2950 complain);
8d08fdba 2951
ed5511d9 2952 finish_cleanup_try_block (try_block);
c8094d83 2953 e = build_vec_delete_1 (rval, m,
b5af3133 2954 inner_elt_type, sfk_base_destructor,
f1dedc31 2955 /*use_global_delete=*/0);
f1dedc31
MM
2956 finish_cleanup (e, try_block);
2957 }
2958
303b7406
NS
2959 /* The value of the array initialization is the array itself, RVAL
2960 is a pointer to the first element. */
325c3691 2961 finish_stmt_expr_expr (rval, stmt_expr);
f1dedc31 2962
2a3398e1 2963 stmt_expr = finish_init_stmts (is_global, stmt_expr, compound_stmt);
303b7406 2964
04c06002 2965 /* Now convert make the result have the correct type. */
303b7406
NS
2966 atype = build_pointer_type (atype);
2967 stmt_expr = build1 (NOP_EXPR, atype, stmt_expr);
5ade1ed2 2968 stmt_expr = cp_build_indirect_ref (stmt_expr, NULL, complain);
c8094d83 2969
ae499cce 2970 current_stmt_tree ()->stmts_are_full_exprs_p = destroy_temps;
f1dedc31 2971 return stmt_expr;
8d08fdba
MS
2972}
2973
86f45d2c
MM
2974/* Call the DTOR_KIND destructor for EXP. FLAGS are as for
2975 build_delete. */
298d6f60
MM
2976
2977static tree
362efdc1 2978build_dtor_call (tree exp, special_function_kind dtor_kind, int flags)
298d6f60 2979{
86f45d2c 2980 tree name;
ee76b931 2981 tree fn;
86f45d2c
MM
2982 switch (dtor_kind)
2983 {
2984 case sfk_complete_destructor:
2985 name = complete_dtor_identifier;
2986 break;
2987
2988 case sfk_base_destructor:
2989 name = base_dtor_identifier;
2990 break;
2991
2992 case sfk_deleting_destructor:
2993 name = deleting_dtor_identifier;
2994 break;
2995
2996 default:
8dc2b103 2997 gcc_unreachable ();
86f45d2c 2998 }
ee76b931 2999 fn = lookup_fnfields (TREE_TYPE (exp), name, /*protect=*/2);
c8094d83 3000 return build_new_method_call (exp, fn,
ee76b931
MM
3001 /*args=*/NULL_TREE,
3002 /*conversion_path=*/NULL_TREE,
63c9a190 3003 flags,
5ade1ed2
DG
3004 /*fn_p=*/NULL,
3005 tf_warning_or_error);
298d6f60
MM
3006}
3007
8d08fdba
MS
3008/* Generate a call to a destructor. TYPE is the type to cast ADDR to.
3009 ADDR is an expression which yields the store to be destroyed.
86f45d2c
MM
3010 AUTO_DELETE is the name of the destructor to call, i.e., either
3011 sfk_complete_destructor, sfk_base_destructor, or
3012 sfk_deleting_destructor.
8d08fdba
MS
3013
3014 FLAGS is the logical disjunction of zero or more LOOKUP_
ade3dc07 3015 flags. See cp-tree.h for more info. */
e92cc029 3016
8d08fdba 3017tree
362efdc1
NN
3018build_delete (tree type, tree addr, special_function_kind auto_delete,
3019 int flags, int use_global_delete)
8d08fdba 3020{
8d08fdba 3021 tree expr;
8d08fdba
MS
3022
3023 if (addr == error_mark_node)
3024 return error_mark_node;
3025
3026 /* Can happen when CURRENT_EXCEPTION_OBJECT gets its type
3027 set to `error_mark_node' before it gets properly cleaned up. */
3028 if (type == error_mark_node)
3029 return error_mark_node;
3030
3031 type = TYPE_MAIN_VARIANT (type);
3032
3033 if (TREE_CODE (type) == POINTER_TYPE)
3034 {
b1e5b86c
GB
3035 bool complete_p = true;
3036
2986ae00 3037 type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
8d08fdba
MS
3038 if (TREE_CODE (type) == ARRAY_TYPE)
3039 goto handle_array;
23b4deba 3040
b1e5b86c
GB
3041 /* We don't want to warn about delete of void*, only other
3042 incomplete types. Deleting other incomplete types
3043 invokes undefined behavior, but it is not ill-formed, so
3044 compile to something that would even do The Right Thing
3045 (TM) should the type have a trivial dtor and no delete
3046 operator. */
3047 if (!VOID_TYPE_P (type))
8d08fdba 3048 {
b1e5b86c
GB
3049 complete_type (type);
3050 if (!COMPLETE_TYPE_P (type))
3051 {
71205d17
MLI
3052 if (warning (0, "possible problem detected in invocation of "
3053 "delete operator:"))
3054 {
3055 cxx_incomplete_type_diagnostic (addr, type, DK_WARNING);
1f5b3869 3056 inform (input_location, "neither the destructor nor the class-specific "
71205d17
MLI
3057 "operator delete will be called, even if they are "
3058 "declared when the class is defined.");
3059 }
b1e5b86c
GB
3060 complete_p = false;
3061 }
8d08fdba 3062 }
9e1e64ec 3063 if (VOID_TYPE_P (type) || !complete_p || !MAYBE_CLASS_TYPE_P (type))
b1e5b86c
GB
3064 /* Call the builtin operator delete. */
3065 return build_builtin_delete_call (addr);
8d08fdba
MS
3066 if (TREE_SIDE_EFFECTS (addr))
3067 addr = save_expr (addr);
2986ae00 3068
f4f206f4 3069 /* Throw away const and volatile on target type of addr. */
6060a796 3070 addr = convert_force (build_pointer_type (type), addr, 0);
8d08fdba
MS
3071 }
3072 else if (TREE_CODE (type) == ARRAY_TYPE)
3073 {
3074 handle_array:
c8094d83 3075
c407792d
RK
3076 if (TYPE_DOMAIN (type) == NULL_TREE)
3077 {
8251199e 3078 error ("unknown array size in delete");
c407792d
RK
3079 return error_mark_node;
3080 }
8d08fdba 3081 return build_vec_delete (addr, array_type_nelts (type),
c7edeea3 3082 auto_delete, use_global_delete);
8d08fdba
MS
3083 }
3084 else
3085 {
3086 /* Don't check PROTECT here; leave that decision to the
3087 destructor. If the destructor is accessible, call it,
3088 else report error. */
5ade1ed2 3089 addr = cp_build_unary_op (ADDR_EXPR, addr, 0, tf_warning_or_error);
8d08fdba
MS
3090 if (TREE_SIDE_EFFECTS (addr))
3091 addr = save_expr (addr);
3092
60696c53 3093 addr = convert_force (build_pointer_type (type), addr, 0);
8d08fdba
MS
3094 }
3095
9e1e64ec 3096 gcc_assert (MAYBE_CLASS_TYPE_P (type));
8d08fdba 3097
834c6dff 3098 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
8d08fdba 3099 {
60696c53 3100 if (auto_delete != sfk_deleting_destructor)
8d08fdba
MS
3101 return void_zero_node;
3102
3db45ab5
MS
3103 return build_op_delete_call (DELETE_EXPR, addr,
3104 cxx_sizeof_nowarn (type),
63c9a190
MM
3105 use_global_delete,
3106 /*placement=*/NULL_TREE,
3107 /*alloc_fn=*/NULL_TREE);
8d08fdba 3108 }
ade3dc07 3109 else
8d08fdba 3110 {
6f06d231 3111 tree head = NULL_TREE;
700f8a87 3112 tree do_delete = NULL_TREE;
bd6dd845 3113 tree ifexp;
700f8a87 3114
9f4faeae
MM
3115 if (CLASSTYPE_LAZY_DESTRUCTOR (type))
3116 lazily_declare_fn (sfk_destructor, type);
ade3dc07 3117
52682a1b
MM
3118 /* For `::delete x', we must not use the deleting destructor
3119 since then we would not be sure to get the global `operator
3120 delete'. */
86f45d2c 3121 if (use_global_delete && auto_delete == sfk_deleting_destructor)
700f8a87 3122 {
1b4a93f7
MM
3123 /* We will use ADDR multiple times so we must save it. */
3124 addr = save_expr (addr);
6f06d231 3125 head = get_target_expr (build_headof (addr));
c6002625 3126 /* Delete the object. */
6f06d231 3127 do_delete = build_builtin_delete_call (head);
86f45d2c
MM
3128 /* Otherwise, treat this like a complete object destructor
3129 call. */
3130 auto_delete = sfk_complete_destructor;
700f8a87 3131 }
52682a1b
MM
3132 /* If the destructor is non-virtual, there is no deleting
3133 variant. Instead, we must explicitly call the appropriate
3134 `operator delete' here. */
3135 else if (!DECL_VIRTUAL_P (CLASSTYPE_DESTRUCTORS (type))
3136 && auto_delete == sfk_deleting_destructor)
3137 {
1b4a93f7
MM
3138 /* We will use ADDR multiple times so we must save it. */
3139 addr = save_expr (addr);
3140 /* Build the call. */
52682a1b
MM
3141 do_delete = build_op_delete_call (DELETE_EXPR,
3142 addr,
ea793912 3143 cxx_sizeof_nowarn (type),
5bd61841 3144 /*global_p=*/false,
63c9a190
MM
3145 /*placement=*/NULL_TREE,
3146 /*alloc_fn=*/NULL_TREE);
52682a1b
MM
3147 /* Call the complete object destructor. */
3148 auto_delete = sfk_complete_destructor;
3149 }
e3fe84e5
JM
3150 else if (auto_delete == sfk_deleting_destructor
3151 && TYPE_GETS_REG_DELETE (type))
3152 {
3153 /* Make sure we have access to the member op delete, even though
3154 we'll actually be calling it from the destructor. */
ea793912 3155 build_op_delete_call (DELETE_EXPR, addr, cxx_sizeof_nowarn (type),
3db45ab5 3156 /*global_p=*/false,
63c9a190
MM
3157 /*placement=*/NULL_TREE,
3158 /*alloc_fn=*/NULL_TREE);
e3fe84e5 3159 }
8d08fdba 3160
5ade1ed2
DG
3161 expr = build_dtor_call (cp_build_indirect_ref (addr, NULL,
3162 tf_warning_or_error),
1b4a93f7 3163 auto_delete, flags);
bd6dd845 3164 if (do_delete)
f293ce4b 3165 expr = build2 (COMPOUND_EXPR, void_type_node, expr, do_delete);
9e9ff709 3166
6f06d231
JM
3167 /* We need to calculate this before the dtor changes the vptr. */
3168 if (head)
3169 expr = build2 (COMPOUND_EXPR, void_type_node, head, expr);
3170
bd6dd845
MS
3171 if (flags & LOOKUP_DESTRUCTOR)
3172 /* Explicit destructor call; don't check for null pointer. */
3173 ifexp = integer_one_node;
8d08fdba 3174 else
bd6dd845 3175 /* Handle deleting a null pointer. */
ba47d38d
AH
3176 ifexp = fold (cp_build_binary_op (input_location,
3177 NE_EXPR, addr, integer_zero_node,
5ade1ed2 3178 tf_warning_or_error));
8d08fdba 3179
bd6dd845 3180 if (ifexp != integer_one_node)
f293ce4b
RS
3181 expr = build3 (COND_EXPR, void_type_node,
3182 ifexp, expr, void_zero_node);
8d08fdba 3183
8d08fdba
MS
3184 return expr;
3185 }
ade3dc07 3186}
8d08fdba 3187
ade3dc07
JM
3188/* At the beginning of a destructor, push cleanups that will call the
3189 destructors for our base classes and members.
2a2480e1 3190
a29e1034 3191 Called from begin_destructor_body. */
8d08fdba 3192
ade3dc07 3193void
edaf3e03 3194push_base_cleanups (void)
ade3dc07 3195{
fa743e8c
NS
3196 tree binfo, base_binfo;
3197 int i;
ade3dc07
JM
3198 tree member;
3199 tree expr;
d4e6fecb 3200 VEC(tree,gc) *vbases;
8d08fdba 3201
ade3dc07 3202 /* Run destructors for all virtual baseclasses. */
5775a06a 3203 if (CLASSTYPE_VBASECLASSES (current_class_type))
ade3dc07 3204 {
ade3dc07 3205 tree cond = (condition_conversion
f293ce4b
RS
3206 (build2 (BIT_AND_EXPR, integer_type_node,
3207 current_in_charge_parm,
3208 integer_two_node)));
8d08fdba 3209
58c42dc2 3210 /* The CLASSTYPE_VBASECLASSES vector is in initialization
ade3dc07 3211 order, which is also the right order for pushing cleanups. */
9ba5ff0f
NS
3212 for (vbases = CLASSTYPE_VBASECLASSES (current_class_type), i = 0;
3213 VEC_iterate (tree, vbases, i, base_binfo); i++)
8d08fdba 3214 {
9ba5ff0f 3215 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo)))
8d08fdba 3216 {
c8094d83 3217 expr = build_special_member_call (current_class_ref,
4ba126e4
MM
3218 base_dtor_identifier,
3219 NULL_TREE,
9ba5ff0f 3220 base_binfo,
c8094d83 3221 (LOOKUP_NORMAL
5ade1ed2
DG
3222 | LOOKUP_NONVIRTUAL),
3223 tf_warning_or_error);
f293ce4b
RS
3224 expr = build3 (COND_EXPR, void_type_node, cond,
3225 expr, void_zero_node);
ade3dc07 3226 finish_decl_cleanup (NULL_TREE, expr);
8d08fdba
MS
3227 }
3228 }
ade3dc07
JM
3229 }
3230
ade3dc07 3231 /* Take care of the remaining baseclasses. */
fa743e8c
NS
3232 for (binfo = TYPE_BINFO (current_class_type), i = 0;
3233 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
ade3dc07 3234 {
ade3dc07 3235 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo))
809e3e7f 3236 || BINFO_VIRTUAL_P (base_binfo))
ade3dc07
JM
3237 continue;
3238
c8094d83 3239 expr = build_special_member_call (current_class_ref,
4ba126e4 3240 base_dtor_identifier,
c8094d83 3241 NULL_TREE, base_binfo,
5ade1ed2
DG
3242 LOOKUP_NORMAL | LOOKUP_NONVIRTUAL,
3243 tf_warning_or_error);
ade3dc07
JM
3244 finish_decl_cleanup (NULL_TREE, expr);
3245 }
3246
3247 for (member = TYPE_FIELDS (current_class_type); member;
3248 member = TREE_CHAIN (member))
3249 {
2e5d2970
VR
3250 if (TREE_TYPE (member) == error_mark_node
3251 || TREE_CODE (member) != FIELD_DECL
3252 || DECL_ARTIFICIAL (member))
ade3dc07
JM
3253 continue;
3254 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (member)))
3255 {
c8094d83
MS
3256 tree this_member = (build_class_member_access_expr
3257 (current_class_ref, member,
50ad9642 3258 /*access_path=*/NULL_TREE,
5ade1ed2
DG
3259 /*preserve_reference=*/false,
3260 tf_warning_or_error));
ade3dc07
JM
3261 tree this_type = TREE_TYPE (member);
3262 expr = build_delete (this_type, this_member,
3263 sfk_complete_destructor,
3264 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_NORMAL,
3265 0);
3266 finish_decl_cleanup (NULL_TREE, expr);
3267 }
8d08fdba
MS
3268 }
3269}
3270
8d08fdba
MS
3271/* Build a C++ vector delete expression.
3272 MAXINDEX is the number of elements to be deleted.
3273 ELT_SIZE is the nominal size of each element in the vector.
3274 BASE is the expression that should yield the store to be deleted.
8d08fdba
MS
3275 This function expands (or synthesizes) these calls itself.
3276 AUTO_DELETE_VEC says whether the container (vector) should be deallocated.
8d08fdba
MS
3277
3278 This also calls delete for virtual baseclasses of elements of the vector.
3279
3280 Update: MAXINDEX is no longer needed. The size can be extracted from the
3281 start of the vector for pointers, and from the type for arrays. We still
3282 use MAXINDEX for arrays because it happens to already have one of the
3283 values we'd have to extract. (We could use MAXINDEX with pointers to
3284 confirm the size, and trap if the numbers differ; not clear that it'd
3285 be worth bothering.) */
e92cc029 3286
8d08fdba 3287tree
362efdc1
NN
3288build_vec_delete (tree base, tree maxindex,
3289 special_function_kind auto_delete_vec, int use_global_delete)
8d08fdba 3290{
f30432d7 3291 tree type;
49b7aacb
JM
3292 tree rval;
3293 tree base_init = NULL_TREE;
8d08fdba 3294
f30432d7 3295 type = TREE_TYPE (base);
c407792d 3296
f30432d7 3297 if (TREE_CODE (type) == POINTER_TYPE)
8d08fdba
MS
3298 {
3299 /* Step back one from start of vector, and read dimension. */
834c6dff 3300 tree cookie_addr;
726a989a 3301 tree size_ptr_type = build_pointer_type (sizetype);
834c6dff 3302
6742d92b 3303 if (TREE_SIDE_EFFECTS (base))
49b7aacb
JM
3304 {
3305 base_init = get_target_expr (base);
3306 base = TARGET_EXPR_SLOT (base_init);
3307 }
708cae97 3308 type = strip_array_types (TREE_TYPE (type));
5be014d5
AP
3309 cookie_addr = fold_build1 (NEGATE_EXPR, sizetype, TYPE_SIZE_UNIT (sizetype));
3310 cookie_addr = build2 (POINTER_PLUS_EXPR,
726a989a
RB
3311 size_ptr_type,
3312 fold_convert (size_ptr_type, base),
5be014d5 3313 cookie_addr);
5ade1ed2 3314 maxindex = cp_build_indirect_ref (cookie_addr, NULL, tf_warning_or_error);
8d08fdba 3315 }
f30432d7 3316 else if (TREE_CODE (type) == ARRAY_TYPE)
8d08fdba 3317 {
f4f206f4
KH
3318 /* Get the total number of things in the array, maxindex is a
3319 bad name. */
f30432d7 3320 maxindex = array_type_nelts_total (type);
834c6dff 3321 type = strip_array_types (type);
5ade1ed2 3322 base = cp_build_unary_op (ADDR_EXPR, base, 1, tf_warning_or_error);
6742d92b 3323 if (TREE_SIDE_EFFECTS (base))
49b7aacb
JM
3324 {
3325 base_init = get_target_expr (base);
3326 base = TARGET_EXPR_SLOT (base_init);
3327 }
8d08fdba
MS
3328 }
3329 else
3330 {
9e9ff709 3331 if (base != error_mark_node)
8251199e 3332 error ("type to vector delete is neither pointer or array type");
8d08fdba
MS
3333 return error_mark_node;
3334 }
8d08fdba 3335
49b7aacb 3336 rval = build_vec_delete_1 (base, maxindex, type, auto_delete_vec,
f30432d7 3337 use_global_delete);
49b7aacb 3338 if (base_init)
f293ce4b 3339 rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), base_init, rval);
49b7aacb
JM
3340
3341 return rval;
8d08fdba 3342}