diff options
author | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-12-04 09:09:56 +0000 |
---|---|---|
committer | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-12-04 09:09:56 +0000 |
commit | 0bd5d859a88f2a37c7ed545f9a1f02db1aaeb7ad (patch) | |
tree | 54799044fac4141cc62e6e4093ac13f9aeeb36fd /gcc/go | |
parent | e089ee65c978b37dd79577688885b2affd2cdea4 (diff) | |
download | gcc-0bd5d859a88f2a37c7ed545f9a1f02db1aaeb7ad.tar.gz |
compiler: Give error for constant inverted slice range.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@194124 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/go')
-rw-r--r-- | gcc/go/gofrontend/expressions.cc | 14 |
1 files 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. |