aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2013-10-04 01:48:18 +0200
committerMarc Glisse <glisse@gcc.gnu.org>2013-10-03 23:48:18 +0000
commitf0aaf8c1ae527f5b2da2f6d7b714f2b9b0bbc317 (patch)
treec2f2b8ffc7ff5ce4c26a9e89430bb041b674065e
parent2765f897251f68fa66b4a115a84f431d5402d88a (diff)
downloadgcc-f0aaf8c1ae527f5b2da2f6d7b714f2b9b0bbc317.zip
gcc-f0aaf8c1ae527f5b2da2f6d7b714f2b9b0bbc317.tar.gz
gcc-f0aaf8c1ae527f5b2da2f6d7b714f2b9b0bbc317.tar.bz2
re PR c++/19476 (Missed null checking elimination with new)
2013-10-04 Marc Glisse <marc.glisse@inria.fr> PR c++/19476 gcc/cp/ * decl.c (cxx_init_decl_processing): Set operator_new_flag. gcc/testsuite/ * g++.dg/tree-ssa/pr19476-5.C: New file. * g++.dg/tree-ssa/pr19476-1.C: Mention pr19476-5.C. From-SVN: r203194
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/decl.c4
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr19476-1.C1
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr19476-5.C11
5 files changed, 25 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index f618475..6327c0b 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2013-10-04 Marc Glisse <marc.glisse@inria.fr>
+
+ PR c++/19476
+ * decl.c (cxx_init_decl_processing): Set operator_new_flag.
+
2013-10-04 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/58584
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 80ceca1..81ed409 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -3800,8 +3800,8 @@ cxx_init_decl_processing (void)
newtype = build_exception_variant (newtype, new_eh_spec);
deltype = cp_build_type_attribute_variant (void_ftype_ptr, extvisattr);
deltype = build_exception_variant (deltype, empty_except_spec);
- push_cp_library_fn (NEW_EXPR, newtype, 0);
- push_cp_library_fn (VEC_NEW_EXPR, newtype, 0);
+ DECL_IS_OPERATOR_NEW (push_cp_library_fn (NEW_EXPR, newtype, 0)) = 1;
+ DECL_IS_OPERATOR_NEW (push_cp_library_fn (VEC_NEW_EXPR, newtype, 0)) = 1;
global_delete_fndecl = push_cp_library_fn (DELETE_EXPR, deltype, ECF_NOTHROW);
push_cp_library_fn (VEC_DELETE_EXPR, deltype, ECF_NOTHROW);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d631f0f..a06e9c5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2013-10-04 Marc Glisse <marc.glisse@inria.fr>
+
+ PR c++/19476
+ * g++.dg/tree-ssa/pr19476-5.C: New file.
+ * g++.dg/tree-ssa/pr19476-1.C: Mention pr19476-5.C.
+
2013-10-04 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/58584
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr19476-1.C b/gcc/testsuite/g++.dg/tree-ssa/pr19476-1.C
index f0fb8d6..cbdad90 100644
--- a/gcc/testsuite/g++.dg/tree-ssa/pr19476-1.C
+++ b/gcc/testsuite/g++.dg/tree-ssa/pr19476-1.C
@@ -1,6 +1,7 @@
/* { dg-do compile } */
/* { dg-options "-O -fdump-tree-ccp1" } */
+// See pr19476-5.C for a version without including <new>.
#include <new>
int f(){
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr19476-5.C b/gcc/testsuite/g++.dg/tree-ssa/pr19476-5.C
new file mode 100644
index 0000000..bec0bb5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/pr19476-5.C
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-ccp1" } */
+
+// See pr19476-1.C for a version that includes <new>.
+
+int g(){
+ return 42 + (0 == new int[50]);
+}
+
+/* { dg-final { scan-tree-dump "return 42" "ccp1" } } */
+/* { dg-final { cleanup-tree-dump "ccp1" } } */