From 7c76b292a2c186c2f3019591a44d6010b5de8a6f Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 1 Apr 1998 12:15:54 -0500 Subject: [PATCH] tweak From-SVN: r18934 --- gcc/cp/call.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/gcc/cp/call.c b/gcc/cp/call.c index dc5957d1b88..b475015990a 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -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;