From-SVN: r18934
This commit is contained in:
Jason Merrill 1998-04-01 12:15:54 -05:00
parent 570221c201
commit 7c76b292a2
1 changed files with 19 additions and 13 deletions

View File

@ -494,6 +494,7 @@ build_call (function, result_type, parms)
{
int is_constructor = 0;
tree tmp;
tree decl;
function = build_addr_func (function);
@ -504,23 +505,28 @@ build_call (function, result_type, parms)
}
if (TREE_CODE (function) == ADDR_EXPR
&& TREE_CODE (TREE_OPERAND (function, 0)) == FUNCTION_DECL
&& DECL_CONSTRUCTOR_P (TREE_OPERAND (function, 0)))
&& TREE_CODE (TREE_OPERAND (function, 0)) == FUNCTION_DECL)
decl = TREE_OPERAND (function, 0);
else
decl = NULL_TREE;
if (decl && DECL_CONSTRUCTOR_P (decl))
is_constructor = 1;
/* Don't actually pass empty class objects to a function. This is useful
/* Don't pass empty class objects by value. This is useful
for tags in STL, which are used to control overload resolution.
We don't need to handle other cases of copying empty classes. */
for (tmp = parms; tmp; tmp = TREE_CHAIN (tmp))
if (is_empty_class (TREE_TYPE (TREE_VALUE (tmp)))
&& ! TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (tmp))))
{
tree t = make_node (RTL_EXPR);
TREE_TYPE (t) = TREE_TYPE (TREE_VALUE (tmp));
RTL_EXPR_RTL (t) = const0_rtx;
RTL_EXPR_SEQUENCE (t) = NULL_RTX;
TREE_VALUE (tmp) = t;
}
if (! decl || ! DECL_BUILT_IN (decl))
for (tmp = parms; tmp; tmp = TREE_CHAIN (tmp))
if (is_empty_class (TREE_TYPE (TREE_VALUE (tmp)))
&& ! TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (tmp))))
{
tree t = make_node (RTL_EXPR);
TREE_TYPE (t) = TREE_TYPE (TREE_VALUE (tmp));
RTL_EXPR_RTL (t) = const0_rtx;
RTL_EXPR_SEQUENCE (t) = NULL_RTX;
TREE_VALUE (tmp) = t;
}
function = build_nt (CALL_EXPR, function, parms, NULL_TREE);
TREE_HAS_CONSTRUCTOR (function) = is_constructor;