aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2014-04-08 10:19:36 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2014-04-08 10:19:36 +0000
commit38f09da396c1b67bd9c78c77aa367bb0b230bd80 (patch)
tree98523bded84202160ffdfcc9ad6330b05feec074 /gcc
parent55f31857d3582c2533c8c2767b05f18f657d7b24 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/class.c13
-rw-r--r--gcc/doc/invoke.texi12
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/warn/Wnvdtor-2.C21
-rw-r--r--gcc/testsuite/g++.dg/warn/Wnvdtor-3.C21
-rw-r--r--gcc/testsuite/g++.dg/warn/Wnvdtor-4.C21
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 ();};