Commit 85d60a72 authored by Daniel Morsing's avatar Daniel Morsing

cmd/gc: do simple bounds checking of constant indices/slices in typecheck.

This should make the compiler emit errors specific to the bounds checking instead of overflow errors on the underlying types.

Updates #4232.

R=rsc
CC=golang-dev
https://golang.org/cl/6783054
parent 1e8e14c9
...@@ -817,9 +817,18 @@ reswitch: ...@@ -817,9 +817,18 @@ reswitch:
case TARRAY: case TARRAY:
defaultlit(&n->right, T); defaultlit(&n->right, T);
if(n->right->type != T && !isint[n->right->type->etype])
yyerror("non-integer array index %N", n->right);
n->type = t->type; n->type = t->type;
if(n->right->type != T && !isint[n->right->type->etype]) {
yyerror("non-integer array index %N", n->right);
break;
}
if(n->right->op == OLITERAL) {
if(mpgetfix(n->right->val.u.xval) < 0) {
why = isfixedarray(t) ? "array" : "slice";
yyerror("invalid %s index %N (index must be non-negative)", why, n->right);
} else if(isfixedarray(t) && t->bound > 0 && mpgetfix(n->right->val.u.xval) >= t->bound)
yyerror("invalid array index %N (out of bounds for %d-element array)", n->right, t->bound);
}
break; break;
case TMAP: case TMAP:
...@@ -912,6 +921,8 @@ reswitch: ...@@ -912,6 +921,8 @@ reswitch:
yyerror("invalid slice index %N (type %T)", n->right->left, t); yyerror("invalid slice index %N (type %T)", n->right->left, t);
goto error; goto error;
} }
if(n->right->left->op == OLITERAL && mpgetfix(n->right->left->val.u.xval) < 0)
yyerror("invalid slice index %N (index must be non-negative)", n->right->left);
} }
if(n->right->right != N) { if(n->right->right != N) {
if((t = n->right->right->type) == T) if((t = n->right->right->type) == T)
...@@ -920,6 +931,8 @@ reswitch: ...@@ -920,6 +931,8 @@ reswitch:
yyerror("invalid slice index %N (type %T)", n->right->right, t); yyerror("invalid slice index %N (type %T)", n->right->right, t);
goto error; goto error;
} }
if(n->right->right->op == OLITERAL && mpgetfix(n->right->right->val.u.xval) < 0)
yyerror("invalid slice index %N (index must be non-negative)", n->right->right);
} }
l = n->left; l = n->left;
if((t = l->type) == T) if((t = l->type) == T)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment