compiler: Use function receiver name in mangled named type descriptor.
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 6 Jan 2015 02:27:02 +0000 (02:27 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 6 Jan 2015 02:27:02 +0000 (02:27 +0000)
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.

From-SVN: r219214

gcc/go/gofrontend/types.cc

index fbcce7f3ed601726b48e9d12e881d1882641a31a..f9877fa3c1bf52662a4e3809e26e516213869ba2 100644 (file)
@@ -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)