re PR c++/7302 (-Wnon-virtual-dtor should't complain of protected dtor)

PR c++/7302
        * 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.

From-SVN: r127649
This commit is contained in:
Pawel Sikora 2007-08-20 15:08:24 +00:00 committed by Jason Merrill
parent 01a2a2f512
commit 43f1474491
6 changed files with 81 additions and 10 deletions

View file

@ -1,3 +1,7 @@
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

View file

@ -1,3 +1,9 @@
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

View file

@ -5120,17 +5120,19 @@ finish_struct_1 (tree t)
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);

View file

@ -2011,9 +2011,10 @@ public static member functions.
@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

View file

@ -1,3 +1,7 @@
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 }.

View file

@ -0,0 +1,54 @@
// 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;
};