Commit 08be22dc by Ian Lance Taylor Committed by Ian Lance Taylor

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
parent 8f94383a
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> 2012-01-20 Ian Lance Taylor <iant@google.com>
* go-gcc.cc (Gcc_backend::placeholder_struct_type): Permit name to * go-gcc.cc (Gcc_backend::placeholder_struct_type): Permit name to
......
...@@ -778,7 +778,10 @@ Gcc_backend::is_circular_pointer_type(Btype* btype) ...@@ -778,7 +778,10 @@ Gcc_backend::is_circular_pointer_type(Btype* btype)
size_t size_t
Gcc_backend::type_size(Btype* btype) 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_CODE(t) == INTEGER_CST);
gcc_assert(TREE_INT_CST_HIGH(t) == 0); gcc_assert(TREE_INT_CST_HIGH(t) == 0);
unsigned HOST_WIDE_INT val_wide = TREE_INT_CST_LOW(t); unsigned HOST_WIDE_INT val_wide = TREE_INT_CST_LOW(t);
...@@ -792,7 +795,10 @@ Gcc_backend::type_size(Btype* btype) ...@@ -792,7 +795,10 @@ Gcc_backend::type_size(Btype* btype)
size_t size_t
Gcc_backend::type_alignment(Btype* btype) 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. // Return the alignment of a struct field of type BTYPE.
...@@ -800,7 +806,10 @@ Gcc_backend::type_alignment(Btype* btype) ...@@ -800,7 +806,10 @@ Gcc_backend::type_alignment(Btype* btype)
size_t size_t
Gcc_backend::type_field_alignment(Btype* btype) 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. // Return the offset of a field in a struct.
...@@ -809,6 +818,8 @@ size_t ...@@ -809,6 +818,8 @@ size_t
Gcc_backend::type_field_offset(Btype* btype, size_t index) Gcc_backend::type_field_offset(Btype* btype, size_t index)
{ {
tree struct_tree = btype->get_tree(); tree struct_tree = btype->get_tree();
if (struct_tree == error_mark_node)
return 0;
gcc_assert(TREE_CODE(struct_tree) == RECORD_TYPE); gcc_assert(TREE_CODE(struct_tree) == RECORD_TYPE);
tree field = TYPE_FIELDS(struct_tree); tree field = TYPE_FIELDS(struct_tree);
for (; index > 0; --index) for (; index > 0; --index)
......
...@@ -9163,7 +9163,7 @@ Forward_declaration_type::do_type_descriptor(Gogo* gogo, Named_type* name) ...@@ -9163,7 +9163,7 @@ Forward_declaration_type::do_type_descriptor(Gogo* gogo, Named_type* name)
{ {
Location ploc = Linemap::predeclared_location(); Location ploc = Linemap::predeclared_location();
if (!this->is_defined()) if (!this->is_defined())
return Expression::make_nil(ploc); return Expression::make_error(ploc);
else else
{ {
Type* t = this->real_type(); Type* t = this->real_type();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment