init.c (build_vec_delete_1): Look for sfk_deleting_destructor to decide whether to...
authorJason Merrill <jason@redhat.com>
Thu, 28 Apr 2011 01:53:43 +0000 (21:53 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 28 Apr 2011 01:53:43 +0000 (21:53 -0400)
* init.c (build_vec_delete_1): Look for sfk_deleting_destructor to
decide whether to delete.
(build_vec_init): Pass sfk_complete_destructor.

From-SVN: r173057

gcc/cp/ChangeLog
gcc/cp/init.c

index 737ba2e30ea446eaa0aed2b1dc7d2c0df4a78044..0f1816709c5ac0a6b99168d848a976faca34d75a 100644 (file)
@@ -1,5 +1,9 @@
 2011-04-27  Jason Merrill  <jason@redhat.com>
 
+       * init.c (build_vec_delete_1): Look for sfk_deleting_destructor to
+       decide whether to delete.
+       (build_vec_init): Pass sfk_complete_destructor.
+
        PR c++/40975
        * cp-tree.def (VEC_INIT_EXPR): Add third operand.
        * cp-tree.h (VEC_INIT_EXPR_NELTS): New.
index 883734f65f6907e589c93b7fc8623d905cb71331..3f888576bf65020222eed1e17ad8c952cc5ef2ca 100644 (file)
@@ -2793,9 +2793,8 @@ build_vec_delete_1 (tree base, tree maxindex, tree type,
   loop = build_compound_expr (input_location, tbase_init, loop);
 
  no_destructor:
-  /* If the delete flag is one, or anything else with the low bit set,
-     delete the storage.  */
-  if (auto_delete_vec != sfk_base_destructor)
+  /* Delete the storage if appropriate.  */
+  if (auto_delete_vec == sfk_deleting_destructor)
     {
       tree base_tbd;
 
@@ -2824,12 +2823,11 @@ build_vec_delete_1 (tree base, tree maxindex, tree type,
          virtual_size = size_binop (PLUS_EXPR, virtual_size, cookie_size);
        }
 
-      if (auto_delete_vec == sfk_deleting_destructor)
-       deallocate_expr = build_op_delete_call (VEC_DELETE_EXPR,
-                                               base_tbd, virtual_size,
-                                               use_global_delete & 1,
-                                               /*placement=*/NULL_TREE,
-                                               /*alloc_fn=*/NULL_TREE);
+      deallocate_expr = build_op_delete_call (VEC_DELETE_EXPR,
+                                             base_tbd, virtual_size,
+                                             use_global_delete & 1,
+                                             /*placement=*/NULL_TREE,
+                                             /*alloc_fn=*/NULL_TREE);
     }
 
   body = loop;
@@ -3284,7 +3282,7 @@ build_vec_init (tree base, tree maxindex, tree init,
 
       finish_cleanup_try_block (try_block);
       e = build_vec_delete_1 (rval, m,
-                             inner_elt_type, sfk_base_destructor,
+                             inner_elt_type, sfk_complete_destructor,
                              /*use_global_delete=*/0, complain);
       if (e == error_mark_node)
        errors = true;