]> Cypherpunks repositories - gostls13.git/commitdiff
check type of string/map/array index expressions
authorRuss Cox <rsc@golang.org>
Wed, 9 Sep 2009 08:31:10 +0000 (01:31 -0700)
committerRuss Cox <rsc@golang.org>
Wed, 9 Sep 2009 08:31:10 +0000 (01:31 -0700)
R=ken
OCL=34478
CL=34480

src/cmd/gc/typecheck.c
test/fixedbugs/bug205.go [new file with mode: 0644]

index d364e5fcc6fe15366c2d2f13db4470d3db4dcd02..cf46414cab283fabefb0be0a2d14e6c998df0cf7 100644 (file)
@@ -500,18 +500,24 @@ reswitch:
 
                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;
diff --git a/test/fixedbugs/bug205.go b/test/fixedbugs/bug205.go
new file mode 100644 (file)
index 0000000..5fb0a0d
--- /dev/null
@@ -0,0 +1,18 @@
+// 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"
+}
+