From 62ba72b35321bd76de18aa8874b021ee02ab8a4e Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Wed, 1 Sep 2021 00:18:13 +0700 Subject: [PATCH] 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 #48088 Change-Id: Ia244d36a3ed0f989735eb57becdfa70a81912f57 Reviewed-on: https://go-review.googlesource.com/c/go/+/346489 Trust: Cuong Manh Le Run-TryBot: Cuong Manh Le TryBot-Result: Go Bot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/typecheck/iimport.go | 6 +++-- test/fixedbugs/issue48088.dir/a.go | 22 +++++++++++++++++++ test/fixedbugs/issue48088.dir/b.go | 11 ++++++++++ test/fixedbugs/issue48088.go | 7 ++++++ 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 test/fixedbugs/issue48088.dir/a.go create mode 100644 test/fixedbugs/issue48088.dir/b.go create mode 100644 test/fixedbugs/issue48088.go diff --git a/src/cmd/compile/internal/typecheck/iimport.go b/src/cmd/compile/internal/typecheck/iimport.go index 45bf2563aa..7855702b02 100644 --- a/src/cmd/compile/internal/typecheck/iimport.go +++ b/src/cmd/compile/internal/typecheck/iimport.go @@ -1408,12 +1408,14 @@ func (r *importReader) node() ir.Node { } case ir.ODOT, ir.ODOTPTR, ir.ODOTINTER: n.Selection = r.exoticField() - case ir.ODOTMETH, ir.OMETHVALUE, ir.OMETHEXPR: + case ir.OMETHEXPR: + n = typecheckMethodExpr(n).(*ir.SelectorExpr) + case ir.ODOTMETH, ir.OMETHVALUE: // 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.OMETHVALUE || op == ir.OMETHEXPR { + if op == ir.OMETHVALUE { // Lookdot clobbers the opcode and type, undo that. n.SetOp(op) n.SetType(typ) diff --git a/test/fixedbugs/issue48088.dir/a.go b/test/fixedbugs/issue48088.dir/a.go new file mode 100644 index 0000000000..2bb879d557 --- /dev/null +++ b/test/fixedbugs/issue48088.dir/a.go @@ -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)) { +} diff --git a/test/fixedbugs/issue48088.dir/b.go b/test/fixedbugs/issue48088.dir/b.go new file mode 100644 index 0000000000..221f2dde2a --- /dev/null +++ b/test/fixedbugs/issue48088.dir/b.go @@ -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() +} diff --git a/test/fixedbugs/issue48088.go b/test/fixedbugs/issue48088.go new file mode 100644 index 0000000000..b83fbd7af1 --- /dev/null +++ b/test/fixedbugs/issue48088.go @@ -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