aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/noder
diff options
context:
space:
mode:
authorCuong Manh Le <cuong.manhle.vn@gmail.com>2022-08-09 19:30:47 +0700
committerGopher Robot <gobot@golang.org>2022-08-15 17:49:19 +0000
commite99f285d52627aa415f9c1766cbffe375b2f67d9 (patch)
treec015984cce5096079cbe3051215bf00c05b09c9a /src/cmd/compile/internal/noder
parent1f833e4a1bfd77c2dfa91305f90ade9f9ceb66de (diff)
downloadgo-e99f285d52627aa415f9c1766cbffe375b2f67d9.tar.xz
cmd/compile: fix ICE when checking implicit dot for method call
CL 414836 limited the check for implicit dot for method call enabled by a type bound. However, the checking condition for ODOTMETH only is not right. For example, for promoted method, we have a OXDOT node instead, and we still have to check for implicit dot in this case. However, if the base type and embedded types have the same method name, e.g in issue #53419, typecheck.AddImplicitDots will be confused and result in an ambigus selector. To fix this, we ensure methods for the base type are computed, then only do the implicit dot check if we can find a matched method. Fixes #54348 Change-Id: Iefe84ff330830afe35c5daffd499824db108da23 Reviewed-on: https://go-review.googlesource.com/c/go/+/422274 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Keith Randall <khr@google.com> Reviewed-by: Matthew Dempsky <mdempsky@google.com> Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> Auto-Submit: Keith Randall <khr@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/noder')
-rw-r--r--src/cmd/compile/internal/noder/stencil.go6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/cmd/compile/internal/noder/stencil.go b/src/cmd/compile/internal/noder/stencil.go
index 6fcb31b472..5a41d2f1f0 100644
--- a/src/cmd/compile/internal/noder/stencil.go
+++ b/src/cmd/compile/internal/noder/stencil.go
@@ -1656,9 +1656,11 @@ func (g *genInst) getDictionarySym(gf *ir.Name, targs []*types.Type, isMeth bool
var nameNode *ir.Name
se := call.X.(*ir.SelectorExpr)
if se.X.Type().IsShape() {
- // This is a method call enabled by a type bound.
tparam := se.X.Type()
- if call.X.Op() == ir.ODOTMETH {
+ // Ensure methods on all instantiating types are computed.
+ typecheck.CalcMethods(tparam)
+ if typecheck.Lookdot1(nil, se.Sel, tparam, tparam.AllMethods(), 0) != nil {
+ // This is a method call enabled by a type bound.
// We need this extra check for method expressions,
// which don't add in the implicit XDOTs.
tmpse := ir.NewSelectorExpr(src.NoXPos, ir.OXDOT, se.X, se.Sel)