compiler: The type descriptor of an undefined forward type is an error.
* go-gcc.cc (Gcc_backend::type_size): Check for error_mark_node. (Gcc_backend::type_alignment): Likewise. (Gcc_backend::type_field_alignment): Likewise. (Gcc_backend::type_field_offset): Likewise. From-SVN: r183381
This commit is contained in:
parent
8f94383a99
commit
08be22dc96
@ -1,3 +1,10 @@
|
||||
2012-01-21 Ian Lance Taylor <iant@google.com>
|
||||
|
||||
* go-gcc.cc (Gcc_backend::type_size): Check for error_mark_node.
|
||||
(Gcc_backend::type_alignment): Likewise.
|
||||
(Gcc_backend::type_field_alignment): Likewise.
|
||||
(Gcc_backend::type_field_offset): Likewise.
|
||||
|
||||
2012-01-20 Ian Lance Taylor <iant@google.com>
|
||||
|
||||
* go-gcc.cc (Gcc_backend::placeholder_struct_type): Permit name to
|
||||
|
@ -778,7 +778,10 @@ Gcc_backend::is_circular_pointer_type(Btype* btype)
|
||||
size_t
|
||||
Gcc_backend::type_size(Btype* btype)
|
||||
{
|
||||
tree t = TYPE_SIZE_UNIT(btype->get_tree());
|
||||
tree t = btype->get_tree();
|
||||
if (t == error_mark_node)
|
||||
return 1;
|
||||
t = TYPE_SIZE_UNIT(t);
|
||||
gcc_assert(TREE_CODE(t) == INTEGER_CST);
|
||||
gcc_assert(TREE_INT_CST_HIGH(t) == 0);
|
||||
unsigned HOST_WIDE_INT val_wide = TREE_INT_CST_LOW(t);
|
||||
@ -792,7 +795,10 @@ Gcc_backend::type_size(Btype* btype)
|
||||
size_t
|
||||
Gcc_backend::type_alignment(Btype* btype)
|
||||
{
|
||||
return TYPE_ALIGN_UNIT(btype->get_tree());
|
||||
tree t = btype->get_tree();
|
||||
if (t == error_mark_node)
|
||||
return 1;
|
||||
return TYPE_ALIGN_UNIT(t);
|
||||
}
|
||||
|
||||
// Return the alignment of a struct field of type BTYPE.
|
||||
@ -800,7 +806,10 @@ Gcc_backend::type_alignment(Btype* btype)
|
||||
size_t
|
||||
Gcc_backend::type_field_alignment(Btype* btype)
|
||||
{
|
||||
return go_field_alignment(btype->get_tree());
|
||||
tree t = btype->get_tree();
|
||||
if (t == error_mark_node)
|
||||
return 1;
|
||||
return go_field_alignment(t);
|
||||
}
|
||||
|
||||
// Return the offset of a field in a struct.
|
||||
@ -809,6 +818,8 @@ size_t
|
||||
Gcc_backend::type_field_offset(Btype* btype, size_t index)
|
||||
{
|
||||
tree struct_tree = btype->get_tree();
|
||||
if (struct_tree == error_mark_node)
|
||||
return 0;
|
||||
gcc_assert(TREE_CODE(struct_tree) == RECORD_TYPE);
|
||||
tree field = TYPE_FIELDS(struct_tree);
|
||||
for (; index > 0; --index)
|
||||
|
@ -9163,7 +9163,7 @@ Forward_declaration_type::do_type_descriptor(Gogo* gogo, Named_type* name)
|
||||
{
|
||||
Location ploc = Linemap::predeclared_location();
|
||||
if (!this->is_defined())
|
||||
return Expression::make_nil(ploc);
|
||||
return Expression::make_error(ploc);
|
||||
else
|
||||
{
|
||||
Type* t = this->real_type();
|
||||
|
Loading…
Reference in New Issue
Block a user