if index.Op() != ir.OTYPE {
// This is just a normal index expression
n := Index(pos, g.typ(typ), g.expr(expr.X), index)
- if !delayTransform() {
+ if !g.delayTransform() {
// transformIndex will modify n.Type() for OINDEXMAP.
transformIndex(n)
}
case *syntax.SliceExpr:
n := Slice(pos, g.typ(typ), g.expr(expr.X), g.expr(expr.Index[0]), g.expr(expr.Index[1]), g.expr(expr.Index[2]))
- if !delayTransform() {
+ if !g.delayTransform() {
transformSlice(n)
}
return n
switch op := g.op(expr.Op, binOps[:]); op {
case ir.OEQ, ir.ONE, ir.OLT, ir.OLE, ir.OGT, ir.OGE:
n := Compare(pos, g.typ(typ), op, g.expr(expr.X), g.expr(expr.Y))
- if !delayTransform() {
+ if !g.delayTransform() {
transformCompare(n)
}
return n
return typed(x.Type(), ir.NewLogicalExpr(pos, op, x, y))
default:
n := Binary(pos, op, g.typ(typ), g.expr(expr.X), g.expr(expr.Y))
- if op == ir.OADD && !delayTransform() {
+ if op == ir.OADD && !g.delayTransform() {
return transformAdd(n)
}
return n
}
return ir.NewAssignOpStmt(pos, op, x, bl)
}
-
-// delayTransform returns true if we should delay all transforms, because we are
-// creating the nodes for a generic function/method.
-func delayTransform() bool {
- return ir.CurFunc != nil && ir.CurFunc.Type().HasTParam()
-}
base.FatalfAt(g.pos(p), "unhandled %s: %T", what, p)
panic("unreachable")
}
+
+// delayTransform returns true if we should delay all transforms, because we are
+// creating the nodes for a generic function/method.
+func (g *irgen) delayTransform() bool {
+ return g.topFuncIsGeneric
+}
return wrapname(g.pos(stmt.X), g.expr(stmt.X))
case *syntax.SendStmt:
n := ir.NewSendStmt(g.pos(stmt), g.expr(stmt.Chan), g.expr(stmt.Value))
- if !delayTransform() {
+ if !g.delayTransform() {
transformSend(n)
}
n.SetTypecheck(1)
lhs := g.expr(stmt.Lhs)
n = ir.NewAssignOpStmt(g.pos(stmt), op, lhs, rhs)
}
- if !delayTransform() {
+ if !g.delayTransform() {
transformAsOp(n)
}
n.SetTypecheck(1)
n := ir.NewAssignStmt(g.pos(stmt), lhs[0], rhs[0])
n.Def = initDefn(n, names)
- if !delayTransform() {
+ if !g.delayTransform() {
lhs, rhs := []ir.Node{n.X}, []ir.Node{n.Y}
transformAssign(n, lhs, rhs)
n.X, n.Y = lhs[0], rhs[0]
n := ir.NewAssignListStmt(g.pos(stmt), ir.OAS2, lhs, rhs)
n.Def = initDefn(n, names)
- if !delayTransform() {
+ if !g.delayTransform() {
transformAssign(n, n.Lhs, n.Rhs)
}
n.SetTypecheck(1)
return ir.NewGoDeferStmt(g.pos(stmt), g.tokOp(int(stmt.Tok), callOps[:]), g.expr(stmt.Call))
case *syntax.ReturnStmt:
n := ir.NewReturnStmt(g.pos(stmt), g.exprList(stmt.Results))
- if !delayTransform() {
+ if !g.delayTransform() {
transformReturn(n)
}
n.SetTypecheck(1)
case *syntax.SelectStmt:
n := g.selectStmt(stmt)
- if !delayTransform() {
+ if !g.delayTransform() {
transformSelect(n.(*ir.SelectStmt))
}
n.SetTypecheck(1)
--- /dev/null
+// compile -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 p
+
+import "constraints"
+
+func f[T constraints.Chan[E], E any](e E) T {
+ ch := make(T)
+ go func() {
+ defer close(ch)
+ ch <- e
+ }()
+ return ch
+}