diff options
Diffstat (limited to '')
-rw-r--r-- | test/fixedbugs/issue16870.go | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/test/fixedbugs/issue16870.go b/test/fixedbugs/issue16870.go new file mode 100644 index 0000000..2309997 --- /dev/null +++ b/test/fixedbugs/issue16870.go @@ -0,0 +1,140 @@ +// run + +// Copyright 2016 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 + +import ( + "log" + "reflect" +) + +func test(got, want interface{}) { + if !reflect.DeepEqual(got, want) { + log.Fatalf("got %v, want %v", got, want) + } +} + +func main() { + var i int + var ip *int + var ok interface{} + + // Channel receives. + c := make(chan int, 1) + c2 := make(chan int) + + c <- 42 + i, ok = <-c + test(i, 42) + test(ok, true) + + c <- 42 + _, ok = <-c + test(ok, true) + + c <- 42 + select { + case i, ok = <-c: + test(i, 42) + test(ok, true) + } + + c <- 42 + select { + case _, ok = <-c: + test(ok, true) + } + + c <- 42 + select { + case i, ok = <-c: + test(i, 42) + test(ok, true) + default: + log.Fatal("bad select") + } + + c <- 42 + select { + case _, ok = <-c: + test(ok, true) + default: + log.Fatal("bad select") + } + + c <- 42 + select { + case i, ok = <-c: + test(i, 42) + test(ok, true) + case <-c2: + log.Fatal("bad select") + } + + c <- 42 + select { + case _, ok = <-c: + test(ok, true) + case <-c2: + log.Fatal("bad select") + } + + close(c) + i, ok = <-c + test(i, 0) + test(ok, false) + + _, ok = <-c + test(ok, false) + + // Map indexing. + m := make(map[int]int) + + i, ok = m[0] + test(i, 0) + test(ok, false) + + _, ok = m[0] + test(ok, false) + + m[0] = 42 + i, ok = m[0] + test(i, 42) + test(ok, true) + + _, ok = m[0] + test(ok, true) + + // Type assertions. + var u interface{} + + i, ok = u.(int) + test(i, 0) + test(ok, false) + + ip, ok = u.(*int) + test(ip, (*int)(nil)) + test(ok, false) + + _, ok = u.(int) + test(ok, false) + + u = 42 + i, ok = u.(int) + test(i, 42) + test(ok, true) + + _, ok = u.(int) + test(ok, true) + + u = &i + ip, ok = u.(*int) + test(ip, &i) + test(ok, true) + + _, ok = u.(*int) + test(ok, true) +} |