compiler: Fix some crashes on invalid code.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 28 Apr 2012 04:56:55 +0000 (04:56 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 28 Apr 2012 04:56:55 +0000 (04:56 +0000)
Fixes issue 7.

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

gcc/go/gofrontend/expressions.cc
gcc/go/gofrontend/types.cc

index 6bd00a8..a266694 100644 (file)
@@ -9225,7 +9225,7 @@ Call_expression::set_results(Translate_context* context, tree call_tree)
       ref->set_is_lvalue();
       tree temp_tree = ref->get_tree(context);
       if (temp_tree == error_mark_node)
-       continue;
+       return error_mark_node;
 
       tree val_tree = build3_loc(loc.gcc_location(), COMPONENT_REF,
                                  TREE_TYPE(field), call_tree, field, NULL_TREE);
index 9e64a6a..74bab41 100644 (file)
@@ -5450,6 +5450,11 @@ Array_type::get_length_tree(Gogo* gogo)
       mpz_t val;
       if (this->length_->numeric_constant_value(&nc) && nc.to_int(&val))
        {
+         if (mpz_sgn(val) < 0)
+           {
+             this->length_tree_ = error_mark_node;
+             return this->length_tree_;
+           }
          Type* t = nc.type();
          if (t == NULL)
            t = Type::lookup_integer_type("int");
@@ -6551,7 +6556,11 @@ bool
 Interface_type::is_identical(const Interface_type* t,
                             bool errors_are_identical) const
 {
-  go_assert(this->methods_are_finalized_ && t->methods_are_finalized_);
+  // If methods have not been finalized, then we are asking whether
+  // func redeclarations are the same.  This is an error, so for
+  // simplicity we say they are never the same.
+  if (!this->methods_are_finalized_ || !t->methods_are_finalized_)
+    return false;
 
   // We require the same methods with the same types.  The methods
   // have already been sorted.