Fix struct with field of pointer to array of same struct.

From-SVN: r168981
This commit is contained in:
Ian Lance Taylor 2011-01-19 05:24:55 +00:00
parent 8522091993
commit 8386b63d3d

View File

@ -3745,15 +3745,29 @@ Struct_type::fill_in_tree(Gogo* gogo, tree type)
{
tree field_trees = NULL_TREE;
tree* pp = &field_trees;
bool has_pointer = false;
for (Struct_field_list::const_iterator p = this->fields_->begin();
p != this->fields_->end();
++p)
{
std::string name = Gogo::unpack_hidden_name(p->field_name());
tree name_tree = get_identifier_with_length(name.data(), name.length());
tree field_type_tree = p->type()->get_tree(gogo);
if (field_type_tree == error_mark_node)
return error_mark_node;
// Don't follow pointers yet, so that we don't get confused by a
// pointer to an array of this struct type.
tree field_type_tree;
if (p->type()->points_to() != NULL)
{
field_type_tree = ptr_type_node;
has_pointer = true;
}
else
{
field_type_tree = p->type()->get_tree(gogo);
if (field_type_tree == error_mark_node)
return error_mark_node;
}
tree field = build_decl(p->location(), FIELD_DECL, name_tree,
field_type_tree);
DECL_CONTEXT(field) = type;
@ -3765,6 +3779,18 @@ Struct_type::fill_in_tree(Gogo* gogo, tree type)
layout_type(type);
if (has_pointer)
{
tree field = field_trees;
for (Struct_field_list::const_iterator p = this->fields_->begin();
p != this->fields_->end();
++p, field = DECL_CHAIN(field))
{
if (p->type()->points_to() != NULL)
TREE_TYPE(field) = p->type()->get_tree(gogo);
}
}
return type;
}