Remove the null check from placement new in all modes
authorVille Voutilainen <ville.voutilainen@gmail.com>
Mon, 13 Nov 2017 17:02:06 +0000 (19:02 +0200)
committerVille Voutilainen <ville@gcc.gnu.org>
Mon, 13 Nov 2017 17:02:06 +0000 (19:02 +0200)
gcc/cp/

Remove the null check from placement new in all modes
* init.c (build_new_1): Don't do a null check for
a namespace-scope non-replaceable placement new
in any mode unless -fcheck-new is provided.

testsuite/

Remove the null check from placement new in all modes
* g++.dg/init/pr35878_1.C: Adjust.
* g++.dg/init/pr35878_4.C: New.
* g++.dg/torture/pr48695.C: Adjust.
* g++.dg/tree-ssa/pr31146-2.C: Likewise.
* g++.dg/tree-ssa/pr41428.C: Adjust.

From-SVN: r254694

gcc/cp/ChangeLog
gcc/cp/init.c
gcc/testsuite/g++.dg/init/pr35878_1.C
gcc/testsuite/g++.dg/init/pr35878_4.C [new file with mode: 0644]
gcc/testsuite/g++.dg/torture/pr48695.C
gcc/testsuite/g++.dg/tree-ssa/pr31146-2.C
gcc/testsuite/g++.dg/tree-ssa/pr41428.C

index df9120137565053ed4dc6dcfbbf60814217a27fe..73fa99967edc0bfb6d8a8b37152093dc41fe098e 100644 (file)
@@ -1,3 +1,10 @@
+2017-11-13  Ville Voutilainen  <ville.voutilainen@gmail.com>
+
+       Remove the null check from placement new in all modes
+       * init.c (build_new_1): Don't do a null check for
+       a namespace-scope non-replaceable placement new
+       in any mode unless -fcheck-new is provided.
+
 2017-11-07 Boris Kolpackov  <boris@codesynthesis.com>
 
        * Make-lang.in (CP_PLUGIN_HEADERS): Add operators.def since included
index 9e6e3aff779158ffd9e86b90aa0398e2bc5194fa..1fcd91d108db64eb7ee9a08510923cde1525d9ad 100644 (file)
@@ -2758,7 +2758,7 @@ malloc_alignment ()
 static bool
 std_placement_new_fn_p (tree alloc_fn)
 {
-  if ((cxx_dialect > cxx14) && DECL_NAMESPACE_SCOPE_P (alloc_fn))
+  if (DECL_NAMESPACE_SCOPE_P (alloc_fn))
     {
       tree first_arg = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (alloc_fn)));
       if ((TREE_VALUE (first_arg) == ptr_type_node)
index e2fc4933425bcf8fd007467b535ad80c496ec9e7..7fb3221a3273066e0cf10c51a640d341fe6ba824 100644 (file)
@@ -1,7 +1,7 @@
 // PR c++/35878
 // { dg-do compile }
 // { dg-options "-O2 -std=gnu++11 -fdump-tree-optimized" }
-// { dg-final { scan-tree-dump-times "v_\[0-9]+\\(D\\) \[=!]= 0" 1 "optimized" } }
+// { dg-final { scan-tree-dump-not "v_\[0-9]+\\(D\\) \[=!]= 0" "optimized" } }
 
 #include <new>
 #include <utility>
diff --git a/gcc/testsuite/g++.dg/init/pr35878_4.C b/gcc/testsuite/g++.dg/init/pr35878_4.C
new file mode 100644 (file)
index 0000000..bd27565
--- /dev/null
@@ -0,0 +1,23 @@
+// PR c++/35878
+// { dg-do compile }
+// { dg-options "-O2 -std=gnu++11 -fcheck-new -fdump-tree-optimized" }
+// { dg-final { scan-tree-dump-times "v_\[0-9]+\\(D\\) \[=!]= 0" 1 "optimized" } }
+
+#include <new>
+#include <utility>
+
+struct s1{
+  int a;
+  int b;
+  int c;
+};
+
+void f1 (s1 * v, s1&& s)
+{
+       new (v) s1(std::move(s));
+}
+
+void f2 (s1 * v, s1&& s)
+{
+       *v = std::move(s);
+}
index 44e6c771dbaae4c0d9a23b9ca981111952c685ef..2f2953d9999c418996e0d050e97d4b6490a71ea1 100644 (file)
@@ -1,4 +1,5 @@
 // { dg-do run }
+/* { dg-options "-fcheck-new" } */
 
 typedef __SIZE_TYPE__ size_t;
 
index 500d8b639ee7bdb0a752036bbe5bae8fa5fa6893..9fb5dc1b60c28828b22d71b729b9919461d4cd4f 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O -fno-tree-vrp -fdump-tree-forwprop1" } */
+/* { dg-options "-O -fcheck-new -fno-tree-vrp -fdump-tree-forwprop1" } */
 
 #include <new>
 
@@ -20,6 +20,5 @@ double foo (void)
   return v.a[2];
 }
 
-/* -std=c++17 and above doesn't emit operator new () != NULL, so there is
-   nothing to fold anymore.  */
-/* { dg-final { scan-tree-dump "Replaced .* != 0B. with .1" "forwprop1" { target c++14_down } } } */
+/* GCC 8 emits operator new () != NULL with -fcheck-new. */
+/* { dg-final { scan-tree-dump "Replaced .* != 0B. with .1" "forwprop1" } } */
index c0a5eb627be8da58d0d934d93cf84c72eda6b0f3..7aff519e746eaed963dcd7868cd81e050bc2b18c 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O -fdump-tree-ccp1-details" } */
+/* { dg-options "-O -fcheck-new -fdump-tree-ccp1-details" } */
 
 extern "C" void abort (void);
 inline void *operator new (__SIZE_TYPE__, void *__p) throw () { return __p; }
@@ -11,6 +11,5 @@ int foo(void)
   return *(int *)&f;
 }
 
-/* -std=c++17 and above doesn't emit operator new () != NULL, so there is
-   nothing to fold anymore.  */
-/* { dg-final { scan-tree-dump "Folded into: if \\\(1 != 0\\\)" "ccp1" { target c++14_down } } } */
+/* GCC 8 emits operator new () != NULL with -fcheck-new. */
+/* { dg-final { scan-tree-dump "Folded into: if \\\(1 != 0\\\)" "ccp1" } } */