aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2014-04-17 19:27:22 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2014-04-17 19:27:22 +0000
commitbe7341a882e4ee6d493b2b2940f9cbb37b15d515 (patch)
tree110581ad40858479d1ae14c54edc2b918166c587 /gcc
parent39be2171e0fa8da0d5bbfd3aecd11f5709f8f309 (diff)
downloadgcc-be7341a882e4ee6d493b2b2940f9cbb37b15d515.zip
gcc-be7341a882e4ee6d493b2b2940f9cbb37b15d515.tar.gz
gcc-be7341a882e4ee6d493b2b2940f9cbb37b15d515.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/go/gofrontend/expressions.cc15
1 files changed, 13 insertions, 2 deletions
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)