summaryrefslogtreecommitdiff
path: root/gcc/go
diff options
context:
space:
mode:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2012-12-04 09:09:56 +0000
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2012-12-04 09:09:56 +0000
commit0bd5d859a88f2a37c7ed545f9a1f02db1aaeb7ad (patch)
tree54799044fac4141cc62e6e4093ac13f9aeeb36fd /gcc/go
parente089ee65c978b37dd79577688885b2affd2cdea4 (diff)
downloadgcc-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.cc14
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.