Commit d82dcadb authored by Russ Cox's avatar Russ Cox

cmd/gc: clean up string index errors

Unify with array/slice errors, which were already good.

Fixes #4232.

R=ken2
CC=golang-dev
https://golang.org/cl/7271046
parent 4ad505d1
...@@ -832,24 +832,35 @@ reswitch: ...@@ -832,24 +832,35 @@ reswitch:
yyerror("invalid operation: %N (index of type %T)", n, t); yyerror("invalid operation: %N (index of type %T)", n, t);
goto error; goto error;
case TSTRING:
case TARRAY: case TARRAY:
defaultlit(&n->right, T); defaultlit(&n->right, T);
if(t->etype == TSTRING)
n->type = types[TUINT8];
else
n->type = t->type; n->type = t->type;
why = "string";
if(t->etype == TARRAY) {
if(isfixedarray(t))
why = "array";
else
why = "slice";
}
if(n->right->type != T && !isint[n->right->type->etype]) { if(n->right->type != T && !isint[n->right->type->etype]) {
yyerror("non-integer array index %N", n->right); yyerror("non-integer %s index %N", why, n->right);
break; break;
} }
if(n->right->op == OLITERAL) { if(n->right->op == OLITERAL) {
if(mpgetfix(n->right->val.u.xval) < 0) { 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); 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) 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); yyerror("invalid array index %N (out of bounds for %d-element array)", n->right, t->bound);
else if(mpcmpfixfix(n->right->val.u.xval, maxintval[TINT]) > 0) { else if(isconst(n->left, CTSTR) && mpgetfix(n->right->val.u.xval) >= n->left->val.u.sval->len)
why = isfixedarray(t) ? "array" : "slice"; yyerror("invalid string index %N (out of bounds for %d-byte string)", n->right, n->left->val.u.sval->len);
else if(mpcmpfixfix(n->right->val.u.xval, maxintval[TINT]) > 0)
yyerror("invalid %s index %N (index too large)", why, n->right); yyerror("invalid %s index %N (index too large)", why, n->right);
} }
}
break; break;
case TMAP: case TMAP:
...@@ -860,13 +871,6 @@ reswitch: ...@@ -860,13 +871,6 @@ reswitch:
n->type = t->type; n->type = t->type;
n->op = OINDEXMAP; n->op = OINDEXMAP;
break; break;
case TSTRING:
defaultlit(&n->right, types[TUINT]);
if(n->right->type != T && !isint[n->right->type->etype])
yyerror("non-integer string index %N", n->right);
n->type = types[TUINT8];
break;
} }
goto ret; goto ret;
......
...@@ -11,8 +11,8 @@ var s string; ...@@ -11,8 +11,8 @@ var s string;
var m map[string]int; var m map[string]int;
func main() { func main() {
println(t["hi"]); // ERROR "integer" println(t["hi"]); // ERROR "non-integer slice index"
println(s["hi"]); // ERROR "integer" "to type uint" println(s["hi"]); // ERROR "non-integer string index"
println(m[0]); // ERROR "map index" println(m[0]); // ERROR "as type string in map index"
} }
// errorcheck
// Copyright 2013 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package p
func f() {
var a [10]int
_ = a[-1] // ERROR "invalid array index -1"
_ = a[-1:] // ERROR "invalid slice index -1"
_ = a[:-1] // ERROR "invalid slice index -1"
_ = a[10] // ERROR "invalid array index 10"
var s []int
_ = s[-1] // ERROR "invalid slice index -1"
_ = s[-1:] // ERROR "invalid slice index -1"
_ = s[:-1] // ERROR "invalid slice index -1"
_ = s[10]
const c = "foo"
_ = c[-1] // ERROR "invalid string index -1"
_ = c[-1:] // ERROR "invalid slice index -1"
_ = c[:-1] // ERROR "invalid slice index -1"
_ = c[3] // ERROR "invalid string index 3"
var t string
_ = t[-1] // ERROR "invalid string index -1"
_ = t[-1:] // ERROR "invalid slice index -1"
_ = t[:-1] // ERROR "invalid slice index -1"
_ = t[3]
}
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