call.c (build_method_call): Remove bogus code for two-argument delete.

* call.c (build_method_call): Remove bogus code for two-argument
	delete.
	* init.c (build_new_1): Expand on comment, and remove dead code.

From-SVN: r27547
This commit is contained in:
Mark Mitchell 1999-06-16 11:24:10 +00:00 committed by Mark Mitchell
parent 75c613dbc5
commit 4e61a9695a
4 changed files with 41 additions and 33 deletions

View File

@ -1,5 +1,9 @@
1999-06-16 Mark Mitchell <mark@codesourcery.com>
* call.c (build_method_call): Remove bogus code for two-argument
delete.
* init.c (build_new_1): Expand on comment, and remove dead code.
* init.c (expand_cleanup_for_base): New function, split out
from ...
(emit_base_init): Here.

View File

@ -474,29 +474,6 @@ build_method_call (instance, name, parms, basetype_path, flags)
return build_min_nt (METHOD_CALL_EXPR, name, instance, parms, NULL_TREE);
}
/* This is the logic that magically deletes the second argument to
operator delete, if it is not needed. */
if (name == ansi_opname[(int) DELETE_EXPR] && list_length (parms)==2)
{
tree save_last = TREE_CHAIN (parms);
/* get rid of unneeded argument */
TREE_CHAIN (parms) = NULL_TREE;
if (build_method_call (instance, name, parms, basetype_path,
(LOOKUP_SPECULATIVELY|flags) & ~LOOKUP_COMPLAIN))
{
/* If it finds a match, return it. */
return build_method_call (instance, name, parms, basetype_path, flags);
}
/* If it doesn't work, two argument delete must work */
TREE_CHAIN (parms) = save_last;
}
/* We already know whether it's needed or not for vec delete. */
else if (name == ansi_opname[(int) VEC_DELETE_EXPR]
&& TYPE_LANG_SPECIFIC (TREE_TYPE (instance))
&& ! TYPE_VEC_DELETE_TAKES_SIZE (TREE_TYPE (instance)))
TREE_CHAIN (parms) = NULL_TREE;
if (TREE_CODE (name) == BIT_NOT_EXPR)
{
if (parms)

View File

@ -2191,21 +2191,21 @@ build_new_1 (exp)
signature_error (NULL_TREE, true_type);
return error_mark_node;
}
/* When we allocate an array, and the corresponding deallocation
function takes a second argument of type size_t, and that's the
"usual deallocation function", we allocate some extra space at
the beginning of the array to store the size of the array.
#if 1
/* Get a little extra space to store a couple of things before the new'ed
array, if this isn't the default placement new. */
Well, that's what we should do. For backwards compatibility, we
have to do this whenever there's a two-argument array-delete
operator.
FIXME: For -fnew-abi, we don't have to maintain backwards
compatibility and we should fix this. */
use_cookie = (has_array && TYPE_VEC_NEW_USES_COOKIE (true_type)
&& ! (placement && ! TREE_CHAIN (placement)
&& TREE_TYPE (TREE_VALUE (placement)) == ptr_type_node));
#else
/* Get a little extra space to store a couple of things before the new'ed
array, if this is either non-placement new or new (nothrow). */
use_cookie = (has_array && TYPE_VEC_NEW_USES_COOKIE (true_type)
&& (! placement || nothrow));
#endif
if (use_cookie)
{

View File

@ -0,0 +1,27 @@
// Origin: Alexander Schiemann (aschiem@count.math.uni-sb.de)
int i;
struct B{};
struct A{
static void* operator new(unsigned int)
{return &i;}
inline static void operator delete(void*p);
static void operator delete(void*, const B&){}
};
inline void A::operator delete(void*p)
{A::operator delete(p,B());}
int main()
{A *ap=new A;
delete ap;}