diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2016-12-22 23:05:02 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2016-12-22 23:05:02 +0000 |
commit | 28171b9d5dff2ee4fa0675ff36f5c55131ae158f (patch) | |
tree | d89a2a32fc4fe6b2ca04d0ad5487f72a348c05bb /gcc/go | |
parent | cb66382056ed3d00383bed84db0df5b074f8265a (diff) | |
download | gcc-28171b9d5dff2ee4fa0675ff36f5c55131ae158f.zip gcc-28171b9d5dff2ee4fa0675ff36f5c55131ae158f.tar.gz gcc-28171b9d5dff2ee4fa0675ff36f5c55131ae158f.tar.bz2 |
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
Diffstat (limited to 'gcc/go')
-rw-r--r-- | gcc/go/gofrontend/MERGE | 2 | ||||
-rw-r--r-- | gcc/go/gofrontend/gogo.h | 21 | ||||
-rw-r--r-- | gcc/go/gofrontend/types.cc | 31 |
3 files changed, 28 insertions, 26 deletions
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index b846896..b9c6280 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -4a0bb435bbb1d1516b486d1998e8dc184576db61 +9a89f32811e6b3a29e22dda46e9c23811f562876 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/gcc/go/gofrontend/gogo.h b/gcc/go/gofrontend/gogo.h index 23d1f08..905f48d 100644 --- a/gcc/go/gofrontend/gogo.h +++ b/gcc/go/gofrontend/gogo.h @@ -202,6 +202,27 @@ class Gogo } // 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. static std::string message_name(const std::string& name); diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc index e03201e..93d7d80 100644 --- a/gcc/go/gofrontend/types.cc +++ b/gcc/go/gofrontend/types.cc @@ -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 - // pointless. - 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)); - } + std::string mname(Gogo::mangle_possibly_hidden_name(no->name())); + ret.append(mname); return ret; } @@ -5638,8 +5628,9 @@ Struct_type::do_mangled_name(Gogo* gogo, std::string* ret) const if (p->is_anonymous()) ret->append("0_"); 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]; snprintf(buf, sizeof buf, "%u_", static_cast<unsigned int>(n.length())); @@ -8712,17 +8703,7 @@ Interface_type::do_mangled_name(Gogo* gogo, std::string* ret) const { if (!p->name().empty()) { - std::string n; - 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())); - } + std::string n(Gogo::mangle_possibly_hidden_name(p->name())); char buf[20]; snprintf(buf, sizeof buf, "%u_", static_cast<unsigned int>(n.length())); |