mirror of
https://github.com/golang/go
synced 2024-11-23 09:00:04 -07:00
a457fa500d
This is a manual undo of CL 5674098. It does not implement the even less strict spec that we just agreed on, but it gets us back where we were at the last weekly. R=ken2 CC=golang-dev https://golang.org/cl/5683069
103 lines
2.9 KiB
Go
103 lines
2.9 KiB
Go
// run
|
|
|
|
// Copyright 2010 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.
|
|
|
|
// Test for issue 778: Map key values that are assignment
|
|
// compatible with the map key type must be accepted according
|
|
// to the spec: http://golang.org/doc/go_spec.html#Indexes .
|
|
|
|
package main
|
|
|
|
type T2 struct {
|
|
x int
|
|
}
|
|
|
|
func (t *T2) f() int { return t.x }
|
|
|
|
func main() {
|
|
type B bool
|
|
b := B(false)
|
|
mb := make(map[B]int)
|
|
mb[false] = 42 // this should work: false is assignment compatible with B
|
|
mb[b] = 42
|
|
|
|
type Z int
|
|
z := Z(0)
|
|
mz := make(map[Z]int)
|
|
mz[0] = 42
|
|
mz[z] = 42
|
|
|
|
type S string
|
|
s := S("foo")
|
|
ms := make(map[S]int)
|
|
ms["foo"] = 42
|
|
ms[s] = 42
|
|
|
|
type T struct {
|
|
x int
|
|
}
|
|
type P *T
|
|
p := P(nil)
|
|
mp := make(map[P]int)
|
|
mp[nil] = 42
|
|
mp[p] = 42
|
|
mp[&T{7}] = 42
|
|
|
|
type C chan int
|
|
c := make(C)
|
|
mc := make(map[C]int)
|
|
mc[nil] = 42
|
|
mc[c] = 42
|
|
mc[make(C)] = 42
|
|
|
|
type I1 interface{}
|
|
type I2 interface {
|
|
f() int
|
|
}
|
|
var i0 interface{} = z
|
|
var i1 I1 = p
|
|
m0 := make(map[interface{}]int)
|
|
m1 := make(map[I1]int)
|
|
m2 := make(map[I2]int)
|
|
m0[i0] = 42
|
|
m0[i1] = 42
|
|
m0[z] = 42 // this should work: z is assignment-compatible with interface{}
|
|
m0[new(struct {
|
|
x int
|
|
})] = 42 // this should work: *struct{x int} is assignment-compatible with interface{}
|
|
m0[p] = 42 // this should work: p is assignment-compatible with interface{}
|
|
m0[false] = 42 // this should work: false is assignment-compatible with interface{}
|
|
m0[17] = 42 // this should work: 17 is assignment-compatible with interface{}
|
|
m0["foo"] = 42 // this should work: "foo" is assignment-compatible with interface{}
|
|
|
|
m1[i0] = 42
|
|
m1[i1] = 42
|
|
m1[new(struct {
|
|
x int
|
|
})] = 42 // this should work: *struct{x int} is assignment-compatible with I1
|
|
m1[false] = 42 // this should work: false is assignment-compatible with I1
|
|
m1[17] = 42 // this should work: 17 is assignment-compatible with I1
|
|
m1["foo"] = 42 // this should work: "foo" is assignment-compatible with I1
|
|
|
|
m2[new(T2)] = 42 // this should work: *T2 is assignment-compatible with I2
|
|
}
|
|
|
|
/*
|
|
6g -e bug286.go
|
|
bug286.go:23: invalid map index false - need type B
|
|
bug286.go:80: invalid map index z - need type interface { }
|
|
bug286.go:83: invalid map index new(struct { x int }) - need type interface { }
|
|
bug286.go:84: invalid map index p - need type interface { }
|
|
bug286.go:85: invalid map index false - need type interface { }
|
|
bug286.go:86: invalid map index 17 - need type interface { }
|
|
bug286.go:87: invalid map index "foo" - need type interface { }
|
|
bug286.go:93: invalid map index new(struct { x int }) - need type I1
|
|
bug286.go:94: invalid map index false - need type I1
|
|
bug286.go:95: invalid map index 17 - need type I1
|
|
bug286.go:96: invalid map index "foo" - need type I1
|
|
bug286.go:99: invalid map index new(T2) - need type I2
|
|
bug286.go:100: invalid map index t2 - need type I2
|
|
*/
|