Commit 28171b9d by Ian Lance Taylor

compiler: fix spurious redefinition error for anon struct

    
    Change Struct_type::do_mangled_name to incorporate the field
    names even for hidden symbols. This is needed in cases where
    a package imports a type "S" that has an anonymous struct, e.g.
    
      // imported from some other package
      type S struct {
        X struct{ _ struct{} }
      }
    
    and then defines a local type that uses a structurally identical
    anonymous struct, e.g.
    
      // defined locally
      type T struct {
        U struct{ _ struct{} }
      }
    
    In the case above both types triggered the creation of hash/equal
    methods, but the method names were clashing (since both structs
    had the same mangled name).
    
    Fixes golang/go#18414
    
    Reviewed-on: https://go-review.googlesource.com/34621

From-SVN: r243899
parent cb663820
4a0bb435bbb1d1516b486d1998e8dc184576db61 9a89f32811e6b3a29e22dda46e9c23811f562876
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -202,6 +202,27 @@ class Gogo ...@@ -202,6 +202,27 @@ class Gogo
} }
// Given a name which may or may not have been hidden, return the // Given a name which may or may not have been hidden, return the
// name to use within a mangled symbol name.
static std::string
mangle_possibly_hidden_name(const std::string& name)
{
// FIXME: This adds in pkgpath twice for hidden symbols, which is
// less than ideal.
std::string n;
if (!Gogo::is_hidden_name(name))
n = name;
else
{
n = ".";
std::string pkgpath = Gogo::hidden_name_pkgpath(name);
n.append(Gogo::pkgpath_for_symbol(pkgpath));
n.append(1, '.');
n.append(Gogo::unpack_hidden_name(name));
}
return n;
}
// Given a name which may or may not have been hidden, return the
// name to use in an error message. // name to use in an error message.
static std::string static std::string
message_name(const std::string& name); message_name(const std::string& name);
......
...@@ -1337,18 +1337,8 @@ Type::type_descriptor_var_name(Gogo* gogo, Named_type* nt) ...@@ -1337,18 +1337,8 @@ Type::type_descriptor_var_name(Gogo* gogo, Named_type* nt)
} }
} }
// FIXME: This adds in pkgpath twice for hidden symbols, which is std::string mname(Gogo::mangle_possibly_hidden_name(no->name()));
// pointless. ret.append(mname);
const std::string& name(no->name());
if (!Gogo::is_hidden_name(name))
ret.append(name);
else
{
ret.append(1, '.');
ret.append(Gogo::pkgpath_for_symbol(Gogo::hidden_name_pkgpath(name)));
ret.append(1, '.');
ret.append(Gogo::unpack_hidden_name(name));
}
return ret; return ret;
} }
...@@ -5639,7 +5629,8 @@ Struct_type::do_mangled_name(Gogo* gogo, std::string* ret) const ...@@ -5639,7 +5629,8 @@ Struct_type::do_mangled_name(Gogo* gogo, std::string* ret) const
ret->append("0_"); ret->append("0_");
else else
{ {
std::string n = Gogo::unpack_hidden_name(p->field_name());
std::string n(Gogo::mangle_possibly_hidden_name(p->field_name()));
char buf[20]; char buf[20];
snprintf(buf, sizeof buf, "%u_", snprintf(buf, sizeof buf, "%u_",
static_cast<unsigned int>(n.length())); static_cast<unsigned int>(n.length()));
...@@ -8712,17 +8703,7 @@ Interface_type::do_mangled_name(Gogo* gogo, std::string* ret) const ...@@ -8712,17 +8703,7 @@ Interface_type::do_mangled_name(Gogo* gogo, std::string* ret) const
{ {
if (!p->name().empty()) if (!p->name().empty())
{ {
std::string n; std::string n(Gogo::mangle_possibly_hidden_name(p->name()));
if (!Gogo::is_hidden_name(p->name()))
n = p->name();
else
{
n = ".";
std::string pkgpath = Gogo::hidden_name_pkgpath(p->name());
n.append(Gogo::pkgpath_for_symbol(pkgpath));
n.append(1, '.');
n.append(Gogo::unpack_hidden_name(p->name()));
}
char buf[20]; char buf[20];
snprintf(buf, sizeof buf, "%u_", snprintf(buf, sizeof buf, "%u_",
static_cast<unsigned int>(n.length())); static_cast<unsigned int>(n.length()));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment