Commit 48d63035 authored by Michael Fraenkel's avatar Michael Fraenkel Committed by Ian Lance Taylor

reflect: set dir when creating a channel via ChanOf

Fixes #9135

Change-Id: I4d0e4eb52a3d64262f107eb7eae4096a6e47ac08
Reviewed-on: https://go-review.googlesource.com/2238Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
parent 1ebfb082
...@@ -3487,6 +3487,26 @@ func TestChanOf(t *testing.T) { ...@@ -3487,6 +3487,26 @@ func TestChanOf(t *testing.T) {
checkSameType(t, Zero(ChanOf(BothDir, TypeOf(T1(1)))).Interface(), (chan T1)(nil)) checkSameType(t, Zero(ChanOf(BothDir, TypeOf(T1(1)))).Interface(), (chan T1)(nil))
} }
func TestChanOfDir(t *testing.T) {
// check construction and use of type not in binary
type T string
crt := ChanOf(RecvDir, TypeOf(T("")))
cst := ChanOf(SendDir, TypeOf(T("")))
// check that type already in binary is found
type T1 int
checkSameType(t, Zero(ChanOf(RecvDir, TypeOf(T1(1)))).Interface(), (<-chan T1)(nil))
checkSameType(t, Zero(ChanOf(SendDir, TypeOf(T1(1)))).Interface(), (chan<- T1)(nil))
// check String form of ChanDir
if crt.ChanDir().String() != "<-chan" {
t.Errorf("chan dir: have %q, want %q", crt.ChanDir().String(), "<-chan")
}
if cst.ChanDir().String() != "chan<-" {
t.Errorf("chan dir: have %q, want %q", cst.ChanDir().String(), "chan<-")
}
}
func TestChanOfGC(t *testing.T) { func TestChanOfGC(t *testing.T) {
done := make(chan bool, 1) done := make(chan bool, 1)
go func() { go func() {
......
...@@ -1425,6 +1425,7 @@ func ChanOf(dir ChanDir, t Type) Type { ...@@ -1425,6 +1425,7 @@ func ChanOf(dir ChanDir, t Type) Type {
prototype := *(**chanType)(unsafe.Pointer(&ichan)) prototype := *(**chanType)(unsafe.Pointer(&ichan))
ch := new(chanType) ch := new(chanType)
*ch = *prototype *ch = *prototype
ch.dir = uintptr(dir)
ch.string = &s ch.string = &s
ch.hash = fnv1(typ.hash, 'c', byte(dir)) ch.hash = fnv1(typ.hash, 'c', byte(dir))
ch.elem = typ ch.elem = typ
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment