Commit 412bbe81 by Jakub Jelinek Committed by Jakub Jelinek

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
parent a9eafe81
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> 2007-08-17 Andrew Pinski <andrew_pinski@playstation.sony.com>
PR c++/28989 PR c++/28989
......
...@@ -1656,7 +1656,7 @@ build_new_1 (tree placement, tree type, tree nelts, tree init, ...@@ -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 beginning of the storage allocated for an array-new expression in
order to store the number of elements. */ order to store the number of elements. */
tree cookie_size = NULL_TREE; tree cookie_size = NULL_TREE;
tree placement_var; tree placement_expr;
/* True if the function we are calling is a placement allocation /* True if the function we are calling is a placement allocation
function. */ function. */
bool placement_allocation_fn_p; bool placement_allocation_fn_p;
...@@ -1749,17 +1749,16 @@ build_new_1 (tree placement, tree type, tree nelts, tree init, ...@@ -1749,17 +1749,16 @@ build_new_1 (tree placement, tree type, tree nelts, tree init,
alloc_fn = NULL_TREE; alloc_fn = NULL_TREE;
/* If PLACEMENT is a simple pointer type, then copy it into /* If PLACEMENT is a simple pointer type, then copy it into
PLACEMENT_VAR. */ PLACEMENT_EXPR. */
if (processing_template_decl if (processing_template_decl
|| placement == NULL_TREE || placement == NULL_TREE
|| TREE_CHAIN (placement) != NULL_TREE || TREE_CHAIN (placement) != NULL_TREE
|| TREE_CODE (TREE_TYPE (TREE_VALUE (placement))) != POINTER_TYPE) || TREE_CODE (TREE_TYPE (TREE_VALUE (placement))) != POINTER_TYPE)
placement_var = NULL_TREE; placement_expr = NULL_TREE;
else else
{ {
placement_var = get_temp_regvar (TREE_TYPE (TREE_VALUE (placement)), placement_expr = save_expr (TREE_VALUE (placement));
TREE_VALUE (placement)); placement = tree_cons (NULL_TREE, placement_expr, NULL_TREE);
placement = tree_cons (NULL_TREE, placement_var, NULL_TREE);
} }
/* Allocate the object. */ /* Allocate the object. */
...@@ -1857,7 +1856,7 @@ build_new_1 (tree placement, tree type, tree nelts, tree init, ...@@ -1857,7 +1856,7 @@ build_new_1 (tree placement, tree type, tree nelts, tree init,
{ {
rval = build_nop (pointer_type, alloc_call); rval = build_nop (pointer_type, alloc_call);
if (placement != NULL) if (placement != NULL)
rval = avoid_placement_new_aliasing (rval, placement_var); rval = avoid_placement_new_aliasing (rval, placement_expr);
return rval; return rval;
} }
...@@ -2122,7 +2121,7 @@ build_new_1 (tree placement, tree type, tree nelts, tree init, ...@@ -2122,7 +2121,7 @@ build_new_1 (tree placement, tree type, tree nelts, tree init,
gcc_assert (!lvalue_p (rval)); gcc_assert (!lvalue_p (rval));
if (placement != NULL) if (placement != NULL)
rval = avoid_placement_new_aliasing (rval, placement_var); rval = avoid_placement_new_aliasing (rval, placement_expr);
return rval; return rval;
} }
......
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> 2007-08-20 Andrew Pinski <andrew_pinski@playstation.sony.com>
PR middle-end/30564 PR middle-end/30564
// 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment