From 08be22dc96b89851dea8a69afe51f8bc245facc1 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 21 Jan 2012 22:50:36 +0000 Subject: [PATCH] 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 --- gcc/go/ChangeLog | 7 +++++++ gcc/go/go-gcc.cc | 17 ++++++++++++++--- gcc/go/gofrontend/types.cc | 2 +- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/gcc/go/ChangeLog b/gcc/go/ChangeLog index 0f7eb27e704..5be89753626 100644 --- a/gcc/go/ChangeLog +++ b/gcc/go/ChangeLog @@ -1,3 +1,10 @@ +2012-01-21 Ian Lance Taylor + + * 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 * go-gcc.cc (Gcc_backend::placeholder_struct_type): Permit name to diff --git a/gcc/go/go-gcc.cc b/gcc/go/go-gcc.cc index ca0d626bcc4..e6967a830e1 100644 --- a/gcc/go/go-gcc.cc +++ b/gcc/go/go-gcc.cc @@ -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) diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc index bb06edb7f7f..525d33ad8e5 100644 --- a/gcc/go/gofrontend/types.cc +++ b/gcc/go/gofrontend/types.cc @@ -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();