compiler: use package path with embedded builtin type

The test case is https://go.dev/cl/414235.

Fixes golang/go#52856

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/414294
This commit is contained in:
Ian Lance Taylor 2022-06-25 22:09:16 -07:00
parent 53c4ef1e3c
commit 74956337e8
2 changed files with 22 additions and 9 deletions

View file

@ -1,4 +1,4 @@
d5b4abed2f206e492890acc20738e89617ea542c
c7238f58a26131b7611eff6f555cab02af8a623c
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.

View file

@ -831,15 +831,28 @@ Struct_type::do_mangled_name(Gogo* gogo, std::string* ret,
ret->push_back(' ');
}
// For an anonymous field with an alias type, the field name
// is the alias name.
if (p->is_anonymous()
&& p->type()->named_type() != NULL
&& p->type()->named_type()->is_alias())
p->type()->named_type()->append_symbol_type_name(gogo, true, ret,
is_non_identifier);
const Type* ft = p->type();
const Named_type* nt = ft->named_type();
if (p->is_anonymous() && nt != NULL && nt->is_builtin())
{
// For an embedded field with a builtin type, we must
// include a package path. Otherwise embedding builtin
// types in different packages will produce identical
// types, which shouldn't happen because the builtin
// types are not exported.
ret->append(gogo->pkgpath());
ret->push_back('.');
nt->append_symbol_type_name(gogo, true, ret, is_non_identifier);
}
else if (p->is_anonymous() && nt != NULL && nt->is_alias())
{
// For an anonymous field with an alias type, the field name
// is the alias name.
nt->append_symbol_type_name(gogo, true, ret, is_non_identifier);
}
else
this->append_mangled_name(p->type(), gogo, ret, is_non_identifier);
this->append_mangled_name(ft, gogo, ret, is_non_identifier);
if (p->has_tag())
{