Commit 7ca40639 authored by Russ Cox's avatar Russ Cox

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
parent 48ff4a84
...@@ -548,9 +548,13 @@ maptype(Type *key, Type *val) ...@@ -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) ...@@ -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;
......
// 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"
)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment