re PR c++/15214 (Warning non-virtual-dtor too strict)
authorTom Marshall <tmarshall@real.com>
Fri, 28 May 2004 17:01:20 +0000 (17:01 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 28 May 2004 17:01:20 +0000 (13:01 -0400)
        PR c++/15214
        * class.c (finish_struct_1): Warn only if the dtor is non-private or
        the class has friends.

From-SVN: r82366

gcc/cp/ChangeLog
gcc/cp/class.c

index 92b10d062d0cac1f306020d83054ca9faeb11153..b65da55ef5449c4582066337b2ee9cfcd09f4644 100644 (file)
@@ -1,3 +1,9 @@
+2004-05-20  Tom Marshall  <tmarshall@real.com>
+
+       PR c++/15214
+       * class.c (finish_struct_1): Warn only if the dtor is non-private or
+       the class has friends.
+
 2004-05-27  Adam Nemet  <anemet@lnxw.com>
 
        PR c++/12883
index 47c60e7851d2583271fc3def1adc730d109741c0..0fdd748a7af0d8a3f295e17c675ba8091abeae35 100644 (file)
@@ -5185,7 +5185,16 @@ finish_struct_1 (tree t)
 
   if (warn_nonvdtor && TYPE_POLYMORPHIC_P (t) && TYPE_HAS_DESTRUCTOR (t)
       && DECL_VINDEX (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (t), 1)) == NULL_TREE)
-    warning ("`%#T' has virtual functions but non-virtual destructor", t);
+
+    {
+      tree dtor = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (t), 1);
+
+      /* Warn only if the dtor is non-private or the class has friends */
+      if (!TREE_PRIVATE (dtor) ||
+         (CLASSTYPE_FRIEND_CLASSES (t) ||
+          DECL_FRIENDLIST (TYPE_MAIN_DECL (t))))
+       warning ("%#T' has virtual functions but non-virtual destructor", t);
+    }
 
   complete_vars (t);