diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a9b75a9a83e6c2b87ff9eef1353af8645e931d32..7bd5c22137cbbd3087a4ecc30f3ec9e5ac263dba 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2002-03-27 Mark Mitchell <mark@codesourcery.com> + + PR c++/4884 + * call.c (build_op_delete_call): Allow for the fact the placement + may be a COMPOUND_EXPR. + 2002-03-27 Neil Booth <neil@daikokuya.demon.co.uk> * cp-lang.c (LANG_HOOKS_EXPAND_EXPR): Redefine. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 9d26861cdec62cdafd93c0ded01c369e2d8db40f..8804a61f61e77561ffaf9764f975a5c31a639353 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -3611,15 +3611,22 @@ build_op_delete_call (code, addr, size, flags, placement) if (placement) { - /* placement is a CALL_EXPR around an ADDR_EXPR around a function. */ - + tree alloc_fn; + tree call_expr; + + /* Find the allocation function that is being called. */ + call_expr = placement; + /* Sometimes we have a COMPOUND_EXPR, rather than a simple + CALL_EXPR. */ + while (TREE_CODE (call_expr) == COMPOUND_EXPR) + call_expr = TREE_OPERAND (call_expr, 1); /* Extract the function. */ - argtypes = TREE_OPERAND (TREE_OPERAND (placement, 0), 0); + alloc_fn = get_callee_fndecl (call_expr); + my_friendly_assert (alloc_fn != NULL_TREE, 20020327); /* Then the second parm type. */ - argtypes = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (argtypes))); - + argtypes = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (alloc_fn))); /* Also the second argument. */ - args = TREE_CHAIN (TREE_OPERAND (placement, 1)); + args = TREE_CHAIN (TREE_OPERAND (call_expr, 1)); } else { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7be07363d62b5654e97609ce2e7ecad46d18ed66..f660231720583137d44d8d90579ab0382d69ade6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2002-03-27 Mark Mitchell <mark@codesourcery.com> + + * g++.dg/init/new2.C: New test. + 2002-03-26 Richard Henderson <rth@redhat.com> * gcc.dg/pragma-re-2.c: Avoid empty source file warning. diff --git a/gcc/testsuite/g++.dg/init/new2.C b/gcc/testsuite/g++.dg/init/new2.C new file mode 100644 index 0000000000000000000000000000000000000000..572cb284f39167f6c029b4872c678593a0c5e836 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new2.C @@ -0,0 +1,18 @@ +// Origin: asharji@uwaterloo.ca + +// { dg-do compile } +// { dg-options "-fvolatile" } + +class bar { + public : + bar() { } + void * operator new ( __SIZE_TYPE__ , void * storage ) + { return (void *)1;} +}; + +class foo { + public: + void mem ( ) { + new ( 0 ) bar; + } +};