1
0
mirror of https://github.com/golang/go synced 2024-11-11 19:21:37 -07:00

[release-branch.go1.17] cmd/compile: fix method expression lookup during import

CL 309831 fixed importing of method expressions, by re-using the same
code already have for ODOTMETH. But that code does not work with
embedded field.

To fix this, we need to calculate all methods of the receiver base type
of method expression, before looking up the selection.

Fixes #48102

Change-Id: Ia244d36a3ed0f989735eb57becdfa70a81912f57
Reviewed-on: https://go-review.googlesource.com/c/go/+/346489
Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Reviewed-on: https://go-review.googlesource.com/c/go/+/346670
Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
Cuong Manh Le 2021-09-01 00:18:13 +07:00 committed by Cherry Mui
parent 1dd24caf08
commit 3969694203
4 changed files with 44 additions and 2 deletions

View File

@ -1222,12 +1222,14 @@ func (r *importReader) node() ir.Node {
switch op {
case ir.ODOT, ir.ODOTPTR, ir.ODOTINTER:
n.Selection = r.exoticField()
case ir.ODOTMETH, ir.OCALLPART, ir.OMETHEXPR:
case ir.OMETHEXPR:
n = typecheckMethodExpr(n).(*ir.SelectorExpr)
case ir.ODOTMETH, ir.OCALLPART:
// These require a Lookup to link to the correct declaration.
rcvrType := expr.Type()
typ := n.Type()
n.Selection = Lookdot(n, rcvrType, 1)
if op == ir.OCALLPART || op == ir.OMETHEXPR {
if op == ir.OCALLPART {
// Lookdot clobbers the opcode and type, undo that.
n.SetOp(op)
n.SetType(typ)

View File

@ -0,0 +1,22 @@
// 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 a
type T1 struct {
*T2
}
type T2 struct {
}
func (t2 *T2) M() {
}
func F() {
f(T1.M)
}
func f(f func(T1)) {
}

View File

@ -0,0 +1,11 @@
// 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 b
import "a"
func F() {
a.F()
}

View File

@ -0,0 +1,7 @@
// compiledir
// 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 ignored