Patchwork Two C++ cleanup PATCHes

login
register
mail settings
Submitter Jason Merrill
Date Oct. 31, 2013, 3:44 p.m.
Message ID <52727ACD.40903@redhat.com>
Download mbox | patch
Permalink /patch/287516/
State New
Headers show

Comments

Jason Merrill - Oct. 31, 2013, 3:44 p.m.
1) Some changes to constant initialization that were needed by an early 
version of the "trivial but deleted" patch.  They aren't needed anymore, 
but still seem correct.

2) We had two functions for building cleanup calls, which is unnecessary 
duplication.  Also, there's no point in limiting use of 
LOOKUP_NONVIRTUAL in cxx_maybe_build_cleanup because it will be added 
anyway in build_new_method_call.

Tested x86_64-pc-linux-gnu, applying to trunk.

Patch

commit 72431a75a083a8e89cb44b0f2258b6400c98add6
Author: Jason Merrill <jason@redhat.com>
Date:   Thu Oct 17 14:05:37 2013 -0400

    	* decl.c (cxx_maybe_build_cleanup): Always set LOOKUP_NONVIRTUAL.
    	* decl2.c (build_cleanup): Just call cxx_maybe_build_cleanup.

diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 476d559..09c1daa 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -14298,9 +14298,7 @@  cxx_maybe_build_cleanup (tree decl, tsubst_flags_t complain)
   type = TREE_TYPE (decl);
   if (type_build_dtor_call (type))
     {
-      int flags = LOOKUP_NORMAL|LOOKUP_DESTRUCTOR;
-      bool has_vbases = (TREE_CODE (type) == RECORD_TYPE
-			 && CLASSTYPE_VBASECLASSES (type));
+      int flags = LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR;
       tree addr;
       tree call;
 
@@ -14309,10 +14307,6 @@  cxx_maybe_build_cleanup (tree decl, tsubst_flags_t complain)
       else
 	addr = build_address (decl);
 
-      /* Optimize for space over speed here.  */
-      if (!has_vbases || flag_expensive_optimizations)
-	flags |= LOOKUP_NONVIRTUAL;
-
       call = build_delete (TREE_TYPE (addr), addr,
 			   sfk_complete_destructor, flags, 0, complain);
       if (call == error_mark_node)
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index d776471..18e0e52 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -2722,26 +2722,9 @@  import_export_decl (tree decl)
 tree
 build_cleanup (tree decl)
 {
-  tree temp;
-  tree type = TREE_TYPE (decl);
-
-  /* This function should only be called for declarations that really
-     require cleanups.  */
-  gcc_assert (!TYPE_HAS_TRIVIAL_DESTRUCTOR (type));
-
-  /* Treat all objects with destructors as used; the destructor may do
-     something substantive.  */
-  mark_used (decl);
-
-  if (TREE_CODE (type) == ARRAY_TYPE)
-    temp = decl;
-  else
-    temp = build_address (decl);
-  temp = build_delete (TREE_TYPE (temp), temp,
-		       sfk_complete_destructor,
-		       LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0,
-		       tf_warning_or_error);
-  return temp;
+  tree clean = cxx_maybe_build_cleanup (decl, tf_warning_or_error);
+  gcc_assert (clean != NULL_TREE);
+  return clean;
 }
 
 /* Returns the initialization guard variable for the variable DECL,