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"
+}
+