OSDN Git Service

compiler: The type descriptor of an undefined forward type is an error.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 21 Jan 2012 22:50:36 +0000 (22:50 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 21 Jan 2012 22:50:36 +0000 (22:50 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@183381 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/go/ChangeLog
gcc/go/go-gcc.cc
gcc/go/gofrontend/types.cc

index 0f7eb27..5be8975 100644 (file)
@@ -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
index ca0d626..e6967a8 100644 (file)
@@ -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)
index bb06edb..525d33a 100644 (file)
@@ -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();