mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-13 13:41:12 +08:00
compiler: Don't make type fns for private fields in other packages.
From-SVN: r183579
This commit is contained in:
parent
e02ed81e1b
commit
13b6172204
@ -1205,13 +1205,13 @@ Specific_type_functions::type(Type* t)
|
||||
{
|
||||
case Type::TYPE_NAMED:
|
||||
{
|
||||
Named_type* nt = t->named_type();
|
||||
if (!t->compare_is_identity(this->gogo_) && t->is_comparable())
|
||||
t->type_functions(this->gogo_, t->named_type(), NULL, NULL, &hash_fn,
|
||||
&equal_fn);
|
||||
t->type_functions(this->gogo_, nt, NULL, NULL, &hash_fn, &equal_fn);
|
||||
|
||||
// If this is a struct type, we don't want to make functions
|
||||
// for the unnamed struct.
|
||||
Type* rt = t->named_type()->real_type();
|
||||
Type* rt = nt->real_type();
|
||||
if (rt->struct_type() == NULL)
|
||||
{
|
||||
if (Type::traverse(rt, this) == TRAVERSE_EXIT)
|
||||
@ -1219,8 +1219,20 @@ Specific_type_functions::type(Type* t)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (rt->struct_type()->traverse_field_types(this) == TRAVERSE_EXIT)
|
||||
return TRAVERSE_EXIT;
|
||||
// If this type is defined in another package, then we don't
|
||||
// need to worry about the unexported fields.
|
||||
bool is_defined_elsewhere = nt->named_object()->package() != NULL;
|
||||
const Struct_field_list* fields = rt->struct_type()->fields();
|
||||
for (Struct_field_list::const_iterator p = fields->begin();
|
||||
p != fields->end();
|
||||
++p)
|
||||
{
|
||||
if (is_defined_elsewhere
|
||||
&& Gogo::is_hidden_name(p->field_name()))
|
||||
continue;
|
||||
if (Type::traverse(p->type(), this) == TRAVERSE_EXIT)
|
||||
return TRAVERSE_EXIT;
|
||||
}
|
||||
}
|
||||
|
||||
return TRAVERSE_SKIP_COMPONENTS;
|
||||
|
Loading…
x
Reference in New Issue
Block a user