diff options
author | Paolo Carlini <paolo@gcc.gnu.org> | 2013-09-09 14:31:16 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2013-09-09 14:31:16 +0000 |
commit | c9b0866a1e5a5c4fd536e6217c1f2b308219598b (patch) | |
tree | ba7a48759b2510eff4b81f951387f1671f2df985 /gcc | |
parent | 78d8b9f019c6445a62e816576dfb6005963708ca (diff) | |
download | gcc-c9b0866a1e5a5c4fd536e6217c1f2b308219598b.zip gcc-c9b0866a1e5a5c4fd536e6217c1f2b308219598b.tar.gz gcc-c9b0866a1e5a5c4fd536e6217c1f2b308219598b.tar.bz2 |
re PR c++/43452 (Array delete causes error on incomplete type)
2013-09-09 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/43452
* doc/invoke.texi (-Wdelete-incomplete): Document it.
/c-family
2013-09-09 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/43452
* c.opt (Wdelete-incomplete): Add.
/cp
2013-09-09 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/43452
* init.c (build_vec_delete_1): When the type is incomplete emit a
warning, enabled by default (not an error).
(build_delete): Adjust to use OPT_Wdelete_incomplete.
/testsuite
2013-09-09 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/43452
* g++.dg/warn/Wdelete-incomplete-1.C: New.
* g++.dg/warn/Wdelete-incomplete-2.C: Likewise.
* g++.dg/init/delete1.C: Adjust.
From-SVN: r202404
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/c-family/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/c-family/c.opt | 4 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/init.c | 25 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/init/delete1.C | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wdelete-incomplete-1.C | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wdelete-incomplete-2.C | 8 |
9 files changed, 70 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2a4b5bc..03a3657 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2013-09-09 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/43452 + * doc/invoke.texi (-Wdelete-incomplete): Document it. + 2013-09-09 Ian Bolton <ian.bolton@arm.com> * config/aarch64/aarch64.c (aarch64_preferred_reload_class): Return @@ -7,7 +12,8 @@ * config/aarch64/aarch64.c (aarch64_select_cc_mode): Return CC_SWP for comparison with negated operand. - * config/aarch64/aarch64.md (compare_neg<mode>): Match canonical RTL form. + * config/aarch64/aarch64.md (compare_neg<mode>): Match canonical + RTL form. 2013-09-09 Richard Biener <rguenther@suse.de> diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 95babfa..4a93498 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2013-09-09 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/43452 + * c.opt (Wdelete-incomplete): Add. + 2013-09-08 Joern Rennecke <joern.rennecke@embecosm.com> * c-common.c (same_scalar_type_ignoring_signedness): Delete. diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index 9690a08..f390f34 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -339,6 +339,10 @@ Wdeclaration-after-statement C ObjC Var(warn_declaration_after_statement) Warning Warn when a declaration is found after a statement +Wdelete-incomplete +C++ ObjC++ Var(warn_delete_incomplete) Init(1) Warning +Warn when deleting a pointer to incomplete type + Wdelete-non-virtual-dtor C++ ObjC++ Var(warn_delnonvdtor) Warning LangEnabledBy(C++ ObjC++,Wall) Warn about deleting polymorphic objects with non-virtual destructors diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a8d7be3..bc9c498 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,12 @@ 2013-09-09 Paolo Carlini <paolo.carlini@oracle.com> + PR c++/43452 + * init.c (build_vec_delete_1): When the type is incomplete emit a + warning, enabled by default (not an error). + (build_delete): Adjust to use OPT_Wdelete_incomplete. + +2013-09-09 Paolo Carlini <paolo.carlini@oracle.com> + PR c++/58362 * error.c (location_of): Don't handle PARM_DECLs specially. diff --git a/gcc/cp/init.c b/gcc/cp/init.c index f261f99..df7dc7d 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -3078,7 +3078,7 @@ build_vec_delete_1 (tree base, tree maxindex, tree type, { tree virtual_size; tree ptype = build_pointer_type (type = complete_type (type)); - tree size_exp = size_in_bytes (type); + tree size_exp; /* Temporary variables used by the loop. */ tree tbase, tbase_init; @@ -3106,6 +3106,23 @@ build_vec_delete_1 (tree base, tree maxindex, tree type, if (base == error_mark_node || maxindex == error_mark_node) return error_mark_node; + if (!COMPLETE_TYPE_P (type)) + { + if ((complain & tf_warning) + && warning (OPT_Wdelete_incomplete, + "possible problem detected in invocation of " + "delete [] operator:")) + { + cxx_incomplete_type_diagnostic (base, type, DK_WARNING); + inform (input_location, "neither the destructor nor the " + "class-specific operator delete [] will be called, " + "even if they are declared when the class is defined"); + } + return build_builtin_delete_call (base); + } + + size_exp = size_in_bytes (type); + if (! MAYBE_CLASS_TYPE_P (type) || TYPE_HAS_TRIVIAL_DESTRUCTOR (type)) goto no_destructor; @@ -3820,11 +3837,13 @@ build_delete (tree type, tree addr, special_function_kind auto_delete, if (!COMPLETE_TYPE_P (type)) { if ((complain & tf_warning) - && warning (0, "possible problem detected in invocation of " + && warning (OPT_Wdelete_incomplete, + "possible problem detected in invocation of " "delete operator:")) { cxx_incomplete_type_diagnostic (addr, type, DK_WARNING); - inform (input_location, "neither the destructor nor the class-specific " + inform (input_location, + "neither the destructor nor the class-specific " "operator delete will be called, even if they are " "declared when the class is defined"); } diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 4995a5d..5b3c078 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -240,8 +240,8 @@ Objective-C and Objective-C++ Dialects}. -Wno-attributes -Wno-builtin-macro-redefined @gol -Wc++-compat -Wc++11-compat -Wcast-align -Wcast-qual @gol -Wchar-subscripts -Wclobbered -Wcomment -Wconditionally-supported @gol --Wconversion -Wcoverage-mismatch -Wno-cpp -Wno-deprecated @gol --Wno-deprecated-declarations -Wdisabled-optimization @gol +-Wconversion -Wcoverage-mismatch -Wdelete-incomplete -Wno-cpp @gol +-Wno-deprecated -Wno-deprecated-declarations -Wdisabled-optimization @gol -Wno-div-by-zero -Wdouble-promotion -Wempty-body -Wenum-compare @gol -Wno-endif-labels -Werror -Werror=* @gol -Wfatal-errors -Wfloat-equal -Wformat -Wformat=2 @gol @@ -4490,6 +4490,12 @@ types. @option{-Wconversion-null} is enabled by default. Warn when a literal '0' is used as null pointer constant. This can be useful to facilitate the conversion to @code{nullptr} in C++11. +@item -Wdelete-incomplete @r{(C++ and Objective-C++ only)} +@opindex Wdelete-incomplete +@opindex Wno-delete-incomplete +Warn when deleting a pointer to incomplete type, which may cause +undefined behavior at runtime. This warning is enabled by default. + @item -Wuseless-cast @r{(C++ and Objective-C++ only)} @opindex Wuseless-cast @opindex Wno-useless-cast diff --git a/gcc/testsuite/g++.dg/init/delete1.C b/gcc/testsuite/g++.dg/init/delete1.C index 698b127..304dca1 100644 --- a/gcc/testsuite/g++.dg/init/delete1.C +++ b/gcc/testsuite/g++.dg/init/delete1.C @@ -1,7 +1,7 @@ // PR c++/19811 -class C; // { dg-error "forward" } +class C; // { dg-warning "forward" } void foo(void *p) { - delete [] ((C*)p) ; // { dg-error "" } + delete [] ((C*)p) ; // { dg-warning "problem|incomplete" } } diff --git a/gcc/testsuite/g++.dg/warn/Wdelete-incomplete-1.C b/gcc/testsuite/g++.dg/warn/Wdelete-incomplete-1.C new file mode 100644 index 0000000..69689ba --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wdelete-incomplete-1.C @@ -0,0 +1,7 @@ +// PR c++/43452 + +class Foo; // { dg-warning "forward" } +int main() { + Foo* p; // { dg-warning "incomplete" } + delete [] p; // { dg-warning "problem" } +} diff --git a/gcc/testsuite/g++.dg/warn/Wdelete-incomplete-2.C b/gcc/testsuite/g++.dg/warn/Wdelete-incomplete-2.C new file mode 100644 index 0000000..6c3aaa7 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wdelete-incomplete-2.C @@ -0,0 +1,8 @@ +// PR c++/43452 +// { dg-options -Wno-delete-incomplete } + +class Foo; +int main() { + Foo* p; + delete [] p; +} |