From 412bbe81d92ba9c32a2ebd523391bb8f6637a2f7 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 20 Aug 2007 09:53:58 +0200 Subject: [PATCH] re PR c++/33025 (Wrong calling of placement new with conditionals) 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 | 6 ++++++ gcc/cp/init.c | 15 +++++++-------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/init/new23.C | 20 ++++++++++++++++++++ 4 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/g++.dg/init/new23.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3fd17c4f191..b12b7853f91 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2007-08-20 Jakub Jelinek + + 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 PR c++/28989 diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 08f8b76f8c5..3c74812e01a 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 22e5df78637..1c792ad59de 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-08-20 Jakub Jelinek + + PR c++/33025 + * g++.dg/init/new23.C: New test. + 2007-08-20 Andrew Pinski 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 index 00000000000..cedd898b349 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new23.C @@ -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; +} -- 2.30.2