From 2d8f63a164c48a7e287987040927e40df7a97cab Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 11 May 2011 19:39:21 +0000 Subject: Don't crash ranging over call to builtin function. From-SVN: r173671 --- gcc/go/gofrontend/expressions.cc | 10 +++++----- gcc/go/gofrontend/statements.cc | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index 9338486..005173b 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -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 - // 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; @@ -9250,8 +9250,8 @@ Index_expression::do_lower(Gogo*, Named_object*, int) 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; diff --git a/gcc/go/gofrontend/statements.cc b/gcc/go/gofrontend/statements.cc index 4fdf8f1..4d335bb 100644 --- a/gcc/go/gofrontend/statements.cc +++ b/gcc/go/gofrontend/statements.cc @@ -4536,7 +4536,7 @@ For_range_statement::do_lower(Gogo* gogo, Named_object*, Block* enclosing) 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()); } @@ -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); + this->range_ = NULL; } Temporary_statement* index_temp = Statement::make_temporary(index_type, -- cgit v1.1