aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <paolo@gcc.gnu.org>2013-09-09 14:31:16 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2013-09-09 14:31:16 +0000
commitc9b0866a1e5a5c4fd536e6217c1f2b308219598b (patch)
treeba7a48759b2510eff4b81f951387f1671f2df985 /gcc
parent78d8b9f019c6445a62e816576dfb6005963708ca (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/c-family/ChangeLog5
-rw-r--r--gcc/c-family/c.opt4
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/init.c25
-rw-r--r--gcc/doc/invoke.texi10
-rw-r--r--gcc/testsuite/g++.dg/init/delete1.C4
-rw-r--r--gcc/testsuite/g++.dg/warn/Wdelete-incomplete-1.C7
-rw-r--r--gcc/testsuite/g++.dg/warn/Wdelete-incomplete-2.C8
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;
+}