This patch to the Go frontend avoids some more crashes on invalid
input.  Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu.
Committed to mainline.

Ian


2012-02-29  Ian Lance Taylor  <i...@google.com>

        * go-gcc.cc (class Gcc_tree): Add set_tree method.
        (set_placeholder_pointer_type): When setting to a pointer to
        error, set to error_mark_node.


Index: gcc/go/go-gcc.cc
===================================================================
--- gcc/go/go-gcc.cc	(revision 184521)
+++ gcc/go/go-gcc.cc	(working copy)
@@ -56,6 +56,10 @@ class Gcc_tree
   get_tree() const
   { return this->t_; }
 
+  void
+  set_tree(tree t)
+  { this->t_ = t; }
+
  private:
   tree t_;
 };
@@ -626,7 +630,7 @@ Gcc_backend::set_placeholder_pointer_typ
   tree tt = to_type->get_tree();
   if (tt == error_mark_node)
     {
-      TREE_TYPE(pt) = tt;
+      placeholder->set_tree(error_mark_node);
       return false;
     }
   gcc_assert(TREE_CODE(tt) == POINTER_TYPE);
Index: gcc/go/gofrontend/parse.cc
===================================================================
--- gcc/go/gofrontend/parse.cc	(revision 184521)
+++ gcc/go/gofrontend/parse.cc	(working copy)
@@ -3948,8 +3948,9 @@ Parse::return_stat()
 	   ++p)
 	{
 	  Named_object* no = this->gogo_->lookup((*p)->name(), NULL);
-	  go_assert(no != NULL);
-	  if (!no->is_result_variable())
+	  if (no == NULL)
+	    go_assert(saw_errors());
+	  else if (!no->is_result_variable())
 	    error_at(location, "%qs is shadowed during return",
 		     (*p)->message_name().c_str());
 	}
Index: gcc/go/gofrontend/expressions.cc
===================================================================
--- gcc/go/gofrontend/expressions.cc	(revision 184681)
+++ gcc/go/gofrontend/expressions.cc	(working copy)
@@ -13878,7 +13878,7 @@ tree
 Heap_composite_expression::do_get_tree(Translate_context* context)
 {
   tree expr_tree = this->expr_->get_tree(context);
-  if (expr_tree == error_mark_node)
+  if (expr_tree == error_mark_node || TREE_TYPE(expr_tree) == error_mark_node)
     return error_mark_node;
   tree expr_size = TYPE_SIZE_UNIT(TREE_TYPE(expr_tree));
   go_assert(TREE_CODE(expr_size) == INTEGER_CST);

Reply via email to