| // 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: https://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 | 
 | */ |