Commit 1ac3b061 authored by Ian Lance Taylor's avatar Ian Lance Taylor

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/153297Reviewed-by: 's avatarRobert Griesemer <gri@golang.org>
parent 56b70d98
......@@ -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")
}
// 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
}
......@@ -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
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment