re PR c++/33025 (Wrong calling of placement new with conditionals)
authorJakub Jelinek <jakub@redhat.com>
Mon, 20 Aug 2007 07:53:58 +0000 (09:53 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 20 Aug 2007 07:53:58 +0000 (09:53 +0200)
PR c++/33025
* init.c (build_new_1): Rename placement_var variable to placement_expr.
Initialize it with save_expr rather than get_temp_regvar.

* g++.dg/init/new23.C: New test.

From-SVN: r127639

gcc/cp/ChangeLog
gcc/cp/init.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/init/new23.C [new file with mode: 0644]

index 3fd17c4f1914023874f3a8427171d75dbcb8dee3..b12b7853f9145da1bceda46f9da848f5b3e696ab 100644 (file)
@@ -1,3 +1,9 @@
+2007-08-20  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/33025
+       * init.c (build_new_1): Rename placement_var variable to placement_expr.
+       Initialize it with save_expr rather than get_temp_regvar.
+
 2007-08-17  Andrew Pinski  <andrew_pinski@playstation.sony.com>
 
        PR c++/28989
index 08f8b76f8c5be3b01fc95e4e0f7ce532562217c9..3c74812e01a8fe9622a1735c7805a33935904987 100644 (file)
@@ -1656,7 +1656,7 @@ build_new_1 (tree placement, tree type, tree nelts, tree init,
      beginning of the storage allocated for an array-new expression in
      order to store the number of elements.  */
   tree cookie_size = NULL_TREE;
-  tree placement_var;
+  tree placement_expr;
   /* True if the function we are calling is a placement allocation
      function.  */
   bool placement_allocation_fn_p;
@@ -1749,17 +1749,16 @@ build_new_1 (tree placement, tree type, tree nelts, tree init,
   alloc_fn = NULL_TREE;
 
   /* If PLACEMENT is a simple pointer type, then copy it into
-     PLACEMENT_VAR.  */
+     PLACEMENT_EXPR.  */
   if (processing_template_decl
       || placement == NULL_TREE
       || TREE_CHAIN (placement) != NULL_TREE
       || TREE_CODE (TREE_TYPE (TREE_VALUE (placement))) != POINTER_TYPE)
-    placement_var = NULL_TREE;
+    placement_expr = NULL_TREE;
   else
     {
-      placement_var = get_temp_regvar (TREE_TYPE (TREE_VALUE (placement)),
-                                      TREE_VALUE (placement));
-      placement = tree_cons (NULL_TREE, placement_var, NULL_TREE);
+      placement_expr = save_expr (TREE_VALUE (placement));
+      placement = tree_cons (NULL_TREE, placement_expr, NULL_TREE);
     }
 
   /* Allocate the object.  */
@@ -1857,7 +1856,7 @@ build_new_1 (tree placement, tree type, tree nelts, tree init,
     {
       rval = build_nop (pointer_type, alloc_call);
       if (placement != NULL)
-       rval = avoid_placement_new_aliasing (rval, placement_var);
+       rval = avoid_placement_new_aliasing (rval, placement_expr);
       return rval;
     }
 
@@ -2122,7 +2121,7 @@ build_new_1 (tree placement, tree type, tree nelts, tree init,
   gcc_assert (!lvalue_p (rval));
 
   if (placement != NULL)
-    rval = avoid_placement_new_aliasing (rval, placement_var);
+    rval = avoid_placement_new_aliasing (rval, placement_expr);
 
   return rval;
 }
index 22e5df78637408f775d2a7d0a659c03cb5895bb4..1c792ad59de1401259c3de659612a88219ab2a6a 100644 (file)
@@ -1,3 +1,8 @@
+2007-08-20  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/33025
+       * g++.dg/init/new23.C: New test.
+
 2007-08-20  Andrew Pinski  <andrew_pinski@playstation.sony.com>
 
        PR middle-end/30564
diff --git a/gcc/testsuite/g++.dg/init/new23.C b/gcc/testsuite/g++.dg/init/new23.C
new file mode 100644 (file)
index 0000000..cedd898
--- /dev/null
@@ -0,0 +1,20 @@
+// PR c++/33025
+// { dg-do run }
+// { dg-options "-O2" }
+
+typedef __SIZE_TYPE__ size_t;
+inline void *operator new (size_t, void *p) throw () { return p; }
+extern "C" void abort ();
+
+int
+main()
+{
+  const unsigned num = 10;
+  unsigned *data = new unsigned[2 * num];
+  unsigned *ptr = data;
+  for (unsigned i = 0; i < 2 * num; ++i)
+    (i % 2 == 0) ? new (ptr) unsigned (2) : new (ptr++) unsigned (1);
+  if (ptr - data != num)
+    abort ();
+  return 0;
+}