From fd4de8b2be2b2994124c0e8a555c3fb075e5d63e Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 8 Jul 2014 21:28:17 +0000 Subject: [PATCH] re PR go/61308 (gccgo: ICE in Expression::check_bounds [GoSmith]) PR go/61308 compiler: Convert array start index before bounds checking. From-SVN: r212372 --- gcc/go/gofrontend/expressions.cc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index c481bc59c8f..53c0068e3a5 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -10218,7 +10218,8 @@ Array_index_expression::do_get_backend(Translate_context* context) Location loc = this->location(); Gogo* gogo = context->gogo(); - Btype* int_btype = Type::lookup_integer_type("int")->get_backend(gogo); + Type* int_type = Type::lookup_integer_type("int"); + Btype* int_btype = int_type->get_backend(gogo); // We need to convert the length and capacity to the Go "int" type here // because the length of a fixed-length array could be of type "uintptr" @@ -10259,8 +10260,15 @@ Array_index_expression::do_get_backend(Translate_context* context) : RUNTIME_ERROR_SLICE_SLICE_OUT_OF_BOUNDS)); Bexpression* crash = gogo->runtime_error(code, loc)->get_backend(context); + if (this->start_->type()->integer_type() == NULL + && !Type::are_convertible(int_type, this->start_->type(), NULL)) + { + go_assert(saw_errors()); + return context->backend()->error_expression(); + } + Expression* start_expr = Expression::make_cast(int_type, this->start_, loc); Bexpression* bad_index = - Expression::check_bounds(this->start_, loc)->get_backend(context); + Expression::check_bounds(start_expr, loc)->get_backend(context); Bexpression* start = this->start_->get_backend(context); start = gogo->backend()->convert_expression(int_btype, start, loc); -- 2.30.2