OSDN Git Service

Don't crash ranging over call to builtin function.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 11 May 2011 19:39:21 +0000 (19:39 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 11 May 2011 19:39:21 +0000 (19:39 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@173671 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/go/gofrontend/expressions.cc
gcc/go/gofrontend/statements.cc

index 9338486..005173b 100644 (file)
@@ -8527,9 +8527,9 @@ Call_expression::lower_varargs(Gogo* gogo, Named_object* function,
     new_args->push_back(Expression::make_nil(loc));
 
   // We can't return a new call expression here, because this one may
     new_args->push_back(Expression::make_nil(loc));
 
   // We can't return a new call expression here, because this one may
-  // be referenced by Call_result expressions.  FIXME.
-  if (old_args != NULL)
-    delete old_args;
+  // be referenced by Call_result expressions.  FIXME.  We can't
+  // delete OLD_ARGS because we may have both a Call_expression and a
+  // Builtin_call_expression which refer to them.  FIXME.
   this->args_ = new_args;
   this->varargs_are_lowered_ = true;
 
   this->args_ = new_args;
   this->varargs_are_lowered_ = true;
 
@@ -9250,8 +9250,8 @@ Index_expression::do_lower(Gogo*, Named_object*, int)
          error_at(location, "invalid slice of map");
          return Expression::make_error(location);
        }
          error_at(location, "invalid slice of map");
          return Expression::make_error(location);
        }
-      Map_index_expression* ret= Expression::make_map_index(left, start,
-                                                           location);
+      Map_index_expression* ret = Expression::make_map_index(left, start,
+                                                            location);
       if (this->is_lvalue_)
        ret->set_is_lvalue();
       return ret;
       if (this->is_lvalue_)
        ret->set_is_lvalue();
       return ret;
index 4fdf8f1..4d335bb 100644 (file)
@@ -4536,7 +4536,7 @@ For_range_statement::do_lower(Gogo* gogo, Named_object*, Block* enclosing)
   else
     {
       this->report_error(_("range clause must have "
   else
     {
       this->report_error(_("range clause must have "
-                          "array, slice, setring, map, or channel type"));
+                          "array, slice, string, map, or channel type"));
       return Statement::make_error_statement(this->location());
     }
 
       return Statement::make_error_statement(this->location());
     }
 
@@ -4552,6 +4552,7 @@ For_range_statement::do_lower(Gogo* gogo, Named_object*, Block* enclosing)
     {
       range_temp = Statement::make_temporary(NULL, this->range_, loc);
       temp_block->add_statement(range_temp);
     {
       range_temp = Statement::make_temporary(NULL, this->range_, loc);
       temp_block->add_statement(range_temp);
+      this->range_ = NULL;
     }
 
   Temporary_statement* index_temp = Statement::make_temporary(index_type,
     }
 
   Temporary_statement* index_temp = Statement::make_temporary(index_type,