* doc/invoke.texi: Document -Wdelete-non-virtual-dtor.
c-family:
* c.opt: Add -Wdelete-non-virtual-dtor.
* c-opts.c (c_common_handle_option): Include it in -Wall.
cp:
* init.c (build_delete): Warn when deleting type with non-virtual
destructor.
testsuite:
* testsuite/g++.dg/warn/delete-non-virtual-dtor.C: New.
From-SVN: r174643
+2011-06-04 Jonathan Wakely <jwakely.gcc@gmail.com>
+
+ * doc/invoke.texi: Document -Wdelete-non-virtual-dtor.
+
2011-06-04 Jakub Jelinek <jakub@redhat.com>
PR target/49281
+2011-06-02 Jonathan Wakely <jwakely.gcc@gmail.com>
+
+ * c.opt: Add -Wdelete-non-virtual-dtor.
+ * c-opts.c (c_common_handle_option): Include it in -Wall.
+
2011-05-30 Nathan Froyd <froydnj@gcc.gnu.org>
PR bootstrap/49190
warn_sign_compare = value;
warn_reorder = value;
warn_cxx0x_compat = value;
+ warn_delnonvdtor = value;
}
cpp_opts->warn_trigraphs = value;
C ObjC Var(warn_declaration_after_statement) Warning
Warn when a declaration is found after a statement
+Wdelete-non-virtual-dtor
+C++ ObjC++ Var(warn_delnonvdtor) Warning
+Warn about deleting polymorphic objects with non-virtual destructors
+
Wdeprecated
C C++ ObjC ObjC++ Var(warn_deprecated) Init(1) Warning
Warn if a deprecated compiler feature, class, method, or field is used
+2011-06-04 Jonathan Wakely <jwakely.gcc@gmail.com>
+
+ * init.c (build_delete): Warn when deleting type with non-virtual
+ destructor.
+
2011-06-03 Jakub Jelinek <jakub@redhat.com>
PR c++/49276
}
complete_p = false;
}
+ else if (warn_delnonvdtor && MAYBE_CLASS_TYPE_P (type)
+ && !CLASSTYPE_FINAL (type) && TYPE_POLYMORPHIC_P (type))
+ {
+ tree dtor;
+ dtor = CLASSTYPE_DESTRUCTORS (type);
+ if (!dtor || !DECL_VINDEX (dtor))
+ {
+ if (CLASSTYPE_PURE_VIRTUALS (type))
+ warning (OPT_Wdelete_non_virtual_dtor,
+ "deleting object of abstract class type %qT"
+ " which has non-virtual destructor"
+ " will cause undefined behaviour", type);
+ else
+ warning (OPT_Wdelete_non_virtual_dtor,
+ "deleting object of polymorphic class type %qT"
+ " which has non-virtual destructor"
+ " might cause undefined behaviour", type);
+ }
+ }
}
if (VOID_TYPE_P (type) || !complete_p || !MAYBE_CLASS_TYPE_P (type))
/* Call the builtin operator delete. */
destructors in that class are private, and it has neither friends nor
public static member functions.
+@item -Wdelete-non-virtual-dtor @r{(C++ and Objective-C++ only)}
+@opindex Wdelete-non-virtual-dtor
+@opindex Wno-delete-non-virtual-dtor
+Warn when @samp{delete} is used to destroy an instance of a class which
+has virtual functions and non-virtual destructor. It is unsafe to delete
+an instance of a derived class through a pointer to a base class if the
+base class does not have a virtual destructor. This warning is enabled
+by @option{-Wall}.
+
@item -Wnoexcept @r{(C++ and Objective-C++ only)}
@opindex Wnoexcept
@opindex Wno-noexcept
+2011-06-04 Jonathan Wakely <jwakely.gcc@gmail.com>
+
+ * testsuite/g++.dg/warn/delete-non-virtual-dtor.C: New.
+
2011-06-04 Jonathan Wakely <jwakely.gcc@gmail.com>
PR c++/33840
--- /dev/null
+// { dg-options "-std=gnu++0x -Wdelete-non-virtual-dtor" }
+// { dg-do compile }
+
+struct polyBase { virtual void f(); };
+
+void f(polyBase* p, polyBase* arr)
+{
+ delete p; // { dg-warning "non-virtual destructor might" }
+ delete [] arr;
+}
+
+struct polyDerived : polyBase { };
+
+void f(polyDerived* p, polyDerived* arr)
+{
+ delete p; // { dg-warning "non-virtual destructor might" }
+ delete [] arr;
+}
+
+struct absDerived : polyBase { virtual void g() = 0; };
+
+void f(absDerived* p, absDerived* arr)
+{
+ delete p; // { dg-warning "non-virtual destructor will" }
+ delete [] arr;
+}
+
+struct finalDerived final : polyBase { };
+
+void f(finalDerived* p, finalDerived* arr)
+{
+ delete p; // no error for final classes
+ delete [] arr;
+}
+
+struct safeBase { virtual ~safeBase(); };
+struct safeDerived : safeBase { virtual void f(); };
+
+void f(safeDerived* p, safeDerived* arr)
+{
+ delete p; // no error because base has virtual dtor
+ delete [] arr;
+}
+