mirror of
https://github.com/golang/go
synced 2024-11-25 11:07:59 -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:
parent
48ff4a849c
commit
7ca406396f
@ -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
41
test/map1.go
Normal 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"
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user