* cp/class.c (finish_struct_1): Warn when a class has virtual
functions and accessible non-virtual destructor.
* doc/invoke.texi (-Wnon-virtual-dtor): Update documentation.
* g++.dg/warn/Wnvdtor-2.C: New testcase.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@127649
138bc75d-0d04-0410-961f-
82ee72b054a4
+2007-08-20 Pawel Sikora <pluto@pld-linux.org>
+
+ * doc/invoke.texi (-Wnon-virtual-dtor): Update documentation.
+
2007-08-20 David Edelsohn <edelsohn@gnu.org>
* dwarf2out.c (text_section_used): Move declaration outside ifdef
+2007-08-20 Pawel Sikora <pluto@pld-linux.org>
+
+ PR c++/7302
+ * class.c (finish_struct_1): Warn when a class has virtual
+ functions and accessible non-virtual destructor.
+
2007-08-20 Richard Guenther <rguenther@suse.de>
PR c++/22369
tree dtor;
dtor = CLASSTYPE_DESTRUCTORS (t);
- /* Warn only if the dtor is non-private or the class has
- friends. */
if (/* An implicitly declared destructor is always public. And,
if it were virtual, we would have created it by now. */
!dtor
|| (!DECL_VINDEX (dtor)
- && (!TREE_PRIVATE (dtor)
- || CLASSTYPE_FRIEND_CLASSES (t)
- || DECL_FRIENDLIST (TYPE_MAIN_DECL (t)))))
- warning (0, "%q#T has virtual functions but non-virtual destructor",
- t);
+ && (/* public non-virtual */
+ (!TREE_PRIVATE (dtor) && !TREE_PROTECTED (dtor))
+ || (/* non-public non-virtual with friends */
+ (TREE_PRIVATE (dtor) || TREE_PROTECTED (dtor))
+ && (CLASSTYPE_FRIEND_CLASSES (t)
+ || DECL_FRIENDLIST (TYPE_MAIN_DECL (t)))))))
+ warning (OPT_Wnon_virtual_dtor,
+ "%q#T has virtual functions and accessible"
+ " non-virtual destructor", t);
}
complete_vars (t);
@item -Wnon-virtual-dtor @r{(C++ only)}
@opindex Wnon-virtual-dtor
-Warn when a class appears to be polymorphic, thereby requiring a virtual
-destructor, yet it declares a non-virtual one. This warning is also
-enabled if -Weffc++ is specified.
+Warn when a class has virtual functions and accessible non-virtual
+destructor, in which case it would be possible but unsafe to delete
+an instance of a derived class through a pointer to the base class.
+This warning is also enabled if -Weffc++ is specified.
@item -Wreorder @r{(C++ only)}
@opindex Wreorder
+2007-03-20 Pawel Sikora <pluto@pld-linux.org>
+
+ * g++.dg/warn/Wnvdtor-2.C: New testcase.
+
2007-08-20 Dorit Nuzman <dorit@il.ibm.com>
* gcc.dg/vect/costmodel/ppc/costmodel-vect-outer-fir.c: Add missing }.
--- /dev/null
+// PR c++/7302
+// { dg-do compile }
+// { dg-options "-Wnon-virtual-dtor" }
+
+// Warn when a class has virtual functions and accessible non-virtual
+// destructor, in which case it would be possible but unsafe to delete
+// an instance of a derived class through a pointer to the base class.
+
+struct A
+{ // { dg-bogus "non-virtual destructor" }
+protected:
+ ~A();
+public:
+ virtual void f() = 0;
+};
+
+struct B
+{ // { dg-bogus "non-virtual destructor" }
+private:
+ ~B();
+public:
+ virtual void f() = 0;
+};
+
+struct C
+{ // { dg-warning "non-virtual destructor" }
+ virtual void f() = 0;
+};
+
+struct D
+{ // { dg-warning "non-virtual destructor" }
+ ~D();
+ virtual void f() = 0;
+};
+
+struct E;
+
+struct F
+{ // { dg-warning "non-virtual destructor" }
+protected:
+ friend class E;
+ ~F();
+public:
+ virtual void f() = 0;
+};
+
+struct G
+{ // { dg-warning "non-virtual destructor" }
+private:
+ friend class E;
+ ~G();
+public:
+ virtual void f() = 0;
+};