mirror of
https://github.com/golang/go
synced 2024-11-20 04:14:49 -07:00
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
This commit is contained in:
parent
1e8e14c901
commit
85d60a727c
@ -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:
|
|||||||
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:
|
|||||||
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)
|
||||||
|
Loading…
Reference in New Issue
Block a user