modernc.org/gc@v1.0.1-0.20240304020402-f0dba7c97c2b/testdata/errchk/test/fixedbugs/bug285.go (about) 1 // run 2 3 // Copyright 2010 The Go Authors. All rights reserved. 4 // Use of this source code is governed by a BSD-style 5 // license that can be found in the LICENSE file. 6 7 // Test for issue 778: Map key values that are assignment 8 // compatible with the map key type must be accepted according 9 // to the spec: https://golang.org/doc/go_spec.html#Indexes . 10 11 package main 12 13 type T2 struct { 14 x int 15 } 16 17 func (t *T2) f() int { return t.x } 18 19 func main() { 20 type B bool 21 b := B(false) 22 mb := make(map[B]int) 23 mb[false] = 42 // this should work: false is assignment compatible with B 24 mb[b] = 42 25 26 type Z int 27 z := Z(0) 28 mz := make(map[Z]int) 29 mz[0] = 42 30 mz[z] = 42 31 32 type S string 33 s := S("foo") 34 ms := make(map[S]int) 35 ms["foo"] = 42 36 ms[s] = 42 37 38 type T struct { 39 x int 40 } 41 type P *T 42 p := P(nil) 43 mp := make(map[P]int) 44 mp[nil] = 42 45 mp[p] = 42 46 mp[&T{7}] = 42 47 48 type C chan int 49 c := make(C) 50 mc := make(map[C]int) 51 mc[nil] = 42 52 mc[c] = 42 53 mc[make(C)] = 42 54 55 type I1 interface{} 56 type I2 interface { 57 f() int 58 } 59 var i0 interface{} = z 60 var i1 I1 = p 61 m0 := make(map[interface{}]int) 62 m1 := make(map[I1]int) 63 m2 := make(map[I2]int) 64 m0[i0] = 42 65 m0[i1] = 42 66 m0[z] = 42 // this should work: z is assignment-compatible with interface{} 67 m0[new(struct { 68 x int 69 })] = 42 // this should work: *struct{x int} is assignment-compatible with interface{} 70 m0[p] = 42 // this should work: p is assignment-compatible with interface{} 71 m0[false] = 42 // this should work: false is assignment-compatible with interface{} 72 m0[17] = 42 // this should work: 17 is assignment-compatible with interface{} 73 m0["foo"] = 42 // this should work: "foo" is assignment-compatible with interface{} 74 75 m1[i0] = 42 76 m1[i1] = 42 77 m1[new(struct { 78 x int 79 })] = 42 // this should work: *struct{x int} is assignment-compatible with I1 80 m1[false] = 42 // this should work: false is assignment-compatible with I1 81 m1[17] = 42 // this should work: 17 is assignment-compatible with I1 82 m1["foo"] = 42 // this should work: "foo" is assignment-compatible with I1 83 84 m2[new(T2)] = 42 // this should work: *T2 is assignment-compatible with I2 85 } 86 87 /* 88 6g -e bug286.go 89 bug286.go:23: invalid map index false - need type B 90 bug286.go:80: invalid map index z - need type interface { } 91 bug286.go:83: invalid map index new(struct { x int }) - need type interface { } 92 bug286.go:84: invalid map index p - need type interface { } 93 bug286.go:85: invalid map index false - need type interface { } 94 bug286.go:86: invalid map index 17 - need type interface { } 95 bug286.go:87: invalid map index "foo" - need type interface { } 96 bug286.go:93: invalid map index new(struct { x int }) - need type I1 97 bug286.go:94: invalid map index false - need type I1 98 bug286.go:95: invalid map index 17 - need type I1 99 bug286.go:96: invalid map index "foo" - need type I1 100 bug286.go:99: invalid map index new(T2) - need type I2 101 bug286.go:100: invalid map index t2 - need type I2 102 */