]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.18] cmd/compile: only check implicit dots for method call enabled...
authorCuong Manh Le <cuong.manhle.vn@gmail.com>
Tue, 28 Jun 2022 19:05:21 +0000 (02:05 +0700)
committerHeschi Kreinick <heschi@google.com>
Thu, 7 Jul 2022 17:30:11 +0000 (17:30 +0000)
Fixes #53723

Change-Id: Ibad64f5c4af2112deeb0a9ecc9c589b17594bd05
Reviewed-on: https://go-review.googlesource.com/c/go/+/414836
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-on: https://go-review.googlesource.com/c/go/+/416155
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Heschi Kreinick <heschi@google.com>
src/cmd/compile/internal/noder/stencil.go
test/typeparam/issue53419.go [new file with mode: 0644]

index 4c3dd37d94f0c4c7cc0f90dd448a03cad41d064e..e89b69284c03d6e325f9acc4ae22a12ecddc538d 100644 (file)
@@ -1599,12 +1599,14 @@ func (g *genInst) getDictionarySym(gf *ir.Name, targs []*types.Type, isMeth bool
                                se := call.X.(*ir.SelectorExpr)
                                if se.X.Type().IsShape() {
                                        // 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)
-                                       tmpse = typecheck.AddImplicitDots(tmpse)
-                                       tparam := tmpse.X.Type()
+                                       tparam := se.X.Type()
+                                       if call.X.Op() == ir.ODOTMETH {
+                                               // 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)
+                                               tmpse = typecheck.AddImplicitDots(tmpse)
+                                               tparam = tmpse.X.Type()
+                                       }
                                        if !tparam.IsShape() {
                                                // The method expression is not
                                                // really on a typeparam.
diff --git a/test/typeparam/issue53419.go b/test/typeparam/issue53419.go
new file mode 100644 (file)
index 0000000..0bef4a9
--- /dev/null
@@ -0,0 +1,28 @@
+// run -gcflags=-G=3
+
+// Copyright 2022 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 T1 struct{}
+type T2 struct{}
+type Both struct {
+       T1
+       T2
+}
+
+func (T1) m()   { panic("FAIL") }
+func (T2) m()   { panic("FAIL") }
+func (Both) m() {}
+
+func f[T interface{ m() }](c T) {
+       c.m()
+}
+
+func main() {
+       var b Both
+       b.m()
+       f(b)
+}