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: 's avatarIan Lance Taylor <iant@golang.org>
parent 1ebfb082
......@@ -3487,6 +3487,26 @@ func TestChanOf(t *testing.T) {
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) {
done := make(chan bool, 1)
go func() {
......
......@@ -1425,6 +1425,7 @@ func ChanOf(dir ChanDir, t Type) Type {
prototype := *(**chanType)(unsafe.Pointer(&ichan))
ch := new(chanType)
*ch = *prototype
ch.dir = uintptr(dir)
ch.string = &s
ch.hash = fnv1(typ.hash, 'c', byte(dir))
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