diff options
| author | Cuong Manh Le <cuong.manhle.vn@gmail.com> | 2021-11-12 13:27:07 +0700 |
|---|---|---|
| committer | Cuong Manh Le <cuong.manhle.vn@gmail.com> | 2021-11-12 18:57:22 +0000 |
| commit | b1b6d928bd4fb368f8ada0a554fc85405e7a3688 (patch) | |
| tree | 7044cc97fcc6a722013791c0b1c923fcaf231e84 /src/cmd/compile/internal/noder | |
| parent | 5d24203c394e6b64c42a9f69b990d94cb6c8aad4 (diff) | |
| download | go-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.go | 12 |
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() { |
