aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/init.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/cp/init.c')
-rw-r--r--gcc/cp/init.c31
1 files changed, 2 insertions, 29 deletions
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index eb73980..4ad5e62 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -2796,7 +2796,8 @@ build_delete (tree type, tree addr, special_function_kind auto_delete,
tree do_delete = NULL_TREE;
tree ifexp;
- gcc_assert (TYPE_HAS_DESTRUCTOR (type));
+ if (CLASSTYPE_LAZY_DESTRUCTOR (type))
+ lazily_declare_fn (sfk_destructor, type);
/* For `::delete x', we must not use the deleting destructor
since then we would not be sure to get the global `operator
@@ -2935,34 +2936,6 @@ push_base_cleanups (void)
}
}
-/* For type TYPE, delete the virtual baseclass objects of DECL. */
-
-tree
-build_vbase_delete (tree type, tree decl)
-{
- unsigned ix;
- tree binfo;
- tree result;
- VEC (tree) *vbases;
- tree addr = build_unary_op (ADDR_EXPR, decl, 0);
-
- gcc_assert (addr != error_mark_node);
-
- result = convert_to_void (integer_zero_node, NULL);
- for (vbases = CLASSTYPE_VBASECLASSES (type), ix = 0;
- VEC_iterate (tree, vbases, ix, binfo); ix++)
- {
- tree base_addr = convert_force
- (build_pointer_type (BINFO_TYPE (binfo)), addr, 0);
- tree base_delete = build_delete
- (TREE_TYPE (base_addr), base_addr, sfk_base_destructor,
- LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 0);
-
- result = build_compound_expr (result, base_delete);
- }
- return result;
-}
-
/* Build a C++ vector delete expression.
MAXINDEX is the number of elements to be deleted.
ELT_SIZE is the nominal size of each element in the vector.