diff --git a/src/cmd/compile/internal/typecheck/iexport.go b/src/cmd/compile/internal/typecheck/iexport.go index 8f8931e495..911d758083 100644 --- a/src/cmd/compile/internal/typecheck/iexport.go +++ b/src/cmd/compile/internal/typecheck/iexport.go @@ -1591,17 +1591,10 @@ func (w *exportWriter) expr(n ir.Node) { w.exoticSelector(n.Sel) if go117ExportTypes { w.exoticType(n.Type()) - if n.Op() == ir.ODOT || n.Op() == ir.ODOTPTR || n.Op() == ir.ODOTINTER || n.Op() == ir.OMETHEXPR { + if n.Op() == ir.ODOT || n.Op() == ir.ODOTPTR || n.Op() == ir.ODOTINTER { w.exoticParam(n.Selection) - if n.Op() == ir.OMETHEXPR { - name := ir.MethodExprName(n) - w.bool(name != nil) - if name != nil { - w.exoticType(name.Type()) - } - } } - // n.Selection is not required for ODOTMETH and OCALLPART. It will + // n.Selection is not required for OMETHEXPR, ODOTMETH, and OCALLPART. It will // be reconstructed during import. } diff --git a/src/cmd/compile/internal/typecheck/iimport.go b/src/cmd/compile/internal/typecheck/iimport.go index 42c4619666..c55e3fbe2a 100644 --- a/src/cmd/compile/internal/typecheck/iimport.go +++ b/src/cmd/compile/internal/typecheck/iimport.go @@ -1197,23 +1197,17 @@ func (r *importReader) node() ir.Node { pos := r.pos() expr := r.expr() sel := r.exoticSelector() - n := ir.NewSelectorExpr(pos, ir.OXDOT, expr, sel) - n.SetOp(op) + n := ir.NewSelectorExpr(pos, op, expr, sel) n.SetType(r.exoticType()) switch op { - case ir.ODOT, ir.ODOTPTR, ir.ODOTINTER, ir.OMETHEXPR: + case ir.ODOT, ir.ODOTPTR, ir.ODOTINTER: n.Selection = r.exoticParam() - if op == ir.OMETHEXPR { - if r.bool() { // has name - ir.MethodExprName(n).SetType(r.exoticType()) - } - } - case ir.ODOTMETH, ir.OCALLPART: + case ir.ODOTMETH, ir.OCALLPART, ir.OMETHEXPR: // 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 { + if op == ir.OCALLPART || op == ir.OMETHEXPR { // Lookdot clobbers the opcode and type, undo that. n.SetOp(op) n.SetType(typ) diff --git a/test/fixedbugs/issue45503.dir/a.go b/test/fixedbugs/issue45503.dir/a.go new file mode 100644 index 0000000000..b45835bd85 --- /dev/null +++ b/test/fixedbugs/issue45503.dir/a.go @@ -0,0 +1,15 @@ +// 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 S struct{} + +func (s *S) M() { + s.m((*S).N) +} + +func (s *S) N() {} + +func (s *S) m(func(*S)) {} diff --git a/test/fixedbugs/issue45503.dir/b.go b/test/fixedbugs/issue45503.dir/b.go new file mode 100644 index 0000000000..df4877a882 --- /dev/null +++ b/test/fixedbugs/issue45503.dir/b.go @@ -0,0 +1,12 @@ +// 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() { + s := a.S{} + s.M() +} diff --git a/test/fixedbugs/issue45503.go b/test/fixedbugs/issue45503.go new file mode 100644 index 0000000000..ab3b901145 --- /dev/null +++ b/test/fixedbugs/issue45503.go @@ -0,0 +1,10 @@ +// 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. + +// This test exercises exporting + importing method +// expressions for use when inlining. + +package ignored