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:
parent
01a2a2f512
commit
43f1474491
6 changed files with 81 additions and 10 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 }.
|
||||
|
|
54
gcc/testsuite/g++.dg/warn/Wnvdtor-2.C
Normal file
54
gcc/testsuite/g++.dg/warn/Wnvdtor-2.C
Normal 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;
|
||||
};
|
Loading…
Add table
Reference in a new issue