diff options
author | Jakub Jelinek <jakub@redhat.com> | 2008-02-12 17:25:47 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2008-02-12 17:25:47 +0100 |
commit | a9de800a1d61a06926b273e73a596474242347e6 (patch) | |
tree | 87d8c554fcf5359f810fbbee23dc77a8d2956de6 /gcc/cp | |
parent | 02e52ae514072eb565ae9d7451ee00756c4f5121 (diff) | |
download | gcc-a9de800a1d61a06926b273e73a596474242347e6.zip gcc-a9de800a1d61a06926b273e73a596474242347e6.tar.gz gcc-a9de800a1d61a06926b273e73a596474242347e6.tar.bz2 |
re PR c++/34862 (operator new placement variant with reference arg not accepted by g++ 4.3)
PR c++/34862
* init.c (build_new_1): Don't create placement_expr before
constructing alloc_call. Verify that the pointer is passed by
value to operator new.
* g++.dg/init/new27.C: New test.
From-SVN: r132257
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/init.c | 37 |
2 files changed, 30 insertions, 14 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c11dcd5..943eef3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2008-02-12 Jakub Jelinek <jakub@redhat.com> + + PR c++/34862 + * init.c (build_new_1): Don't create placement_expr before + constructing alloc_call. Verify that the pointer is passed by + value to operator new. + 2008-02-11 Jason Merrill <jason@redhat.com> PR c++/35097 diff --git a/gcc/cp/init.c b/gcc/cp/init.c index ec59207..040b335 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -1800,7 +1800,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_expr; + tree placement_expr = NULL_TREE; /* True if the function we are calling is a placement allocation function. */ bool placement_allocation_fn_p; @@ -1892,19 +1892,6 @@ 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_EXPR. */ - if (processing_template_decl - || placement == NULL_TREE - || TREE_CHAIN (placement) != NULL_TREE - || TREE_CODE (TREE_TYPE (TREE_VALUE (placement))) != POINTER_TYPE) - placement_expr = NULL_TREE; - else - { - placement_expr = get_target_expr (TREE_VALUE (placement)); - placement = tree_cons (NULL_TREE, placement_expr, NULL_TREE); - } - /* Allocate the object. */ if (! placement && TYPE_FOR_JAVA (elt_type)) { @@ -1999,6 +1986,28 @@ build_new_1 (tree placement, tree type, tree nelts, tree init, gcc_assert (alloc_fn != NULL_TREE); + /* If PLACEMENT is a simple pointer type and is not passed by reference, + then copy it into PLACEMENT_EXPR. */ + if (!processing_template_decl + && placement != NULL_TREE + && TREE_CHAIN (placement) == NULL_TREE + && TREE_CODE (TREE_TYPE (TREE_VALUE (placement))) == POINTER_TYPE + && TREE_CODE (alloc_call) == CALL_EXPR + && call_expr_nargs (alloc_call) == 2 + && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (alloc_call, 0))) == INTEGER_TYPE + && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (alloc_call, 1))) == POINTER_TYPE) + { + tree placement_arg = CALL_EXPR_ARG (alloc_call, 1); + + if (INTEGRAL_TYPE_P (TREE_TYPE (TREE_TYPE (placement_arg))) + || VOID_TYPE_P (TREE_TYPE (TREE_TYPE (placement_arg)))) + { + placement_expr = get_target_expr (TREE_VALUE (placement)); + CALL_EXPR_ARG (alloc_call, 1) + = convert (TREE_TYPE (placement_arg), placement_expr); + } + } + /* In the simple case, we can stop now. */ pointer_type = build_pointer_type (type); if (!cookie_size && !is_initialized) |