This patch to the Go frontend avoids some compiler crashes on erroneous code. Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline.
Ian 2012-01-21 Ian Lance Taylor <i...@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.
Index: gcc/go/go-gcc.cc =================================================================== --- gcc/go/go-gcc.cc (revision 183340) +++ gcc/go/go-gcc.cc (working copy) @@ -778,7 +778,10 @@ Gcc_backend::is_circular_pointer_type(Bt 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) Index: gcc/go/gofrontend/types.cc =================================================================== --- gcc/go/gofrontend/types.cc (revision 183379) +++ gcc/go/gofrontend/types.cc (working copy) @@ -9163,7 +9163,7 @@ Forward_declaration_type::do_type_descri { 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();