case TARRAY:
defaultlit(&n->right, types[TUINT]);
+ if(n->right->type != T && !isint[n->right->type->etype])
+ yyerror("non-integer array index %#N", n->right);
n->type = t->type;
break;
case TMAP:
n->etype = 0;
defaultlit(&n->right, t->down);
+ if(n->right->type != T && !eqtype(n->right->type, t->down))
+ yyerror("invalid map index %#N - need type %T", n->right, t->down);
n->type = t->type;
n->op = OINDEXMAP;
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];
n->op = OINDEXSTR;
break;
--- /dev/null
+// errchk $G $D/$F.go
+
+// Copyright 2009 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 main
+
+var t []int
+var s string;
+var m map[string]int;
+
+func main() {
+ println(t["hi"]); // ERROR "non-integer"
+ println(s["hi"]); // ERROR "non-integer"
+ println(m[0]); // ERROR "map index"
+}
+