diff options
Diffstat (limited to 'gcc/cp/init.c')
| -rw-r--r-- | gcc/cp/init.c | 31 |
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. |
