From be7341a882e4ee6d493b2b2940f9cbb37b15d515 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 17 Apr 2014 19:27:22 +0000 Subject: 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 --- gcc/go/gofrontend/expressions.cc | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'gcc/go') diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index 1994610..2571894 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -9619,9 +9619,20 @@ Call_expression::do_get_tree(Translate_context* context) fn = Expression::make_compound(set_closure, fn, location); } - Btype* bft = fntype->get_backend_fntype(gogo); Bexpression* bfn = tree_to_expr(fn->get_tree(context)); - bfn = gogo->backend()->convert_expression(bft, bfn, location); + + // 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); + } + Bexpression* call = gogo->backend()->call_expression(bfn, fn_args, location); if (this->results_ != NULL) -- cgit v1.1