Commit 014ab419 by Jonathan Wakely Committed by Jonathan Wakely

invoke.texi: Document -Wdelete-non-virtual-dtor.

	* 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
parent f90d37ec
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> 2011-06-04 Jakub Jelinek <jakub@redhat.com>
PR target/49281 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> 2011-05-30 Nathan Froyd <froydnj@gcc.gnu.org>
PR bootstrap/49190 PR bootstrap/49190
......
...@@ -405,6 +405,7 @@ c_common_handle_option (size_t scode, const char *arg, int value, ...@@ -405,6 +405,7 @@ c_common_handle_option (size_t scode, const char *arg, int value,
warn_sign_compare = value; warn_sign_compare = value;
warn_reorder = value; warn_reorder = value;
warn_cxx0x_compat = value; warn_cxx0x_compat = value;
warn_delnonvdtor = value;
} }
cpp_opts->warn_trigraphs = value; cpp_opts->warn_trigraphs = value;
......
...@@ -331,6 +331,10 @@ Wdeclaration-after-statement ...@@ -331,6 +331,10 @@ Wdeclaration-after-statement
C ObjC Var(warn_declaration_after_statement) Warning C ObjC Var(warn_declaration_after_statement) Warning
Warn when a declaration is found after a statement 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 Wdeprecated
C C++ ObjC ObjC++ Var(warn_deprecated) Init(1) Warning C C++ ObjC ObjC++ Var(warn_deprecated) Init(1) Warning
Warn if a deprecated compiler feature, class, method, or field is used 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> 2011-06-03 Jakub Jelinek <jakub@redhat.com>
PR c++/49276 PR c++/49276
......
...@@ -3421,6 +3421,25 @@ build_delete (tree type, tree addr, special_function_kind auto_delete, ...@@ -3421,6 +3421,25 @@ build_delete (tree type, tree addr, special_function_kind auto_delete,
} }
complete_p = false; 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)) if (VOID_TYPE_P (type) || !complete_p || !MAYBE_CLASS_TYPE_P (type))
/* Call the builtin operator delete. */ /* Call the builtin operator delete. */
......
...@@ -2331,6 +2331,15 @@ Warn when a class seems unusable because all the constructors or ...@@ -2331,6 +2331,15 @@ Warn when a class seems unusable because all the constructors or
destructors in that class are private, and it has neither friends nor destructors in that class are private, and it has neither friends nor
public static member functions. 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)} @item -Wnoexcept @r{(C++ and Objective-C++ only)}
@opindex Wnoexcept @opindex Wnoexcept
@opindex Wno-noexcept @opindex Wno-noexcept
......
2011-06-04 Jonathan Wakely <jwakely.gcc@gmail.com> 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 PR c++/33840
* g++.dg/diagnostic/bitfld2.C: New. * g++.dg/diagnostic/bitfld2.C: New.
......
// { 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment