From f2b2ead42ed389a918b586b3f95c26455ae13e7c Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 4 Dec 2012 09:09:56 +0000 Subject: [PATCH] compiler: Give error for constant inverted slice range. From-SVN: r194124 --- gcc/go/gofrontend/expressions.cc | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index e0690e77bf6..7a5fcf27c95 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -9770,8 +9770,10 @@ Array_index_expression::do_check_types(Gogo*) && lvalnc.to_int(&lval)); Numeric_constant inc; mpz_t ival; + bool ival_valid = false; if (this->start_->numeric_constant_value(&inc) && inc.to_int(&ival)) { + ival_valid = true; if (mpz_sgn(ival) < 0 || mpz_sizeinbase(ival, 2) >= int_bits || (lval_valid @@ -9782,7 +9784,6 @@ Array_index_expression::do_check_types(Gogo*) error_at(this->start_->location(), "array index out of bounds"); this->set_is_error(); } - mpz_clear(ival); } if (this->end_ != NULL && !this->end_->is_nil_expression()) { @@ -9797,9 +9798,13 @@ Array_index_expression::do_check_types(Gogo*) error_at(this->end_->location(), "array index out of bounds"); this->set_is_error(); } + else if (ival_valid && mpz_cmp(ival, eval) > 0) + this->report_error(_("inverted slice range")); mpz_clear(eval); } } + if (ival_valid) + mpz_clear(ival); if (lval_valid) mpz_clear(lval); @@ -10180,15 +10185,16 @@ String_index_expression::do_check_types(Gogo*) Numeric_constant inc; mpz_t ival; + bool ival_valid = false; if (this->start_->numeric_constant_value(&inc) && inc.to_int(&ival)) { + ival_valid = true; if (mpz_sgn(ival) < 0 || (sval_valid && mpz_cmp_ui(ival, sval.length()) >= 0)) { error_at(this->start_->location(), "string index out of bounds"); this->set_is_error(); } - mpz_clear(ival); } if (this->end_ != NULL && !this->end_->is_nil_expression()) { @@ -10202,9 +10208,13 @@ String_index_expression::do_check_types(Gogo*) error_at(this->end_->location(), "string index out of bounds"); this->set_is_error(); } + else if (ival_valid && mpz_cmp(ival, eval) > 0) + this->report_error(_("inverted slice range")); mpz_clear(eval); } } + if (ival_valid) + mpz_clear(ival); } // Get a tree for a string index.