From 1ac3b0618170279474fcdf9c625b2e237bf2881c Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 7 Dec 2018 18:22:04 -0800 Subject: [PATCH] cmd/compile: emit a symbol for a method expression when using -dynlink Fixes #25065 Change-Id: Ia3db518cfd9c006caf951b51342a491ac8372e9c Reviewed-on: https://go-review.googlesource.com/c/153297 Reviewed-by: Robert Griesemer --- misc/cgo/testshared/shared_test.go | 6 ++++++ misc/cgo/testshared/src/issue25065/a.go | 20 ++++++++++++++++++++ src/cmd/compile/internal/gc/typecheck.go | 6 ++++++ 3 files changed, 32 insertions(+) create mode 100644 misc/cgo/testshared/src/issue25065/a.go diff --git a/misc/cgo/testshared/shared_test.go b/misc/cgo/testshared/shared_test.go index c3c7a6aab6..41a24efe22 100644 --- a/misc/cgo/testshared/shared_test.go +++ b/misc/cgo/testshared/shared_test.go @@ -911,3 +911,9 @@ func TestGlobal(t *testing.T) { func TestTestInstalledShared(t *testing.T) { goCmd(nil, "test", "-linkshared", "-test.short", "sync/atomic") } + +// Test generated pointer method with -linkshared. +// Issue 25065. +func TestGeneratedMethod(t *testing.T) { + goCmd(t, "install", "-buildmode=shared", "-linkshared", "issue25065") +} diff --git a/misc/cgo/testshared/src/issue25065/a.go b/misc/cgo/testshared/src/issue25065/a.go new file mode 100644 index 0000000000..979350ff24 --- /dev/null +++ b/misc/cgo/testshared/src/issue25065/a.go @@ -0,0 +1,20 @@ +// Copyright 2018 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 issue25065 has a type with a method that is +// 1) referenced in a method expression +// 2) not called +// 3) not converted to an interface +// 4) is a value method but the reference is to the pointer method +// These cases avoid the call to makefuncsym from typecheckfunc, but we +// still need to call makefuncsym somehow or the symbol will not be defined. +package issue25065 + +type T int + +func (t T) M() {} + +func F() func(*T) { + return (*T).M +} diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 633c5e5061..4fc1c5c73c 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -2514,6 +2514,12 @@ func typecheckMethodExpr(n *Node) (res *Node) { n.Xoffset = 0 n.SetClass(PFUNC) // methodSym already marked n.Sym as a function. + + // Issue 25065. Make sure that we emit the symbol for a local method. + if Ctxt.Flag_dynlink && !inimport && (t.Sym == nil || t.Sym.Pkg == localpkg) { + makefuncsym(n.Sym) + } + return n } -- 2.50.0