Patchwork fix c++/49605: -Wdelete-non-virtual-dtor is not picky enough

login
register
mail settings
Submitter Jonathan Wakely
Date July 1, 2011, 7:55 p.m.
Message ID <BANLkTinYSgH5qz7e58fxj-k424Z=V9ZFFQ@mail.gmail.com>
Download mbox | patch
Permalink /patch/102963/
State New
Headers show

Comments

Jonathan Wakely - July 1, 2011, 7:55 p.m.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49605

There's a spurious warning because I didn't realise that build_delete
is used for destroying automatic variables as well as for delete
expression, this fixes it by checking for sfk_deleting_destructor, is
that the right thing to do?

Tested x86_64-linux, ok for trunk?

Or would it be better to move this warning further down, with these
other things that only apply to sfk_deleting_destrutor?

      if (use_global_delete && auto_delete == sfk_deleting_destructor)
        ...
      else if (!DECL_VIRTUAL_P (CLASSTYPE_DESTRUCTORS (type))
               && auto_delete == sfk_deleting_destructor)
        ...
      else if (auto_delete == sfk_deleting_destructor
               && TYPE_GETS_REG_DELETE (type))


cp/ChangeLog

        PR c++/49065
        * init.c (build_delete): Only warn for sfk_deleting_destructor.

testsuite/ChangeLog

        PR c++/49065
        * g++.dg/warn/delete-non-virtual-dtor.C: Adjust.
Jason Merrill - July 1, 2011, 8:12 p.m.
This patch is OK, I think I have a slight preference for the warning 
where it is.

Jason

Patch

Index: cp/init.c
===================================================================
--- cp/init.c	(revision 175752)
+++ cp/init.c	(working copy)
@@ -3467,8 +3467,9 @@ 
 		}
 	      complete_p = false;
 	    }
-	  else if (warn_delnonvdtor && MAYBE_CLASS_TYPE_P (type)
-		   && !CLASSTYPE_FINAL (type) && TYPE_POLYMORPHIC_P (type))
+	  else if (auto_delete == sfk_deleting_destructor && warn_delnonvdtor
+	           && MAYBE_CLASS_TYPE_P (type) && !CLASSTYPE_FINAL (type)
+		   && TYPE_POLYMORPHIC_P (type))
 	    {
 	      tree dtor;
 	      dtor = CLASSTYPE_DESTRUCTORS (type);
Index: testsuite/g++.dg/warn/delete-non-virtual-dtor.C
===================================================================
--- testsuite/g++.dg/warn/delete-non-virtual-dtor.C	(revision 175752)
+++ testsuite/g++.dg/warn/delete-non-virtual-dtor.C	(working copy)
@@ -5,6 +5,7 @@ 
 
 void f(polyBase* p, polyBase* arr)
 {
+  polyBase pb;
   delete p;      // { dg-warning "non-virtual destructor might" }
   delete [] arr;
 }
@@ -13,6 +14,7 @@ 
 
 void f(polyDerived* p, polyDerived* arr)
 {
+  polyDerived pd;
   delete p;      // { dg-warning "non-virtual destructor might" }
   delete [] arr;
 }
@@ -29,6 +31,7 @@ 
 
 void f(finalDerived* p, finalDerived* arr)
 {
+  finalDerived fd;
   delete p;      // no error for final classes
   delete [] arr;
 }
@@ -38,7 +41,26 @@ 
 
 void f(safeDerived* p, safeDerived* arr)
 {
+  safeDerived sd;
   delete p;      // no error because base has virtual dtor
   delete [] arr;
 }
 
+struct polyBaseNonTrivial { ~polyBaseNonTrivial(); virtual void f(); };
+
+void f(polyBaseNonTrivial* p, polyBaseNonTrivial* arr)
+{
+  polyBaseNonTrivial pbnt;
+  delete p;      // { dg-warning "non-virtual destructor might" }
+  delete [] arr;
+}
+
+struct polyDerivedNT : polyBaseNonTrivial { ~polyDerivedNT(); };
+
+void f(polyDerivedNT* p, polyDerivedNT* arr)
+{
+  polyDerivedNT pdnt;
+  delete p;      // { dg-warning "non-virtual destructor might" }
+  delete [] arr;
+}
+