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
This commit is contained in:
parent
a9eafe819c
commit
412bbe81d9
4 changed files with 38 additions and 8 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
20
gcc/testsuite/g++.dg/init/new23.C
Normal file
20
gcc/testsuite/g++.dg/init/new23.C
Normal file
|
@ -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;
|
||||
}
|
Loading…
Add table
Reference in a new issue