mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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 <gri@golang.org>
This commit is contained in:
parent
56b70d98f5
commit
1ac3b06181
3 changed files with 32 additions and 0 deletions
|
|
@ -911,3 +911,9 @@ func TestGlobal(t *testing.T) {
|
||||||
func TestTestInstalledShared(t *testing.T) {
|
func TestTestInstalledShared(t *testing.T) {
|
||||||
goCmd(nil, "test", "-linkshared", "-test.short", "sync/atomic")
|
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")
|
||||||
|
}
|
||||||
|
|
|
||||||
20
misc/cgo/testshared/src/issue25065/a.go
Normal file
20
misc/cgo/testshared/src/issue25065/a.go
Normal file
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -2514,6 +2514,12 @@ func typecheckMethodExpr(n *Node) (res *Node) {
|
||||||
n.Xoffset = 0
|
n.Xoffset = 0
|
||||||
n.SetClass(PFUNC)
|
n.SetClass(PFUNC)
|
||||||
// methodSym already marked n.Sym as a function.
|
// 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
|
return n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue