aboutsummaryrefslogtreecommitdiff
path: root/src/reflect/type.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/reflect/type.go')
-rw-r--r--src/reflect/type.go12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/reflect/type.go b/src/reflect/type.go
index 38b1283d42..44c96fea82 100644
--- a/src/reflect/type.go
+++ b/src/reflect/type.go
@@ -1789,7 +1789,6 @@ func ChanOf(dir ChanDir, t Type) Type {
}
// Look in known types.
- // TODO: Precedence when constructing string.
var s string
switch dir {
default:
@@ -1799,7 +1798,16 @@ func ChanOf(dir ChanDir, t Type) Type {
case RecvDir:
s = "<-chan " + typ.String()
case BothDir:
- s = "chan " + typ.String()
+ typeStr := typ.String()
+ if typeStr[0] == '<' {
+ // typ is recv chan, need parentheses as "<-" associates with leftmost
+ // chan possible, see:
+ // * https://golang.org/ref/spec#Channel_types
+ // * https://github.com/golang/go/issues/39897
+ s = "chan (" + typeStr + ")"
+ } else {
+ s = "chan " + typeStr
+ }
}
for _, tt := range typesByString(s) {
ch := (*chanType)(unsafe.Pointer(tt))