aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/noder
diff options
context:
space:
mode:
authorCuong Manh Le <cuong.manhle.vn@gmail.com>2021-11-12 13:27:07 +0700
committerCuong Manh Le <cuong.manhle.vn@gmail.com>2021-11-12 18:57:22 +0000
commitb1b6d928bd4fb368f8ada0a554fc85405e7a3688 (patch)
tree7044cc97fcc6a722013791c0b1c923fcaf231e84 /src/cmd/compile/internal/noder
parent5d24203c394e6b64c42a9f69b990d94cb6c8aad4 (diff)
downloadgo-b1b6d928bd4fb368f8ada0a554fc85405e7a3688.tar.xz
cmd/compile: fix missing transformEarlyCall for OXDOT in subster.node
Like OFUNCINST, in case of OXDOT call expression, the arguments need to be transformed earlier, so any needed CONVIFACE nodes are exposed. Fixes #49538 Change-Id: I275ddf6f53a9cadc8708e805941cdf7bdffabba9 Reviewed-on: https://go-review.googlesource.com/c/go/+/363554 Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com> Trust: Dan Scales <danscales@google.com> Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Dan Scales <danscales@google.com>
Diffstat (limited to 'src/cmd/compile/internal/noder')
-rw-r--r--src/cmd/compile/internal/noder/stencil.go12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/cmd/compile/internal/noder/stencil.go b/src/cmd/compile/internal/noder/stencil.go
index 20197565f5..4f9f8107bc 100644
--- a/src/cmd/compile/internal/noder/stencil.go
+++ b/src/cmd/compile/internal/noder/stencil.go
@@ -1095,6 +1095,9 @@ func (subst *subster) node(n ir.Node) ir.Node {
case ir.OXDOT:
// This is the case of a bound call on a typeparam,
// which will be handled in the dictPass.
+ // As with OFUNCINST, we must transform the arguments of the call now,
+ // so any needed CONVIFACE nodes are exposed.
+ transformEarlyCall(call)
case ir.ODOTTYPE, ir.ODOTTYPE2:
// These are DOTTYPEs that could get transformed into
@@ -1229,14 +1232,15 @@ func (g *genInst) dictPass(info *instInfo) {
transformDot(mse, false)
}
case ir.OCALL:
- op := m.(*ir.CallExpr).X.Op()
+ call := m.(*ir.CallExpr)
+ op := call.X.Op()
if op == ir.OMETHVALUE {
// Redo the transformation of OXDOT, now that we
// know the method value is being called.
- m.(*ir.CallExpr).X.(*ir.SelectorExpr).SetOp(ir.OXDOT)
- transformDot(m.(*ir.CallExpr).X.(*ir.SelectorExpr), true)
+ call.X.(*ir.SelectorExpr).SetOp(ir.OXDOT)
+ transformDot(call.X.(*ir.SelectorExpr), true)
}
- transformCall(m.(*ir.CallExpr))
+ transformCall(call)
case ir.OCONVIFACE:
if m.Type().IsEmptyInterface() && m.(*ir.ConvExpr).X.Type().IsEmptyInterface() {