Commit c2f2350e by Jason Merrill Committed by Jason Merrill

PR c++/78193 - inherited ctor regressions on sparc32.

	* call.c (build_over_call): Don't set CALL_FROM_THUNK_P here.
	(build_call_a): Set it here, and don't insert EMPTY_CLASS_EXPR.
	(convert_like_real) [ck_rvalue]: Also pass non-addressable
	types along directly.

From-SVN: r242573
parent e389ba30
2016-11-17 Jason Merrill <jason@redhat.com>
PR c++/78193 - inherited ctor regressions on sparc32.
* call.c (build_over_call): Don't set CALL_FROM_THUNK_P here.
(build_call_a): Set it here, and don't insert EMPTY_CLASS_EXPR.
(convert_like_real) [ck_rvalue]: Also pass non-addressable
types along directly.
2016-11-17 Paolo Carlini <paolo.carlini@oracle.com> 2016-11-17 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/55080 PR c++/55080
......
...@@ -375,10 +375,18 @@ build_call_a (tree function, int n, tree *argarray) ...@@ -375,10 +375,18 @@ build_call_a (tree function, int n, tree *argarray)
TREE_HAS_CONSTRUCTOR (function) = (decl && DECL_CONSTRUCTOR_P (decl)); TREE_HAS_CONSTRUCTOR (function) = (decl && DECL_CONSTRUCTOR_P (decl));
if (current_function_decl && decl
&& flag_new_inheriting_ctors
&& DECL_INHERITED_CTOR (current_function_decl)
&& (DECL_INHERITED_CTOR (current_function_decl)
== DECL_CLONED_FUNCTION (decl)))
/* Pass arguments directly to the inherited constructor. */
CALL_FROM_THUNK_P (function) = true;
/* Don't pass empty class objects by value. 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. for tags in STL, which are used to control overload resolution.
We don't need to handle other cases of copying empty classes. */ We don't need to handle other cases of copying empty classes. */
if (! decl || ! DECL_BUILT_IN (decl)) else if (! decl || ! DECL_BUILT_IN (decl))
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
{ {
tree arg = CALL_EXPR_ARG (function, i); tree arg = CALL_EXPR_ARG (function, i);
...@@ -6844,8 +6852,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, ...@@ -6844,8 +6852,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
constructor. */ constructor. */
if (current_function_decl if (current_function_decl
&& flag_new_inheriting_ctors && flag_new_inheriting_ctors
&& DECL_INHERITED_CTOR (current_function_decl) && DECL_INHERITED_CTOR (current_function_decl))
&& TREE_ADDRESSABLE (totype))
return expr; return expr;
/* Fall through. */ /* Fall through. */
...@@ -8094,13 +8101,6 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) ...@@ -8094,13 +8101,6 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
/* build_new_op_1 will clear this when appropriate. */ /* build_new_op_1 will clear this when appropriate. */
CALL_EXPR_ORDERED_ARGS (c) = true; CALL_EXPR_ORDERED_ARGS (c) = true;
} }
if (current_function_decl
&& flag_new_inheriting_ctors
&& DECL_INHERITED_CTOR (current_function_decl)
&& cand->num_convs)
/* Don't introduce copies when passing arguments along to the inherited
constructor. */
CALL_FROM_THUNK_P (call) = true;
return call; return call;
} }
......
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