]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: emit a symbol for a method expression when using -dynlink
authorIan Lance Taylor <iant@golang.org>
Sat, 8 Dec 2018 02:22:04 +0000 (18:22 -0800)
committerIan Lance Taylor <iant@golang.org>
Tue, 11 Dec 2018 03:20:37 +0000 (03:20 +0000)
Fixes #25065

Change-Id: Ia3db518cfd9c006caf951b51342a491ac8372e9c
Reviewed-on: https://go-review.googlesource.com/c/153297
Reviewed-by: Robert Griesemer <gri@golang.org>
misc/cgo/testshared/shared_test.go
misc/cgo/testshared/src/issue25065/a.go [new file with mode: 0644]
src/cmd/compile/internal/gc/typecheck.go

index c3c7a6aab6af47127d0ce604b311e12e5bfc119c..41a24efe22c0ed97cdb9f13cb99ad79dce9dc9a2 100644 (file)
@@ -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 (file)
index 0000000..979350f
--- /dev/null
@@ -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
+}
index 633c5e5061a5ac97557ba072f6acc999656cbe93..4fc1c5c73c582f3c361518d36b85b281ebc471d8 100644 (file)
@@ -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
 }