From 6d8ba77896d05720e1cb1728c27db60926e672b5 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Tue, 13 Apr 2021 16:31:56 -0700 Subject: [PATCH] cmd/compile: fix importing of method expressions For OMETHEXPR, the Name in the Selection needs to be properly linked up to the method declaration. Use the same code we already have for ODOTMETH and OCALLPART to do that. Fixes #45503 Change-Id: I7d6f886d606bae6faad8c104f50c177f871d41c8 Reviewed-on: https://go-review.googlesource.com/c/go/+/309831 Trust: Keith Randall Run-TryBot: Keith Randall TryBot-Result: Go Bot Reviewed-by: Cuong Manh Le Reviewed-by: Dan Scales --- src/cmd/compile/internal/typecheck/iexport.go | 11 ++--------- src/cmd/compile/internal/typecheck/iimport.go | 14 ++++---------- test/fixedbugs/issue45503.dir/a.go | 15 +++++++++++++++ test/fixedbugs/issue45503.dir/b.go | 12 ++++++++++++ test/fixedbugs/issue45503.go | 10 ++++++++++ 5 files changed, 43 insertions(+), 19 deletions(-) create mode 100644 test/fixedbugs/issue45503.dir/a.go create mode 100644 test/fixedbugs/issue45503.dir/b.go create mode 100644 test/fixedbugs/issue45503.go 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