From c723f77b974285d45eb0ce2f0dc5d45e6aa24f0e Mon Sep 17 00:00:00 2001 From: ian Date: Tue, 6 Jan 2015 02:27:02 +0000 Subject: [PATCH] compiler: Use function receiver name in mangled named type descriptor. If named types with similar names are defined inside of methods with similar names, it was possible that the mangled type names would be the same, leading to multiple definitions of type descriptor and garbage collection info variables. This can only occur with similarly named methods across different receivers, so we use the receiver name to distinguish. Fixes issue 33. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@219214 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/go/gofrontend/types.cc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc index fbcce7f3ed60..f9877fa3c1bf 100644 --- a/gcc/go/gofrontend/types.cc +++ b/gcc/go/gofrontend/types.cc @@ -1296,6 +1296,14 @@ Type::type_descriptor_var_name(Gogo* gogo, Named_type* nt) ret.append(1, '.'); if (in_function != NULL) { + const Typed_identifier* rcvr = + in_function->func_value()->type()->receiver(); + if (rcvr != NULL) + { + Named_type* rcvr_type = rcvr->type()->deref()->named_type(); + ret.append(Gogo::unpack_hidden_name(rcvr_type->name())); + ret.append(1, '.'); + } ret.append(Gogo::unpack_hidden_name(in_function->name())); ret.append(1, '.'); if (index > 0) @@ -9170,6 +9178,14 @@ Named_type::do_mangled_name(Gogo* gogo, std::string* ret) const name.append(1, '.'); if (this->in_function_ != NULL) { + const Typed_identifier* rcvr = + this->in_function_->func_value()->type()->receiver(); + if (rcvr != NULL) + { + Named_type* rcvr_type = rcvr->type()->deref()->named_type(); + name.append(Gogo::unpack_hidden_name(rcvr_type->name())); + name.append(1, '.'); + } name.append(Gogo::unpack_hidden_name(this->in_function_->name())); name.append(1, '$'); if (this->in_function_index_ > 0) -- 2.47.3