1
0
mirror of https://github.com/golang/go synced 2024-11-25 00:07:56 -07:00

gc: disallow invalid map keys

The algtype-based test broke when algtype
got a bit more fine-grained, so replace with
an explicit check for the invalid key types.

R=ken2
CC=golang-dev
https://golang.org/cl/5071041
This commit is contained in:
Russ Cox 2011-09-19 13:11:24 -04:00
parent 48ff4a849c
commit 7ca406396f
2 changed files with 50 additions and 5 deletions

View File

@ -548,9 +548,13 @@ maptype(Type *key, Type *val)
{ {
Type *t; Type *t;
if(key != nil) {
if(key != nil && key->etype != TANY && algtype(key) == ANOEQ) { switch(key->etype) {
if(key->etype == TFORW) { case TARRAY:
case TSTRUCT:
yyerror("invalid map key type %T", key);
break;
case TFORW:
// map[key] used during definition of key. // map[key] used during definition of key.
// postpone check until key is fully defined. // postpone check until key is fully defined.
// if there are multiple uses of map[key] // if there are multiple uses of map[key]
@ -559,8 +563,8 @@ maptype(Type *key, Type *val)
// good enough. // good enough.
if(key->maplineno == 0) if(key->maplineno == 0)
key->maplineno = lineno; key->maplineno = lineno;
} else break;
yyerror("invalid map key type %T", key); }
} }
t = typ(TMAP); t = typ(TMAP);
t->down = key; t->down = key;

41
test/map1.go Normal file
View File

@ -0,0 +1,41 @@
// errchk $G -e $D/$F.go
// Copyright 2011 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
func main() {}
type v bool
var (
// valid
_ map[int8]v
_ map[uint8]v
_ map[int16]v
_ map[uint16]v
_ map[int32]v
_ map[uint32]v
_ map[int64]v
_ map[uint64]v
_ map[int]v
_ map[uint]v
_ map[uintptr]v
_ map[float32]v
_ map[float64]v
_ map[complex64]v
_ map[complex128]v
_ map[bool]v
_ map[string]v
_ map[chan int]v
_ map[func()]v
_ map[*int]v
_ map[map[int]int]v
// invalid
_ map[struct{}]v // ERROR "invalid map key"
_ map[[]int]v // ERROR "invalid map key"
_ map[[10]int]v // ERROR "invalid map key"
)