Commit be7341a8 by Ian Lance Taylor

re PR go/60870 (go interface methods broken on ppc64le (bug296.go))

	PR go/60870

compiler: Don't convert function type for an interface method.

For an interface method the function type is the type without
the receiver, which is wrong since we are passing a receiver.
The interface method will always have the correct type in this
case, so no type conversion is necessary.

Also don't do the type conversion when calling a named
function, since in that case the type is also always correct.

The type can be wrong, and the conversion required, when the
function type refers to itself recursively.

From-SVN: r209494
parent 39be2171
...@@ -9619,9 +9619,20 @@ Call_expression::do_get_tree(Translate_context* context) ...@@ -9619,9 +9619,20 @@ Call_expression::do_get_tree(Translate_context* context)
fn = Expression::make_compound(set_closure, fn, location); fn = Expression::make_compound(set_closure, fn, location);
} }
Btype* bft = fntype->get_backend_fntype(gogo);
Bexpression* bfn = tree_to_expr(fn->get_tree(context)); Bexpression* bfn = tree_to_expr(fn->get_tree(context));
// When not calling a named function directly, use a type conversion
// in case the type of the function is a recursive type which refers
// to itself. We don't do this for an interface method because 1)
// an interface method never refers to itself, so we always have a
// function type here; 2) we pass an extra first argument to an
// interface method, so fntype is not correct.
if (func == NULL && !is_interface_method)
{
Btype* bft = fntype->get_backend_fntype(gogo);
bfn = gogo->backend()->convert_expression(bft, bfn, location); bfn = gogo->backend()->convert_expression(bft, bfn, location);
}
Bexpression* call = gogo->backend()->call_expression(bfn, fn_args, location); Bexpression* call = gogo->backend()->call_expression(bfn, fn_args, location);
if (this->results_ != NULL) if (this->results_ != NULL)
......
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