From 86990cac7cb5acd5d6edd28a56a59e18ae9c39a5 Mon Sep 17 00:00:00 2001 From: ian Date: Thu, 27 Jun 2013 20:51:55 +0000 Subject: compiler: structs inherit all methods from embedded pointer fields. Previously if a struct S contained an embedded field *T, a method with receiver *T would not be promoted to a method with value receiver S. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@200493 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/go/gofrontend/types.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc index 3fe20904493..0a86d472062 100644 --- a/gcc/go/gofrontend/types.cc +++ b/gcc/go/gofrontend/types.cc @@ -9396,13 +9396,18 @@ Type::find_field_or_method(const Type* type, fnt = pf->type()->deref()->named_type(); go_assert(fnt != NULL); + // Methods with pointer receivers on embedded field are + // inherited by the pointer to struct, and also by the struct + // type if the field itself is a pointer. + bool can_be_pointer = (receiver_can_be_pointer + || pf->type()->points_to() != NULL); int sublevel = level == NULL ? 1 : *level + 1; bool sub_is_method; std::string subambig1; std::string subambig2; bool subfound = Type::find_field_or_method(fnt, name, - receiver_can_be_pointer, + can_be_pointer, seen, &sublevel, &sub_is_method, -- cgit v1.2.1