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