diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go index 974b5d2f6c1..278848bc007 100644 --- a/src/reflect/all_test.go +++ b/src/reflect/all_test.go @@ -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() { diff --git a/src/reflect/type.go b/src/reflect/type.go index 75d73adbca9..d19e5f97674 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -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