diff options
author | Nathan Sidwell <nathan@codesourcery.com> | 2014-04-08 10:19:36 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2014-04-08 10:19:36 +0000 |
commit | 38f09da396c1b67bd9c78c77aa367bb0b230bd80 (patch) | |
tree | 98523bded84202160ffdfcc9ad6330b05feec074 /gcc | |
parent | 55f31857d3582c2533c8c2767b05f18f657d7b24 (diff) | |
download | gcc-38f09da396c1b67bd9c78c77aa367bb0b230bd80.zip gcc-38f09da396c1b67bd9c78c77aa367bb0b230bd80.tar.gz gcc-38f09da396c1b67bd9c78c77aa367bb0b230bd80.tar.bz2 |
invoke (Wnon-virtual-dtor): Update to match implementation.
* doc/invoke (Wnon-virtual-dtor): Update to match implementation.
(Weffc++): Likewise.
cp/
* class.c (check_bases_and_members): Warn about non-virtual dtors
in public bases only. Check warn_ecpp before complaining about
non-polymorphic bases.
testsuite/
* g++.dg/warn/Wnvdtor-2.C: Add more cases.
* g++.dg/warn/Wnvdtor-3.C: Likewise.
* g++.dg/warn/Wnvdtor-4.C: Likewise.
From-SVN: r209212
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/class.c | 13 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wnvdtor-2.C | 21 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wnvdtor-3.C | 21 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wnvdtor-4.C | 21 |
8 files changed, 92 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 34a0d5e..ec85f09 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-04-08 Nathan Sidwell <nathan@codesourcery.com> + + * doc/invoke (Wnon-virtual-dtor): Update to match implementation. + (Weffc++): Likewise. + 2014-04-07 Jan Hubicka <hubcika@ucw.cz> * ipa-devirt.c (maybe_record_node): When node is not recorded, diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4a491cc..60aa29f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2014-04-08 Nathan Sidwell <nathan@codesourcery.com> + + * class.c (check_bases_and_members): Warn about non-virtual dtors + in public bases only. Check warn_ecpp before complaining about + non-polymorphic bases. + 2014-04-04 Fabien ChĂȘne <fabien@gcc.gnu.org> * decl.c (duplicate_decls): Check for the return of warning_at diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 9d6d126..334bfd5 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -5570,21 +5570,24 @@ check_bases_and_members (tree t) TYPE_HAS_COMPLEX_MOVE_ASSIGN (t) |= TYPE_CONTAINS_VPTR_P (t); TYPE_HAS_COMPLEX_DFLT (t) |= TYPE_CONTAINS_VPTR_P (t); - /* Warn if a base of a polymorphic type has an accessible + /* Warn if a public base of a polymorphic type has an accessible non-virtual destructor. It is only now that we know the class is polymorphic. Although a polymorphic base will have a already been diagnosed during its definition, we warn on use too. */ if (TYPE_POLYMORPHIC_P (t) && warn_nonvdtor) { - tree binfo, base_binfo; + tree binfo = TYPE_BINFO (t); + vec<tree, va_gc> *accesses = BINFO_BASE_ACCESSES (binfo); + tree base_binfo; unsigned i; - for (binfo = TYPE_BINFO (t), i = 0; - BINFO_BASE_ITERATE (binfo, i, base_binfo); i++) + for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++) { tree basetype = TREE_TYPE (base_binfo); - if (accessible_nvdtor_p (basetype)) + if ((*accesses)[i] == access_public_node + && (TYPE_POLYMORPHIC_P (basetype) || warn_ecpp) + && accessible_nvdtor_p (basetype)) warning (OPT_Wnon_virtual_dtor, "base class %q#T has accessible non-virtual destructor", basetype); diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index cfc6d98..f70f0d6 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -2671,10 +2671,10 @@ the compiler to never throw an exception. @opindex Wnon-virtual-dtor @opindex Wno-non-virtual-dtor Warn when a class has virtual functions and an accessible non-virtual -destructor itself or in a base class, or has in which case it is -possible but unsafe to delete an instance of a derived class through a -pointer to the base class. This warning is automatically enabled if -@option{-Weffc++} is specified. +destructor itself or in an accessible polymorphic base class, in which +case it is possible but unsafe to delete an instance of a derived +class through a pointer to the class itself or base class. This +warning is automatically enabled if @option{-Weffc++} is specified. @item -Wreorder @r{(C++ and Objective-C++ only)} @opindex Wreorder @@ -2744,7 +2744,9 @@ Never overload @code{&&}, @code{||}, or @code{,}. @end itemize This option also enables @option{-Wnon-virtual-dtor}, which is also -one of the effective C++ recommendations. +one of the effective C++ recommendations. However, the check is +extended to warn about the lack of virtual destructor in accessible +non-polymorphic bases classes too. When selecting this option, be aware that the standard library headers do not obey all of these guidelines; use @samp{grep -v} diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 16f23c5..04d964a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2014-04-08 Nathan Sidwell <nathan@codesourcery.com> + + * g++.dg/warn/Wnvdtor-2.C: Add more cases. + * g++.dg/warn/Wnvdtor-3.C: Likewise. + * g++.dg/warn/Wnvdtor-4.C: Likewise. + 2014-04-07 Eric Botcazou <ebotcazou@adacore.com> * gnat.dg/test_raise_from_pure.adb: UnXFAIL for ARM. diff --git a/gcc/testsuite/g++.dg/warn/Wnvdtor-2.C b/gcc/testsuite/g++.dg/warn/Wnvdtor-2.C index de7c74bd..9f2e4be 100644 --- a/gcc/testsuite/g++.dg/warn/Wnvdtor-2.C +++ b/gcc/testsuite/g++.dg/warn/Wnvdtor-2.C @@ -54,4 +54,23 @@ public: }; struct H {}; -struct I : H {}; + +struct I1 : H +{}; +struct I2 : private H +{}; + +struct J1 : H +{ virtual ~J1 ();}; +struct J2 : private H +{ virtual ~J2 ();}; + +struct K // { dg-warning "accessible non-virtual destructor" } +{ + virtual void k (); +}; + +struct L1 : K // { dg-warning "accessible non-virtual destructor" } +{virtual ~L1 ();}; +struct L2 : private K +{virtual ~L2 ();}; diff --git a/gcc/testsuite/g++.dg/warn/Wnvdtor-3.C b/gcc/testsuite/g++.dg/warn/Wnvdtor-3.C index 8ec8154..e83134b 100644 --- a/gcc/testsuite/g++.dg/warn/Wnvdtor-3.C +++ b/gcc/testsuite/g++.dg/warn/Wnvdtor-3.C @@ -53,4 +53,23 @@ public: }; struct H {}; -struct I : H {}; + +struct I1 : H +{}; +struct I2 : private H +{}; + +struct J1 : H // { dg-warning "accessible non-virtual destructor" } +{ virtual ~J1 ();}; +struct J2 : private H +{ virtual ~J2 ();}; + +struct K // { dg-warning "accessible non-virtual destructor" } +{ + virtual void k (); +}; + +struct L1 : K // { dg-warning "accessible non-virtual destructor" } +{virtual ~L1 ();}; +struct L2 : private K +{virtual ~L2 ();}; diff --git a/gcc/testsuite/g++.dg/warn/Wnvdtor-4.C b/gcc/testsuite/g++.dg/warn/Wnvdtor-4.C index f63ffdc..dd6d9d7 100644 --- a/gcc/testsuite/g++.dg/warn/Wnvdtor-4.C +++ b/gcc/testsuite/g++.dg/warn/Wnvdtor-4.C @@ -53,4 +53,23 @@ public: }; struct H {}; -struct I : H {}; + +struct I1 : H +{}; +struct I2 : private H +{}; + +struct J1 : H +{ virtual ~J1 ();}; +struct J2 : private H +{ virtual ~J2 ();}; + +struct K +{ + virtual void k (); +}; + +struct L1 : K +{virtual ~L1 ();}; +struct L2 : private K +{virtual ~L2 ();}; |