aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/reflectdata/reflect.go
diff options
context:
space:
mode:
authorCuong Manh Le <cuong@orijtech.com>2021-04-19 02:39:50 +0700
committerCuong Manh Le <cuong.manhle.vn@gmail.com>2021-04-19 04:37:32 +0000
commita72622d028077643169dc48c90271a82021f0534 (patch)
tree54362cfefeb1c190aea7ce205e5883f7b78d214c /src/cmd/compile/internal/reflectdata/reflect.go
parentc914e6160db8b6af358cad90ed7272ebc5c22dda (diff)
downloadgo-a72622d028077643169dc48c90271a82021f0534.tar.gz
go-a72622d028077643169dc48c90271a82021f0534.zip
cmd/compile: skip "_" function in reflectdata.MarkUsedIfaceMethod
CL 256798 added compiler ability to retain only used interface methods, by generating a mark relocation whenever an interface method is used. To do that, the compiler needs the current function linker object. However, for unnamed function "func _()", its linker object is nil, causes the compiler crashes for code in #45258. CL 283313 fixed the code in #45258 unintentionally, since when the compiler now does not walk unnamed functions anymore. This CL fixes the root issue, by making reflectdata.MarkUsedIfaceMethod skips unnamed functions, and also adding regression test. Fixes #45258 Change-Id: I4cbefb0a89d9928f70c00dc8a271cb61cd20a49c Reviewed-on: https://go-review.googlesource.com/c/go/+/311130 Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com> Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/reflectdata/reflect.go')
-rw-r--r--src/cmd/compile/internal/reflectdata/reflect.go4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/reflectdata/reflect.go b/src/cmd/compile/internal/reflectdata/reflect.go
index f0a60998a1..d23ca6b839 100644
--- a/src/cmd/compile/internal/reflectdata/reflect.go
+++ b/src/cmd/compile/internal/reflectdata/reflect.go
@@ -1837,6 +1837,10 @@ func MarkTypeUsedInInterface(t *types.Type, from *obj.LSym) {
// MarkUsedIfaceMethod marks that an interface method is used in the current
// function. n is OCALLINTER node.
func MarkUsedIfaceMethod(n *ir.CallExpr) {
+ // skip unnamed functions (func _())
+ if ir.CurFunc.LSym == nil {
+ return
+ }
dot := n.X.(*ir.SelectorExpr)
ityp := dot.X.Type()
tsym := TypeLinksym(ityp)