aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cmd/compile/internal/noder/stencil.go3
-rw-r--r--src/cmd/compile/internal/noder/stmt.go20
-rw-r--r--test/typeparam/issue48137.go25
3 files changed, 44 insertions, 4 deletions
diff --git a/src/cmd/compile/internal/noder/stencil.go b/src/cmd/compile/internal/noder/stencil.go
index e60383f4e0..e2525a8f7e 100644
--- a/src/cmd/compile/internal/noder/stencil.go
+++ b/src/cmd/compile/internal/noder/stencil.go
@@ -995,6 +995,9 @@ func (subst *subster) node(n ir.Node) ir.Node {
case ir.OSEND:
transformSend(m.(*ir.SendStmt))
+ case ir.OSELECT:
+ transformSelect(m.(*ir.SelectStmt))
+
}
}
diff --git a/src/cmd/compile/internal/noder/stmt.go b/src/cmd/compile/internal/noder/stmt.go
index 7f608bb91f..aefd9fcdaa 100644
--- a/src/cmd/compile/internal/noder/stmt.go
+++ b/src/cmd/compile/internal/noder/stmt.go
@@ -84,13 +84,13 @@ func (g *irgen) stmt(stmt syntax.Stmt) ir.Node {
// to know the types of the left and right sides in various cases.
delay := false
for _, e := range lhs {
- if e.Typecheck() == 3 {
+ if e.Type().HasTParam() || e.Typecheck() == 3 {
delay = true
break
}
}
for _, e := range rhs {
- if e.Typecheck() == 3 {
+ if e.Type().HasTParam() || e.Typecheck() == 3 {
delay = true
break
}
@@ -145,8 +145,20 @@ func (g *irgen) stmt(stmt syntax.Stmt) ir.Node {
return g.forStmt(stmt)
case *syntax.SelectStmt:
n := g.selectStmt(stmt)
- transformSelect(n.(*ir.SelectStmt))
- n.SetTypecheck(1)
+
+ delay := false
+ for _, ncase := range n.(*ir.SelectStmt).Cases {
+ if ncase.Comm != nil && ncase.Comm.Typecheck() == 3 {
+ delay = true
+ break
+ }
+ }
+ if delay {
+ n.SetTypecheck(3)
+ } else {
+ transformSelect(n.(*ir.SelectStmt))
+ n.SetTypecheck(1)
+ }
return n
case *syntax.SwitchStmt:
return g.switchStmt(stmt)
diff --git a/test/typeparam/issue48137.go b/test/typeparam/issue48137.go
new file mode 100644
index 0000000000..3dd7810482
--- /dev/null
+++ b/test/typeparam/issue48137.go
@@ -0,0 +1,25 @@
+// run -gcflags=-G=3
+
+// Copyright 2021 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
+
+type Constraint[T any] interface {
+ ~func() T
+}
+
+func Foo[T Constraint[T]]() T {
+ var t T
+
+ t = func() T {
+ return t
+ }
+ return t
+}
+
+func main() {
+ type Bar func() Bar
+ Foo[Bar]()
+}