diff options
author | Russ Cox <rsc@golang.org> | 2010-06-08 18:50:02 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2010-06-08 18:50:02 -0700 |
commit | 105c61f5ede0604545bfb2ae58d5627b8ddc0614 (patch) | |
tree | 19d1ab733d194831a2bf78d352fc92bb71e86f7a /test/fixedbugs/bug285.go | |
parent | 86bca21ef3fb4caf07f58216af511ce6938742e6 (diff) | |
download | go-105c61f5ede0604545bfb2ae58d5627b8ddc0614.tar.gz |
gc: new typechecking rules
* Code for assignment, conversions now mirrors spec.
* Changed some snprint -> smprint.
* Renamed runtime functions to separate
interface conversions from type assertions:
convT2I, assertI2T, etc.
* Correct checking of \U sequences.
Fixes issue 840.
Fixes issue 830.
Fixes issue 778.
R=ken2
CC=golang-dev
http://codereview.appspot.com/1303042
Diffstat (limited to 'test/fixedbugs/bug285.go')
-rw-r--r-- | test/fixedbugs/bug285.go | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/test/fixedbugs/bug285.go b/test/fixedbugs/bug285.go new file mode 100644 index 000000000..544d3487e --- /dev/null +++ b/test/fixedbugs/bug285.go @@ -0,0 +1,116 @@ +// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: bug285 + +// 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 F func(x int) + f := func(x int) {} + mf := make(map[F]int) + mf[nil] = 42 + mf[f] = 42 + mf[func(x int) {}] = 42 + + type M map[int]int + m := make(M) + mm := make(map[M]int) + mm[nil] = 42 + mm[m] = 42 + mm[make(M)] = 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 +*/ |