Commit 4e61a969 by Mark Mitchell Committed by Mark Mitchell

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
parent 75c613db
1999-06-16 Mark Mitchell <mark@codesourcery.com> 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 * init.c (expand_cleanup_for_base): New function, split out
from ... from ...
(emit_base_init): Here. (emit_base_init): Here.
......
...@@ -474,29 +474,6 @@ build_method_call (instance, name, parms, basetype_path, flags) ...@@ -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); 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 (TREE_CODE (name) == BIT_NOT_EXPR)
{ {
if (parms) if (parms)
......
...@@ -2192,20 +2192,20 @@ build_new_1 (exp) ...@@ -2192,20 +2192,20 @@ build_new_1 (exp)
return error_mark_node; return error_mark_node;
} }
#if 1 /* When we allocate an array, and the corresponding deallocation
/* Get a little extra space to store a couple of things before the new'ed function takes a second argument of type size_t, and that's the
array, if this isn't the default placement new. */ "usual deallocation function", we allocate some extra space at
the beginning of the array to store the size of the array.
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) use_cookie = (has_array && TYPE_VEC_NEW_USES_COOKIE (true_type)
&& ! (placement && ! TREE_CHAIN (placement) && ! (placement && ! TREE_CHAIN (placement)
&& TREE_TYPE (TREE_VALUE (placement)) == ptr_type_node)); && 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) if (use_cookie)
{ {
......
// 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;}
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