diff --git a/src/cmd/compile/internal/typecheck/iimport.go b/src/cmd/compile/internal/typecheck/iimport.go index 45bf2563aa6..7855702b020 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 00000000000..2bb879d557e --- /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 00000000000..221f2dde2a0 --- /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 00000000000..b83fbd7af16 --- /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