OSDN Git Service

compiler: Avoid some compiler crashes on invalid code.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 1 Mar 2012 05:14:10 +0000 (05:14 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 1 Mar 2012 05:14:10 +0000 (05:14 +0000)
* 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.

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

gcc/go/ChangeLog
gcc/go/go-gcc.cc
gcc/go/gofrontend/expressions.cc
gcc/go/gofrontend/parse.cc

index 50ca127..8b8e90c 100644 (file)
@@ -1,3 +1,9 @@
+2012-02-29  Ian Lance Taylor  <iant@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.
+
 2012-02-23  Richard Guenther  <rguenther@suse.de>
 
        * go-gcc.cc (Gcc_backend::placeholder_pointer_type): Use
index b2b61eb..a19bb89 100644 (file)
@@ -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_type(Btype* placeholder,
   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 abcd593..39a162b 100644 (file)
@@ -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);
index df28d2b..1a9c153 100644 (file)
@@ -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());
        }