diff --git a/src/cmd/compile/internal/ssagen/ssa.go b/src/cmd/compile/internal/ssagen/ssa.go index 004806b029..6831da6908 100644 --- a/src/cmd/compile/internal/ssagen/ssa.go +++ b/src/cmd/compile/internal/ssagen/ssa.go @@ -7171,7 +7171,7 @@ func genssa(f *ssa.Func, pp *objw.Progs) { // This ensures that runtime.FuncForPC(uintptr(reflect.ValueOf(fn).Pointer())).Name() // returns the right answer. See issue 58300. for p := pp.Text; p != nil; p = p.Link { - if p.As == obj.AFUNCDATA || p.As == obj.APCDATA || p.As == obj.ATEXT { + if p.As == obj.AFUNCDATA || p.As == obj.APCDATA || p.As == obj.ATEXT || p.As == obj.ANOP { continue } if base.Ctxt.PosTable.Pos(p.Pos).Base().InliningIndex() >= 0 { diff --git a/test/fixedbugs/issue58300b.go b/test/fixedbugs/issue58300b.go new file mode 100644 index 0000000000..5192b3f0f4 --- /dev/null +++ b/test/fixedbugs/issue58300b.go @@ -0,0 +1,35 @@ +// run + +// Copyright 2023 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 main + +import ( + "reflect" + "runtime" +) + +type T struct { + a, b int +} + +func f(t *T) int { + if t != nil { + return t.b + } + return 0 +} + +func g(t *T) int { + return f(t) + 5 +} + +func main() { + x(f) + x(g) +} +func x(v any) { + println(runtime.FuncForPC(reflect.ValueOf(v).Pointer()).Name()) +} diff --git a/test/fixedbugs/issue58300b.out b/test/fixedbugs/issue58300b.out new file mode 100644 index 0000000000..f347287480 --- /dev/null +++ b/test/fixedbugs/issue58300b.out @@ -0,0 +1,2 @@ +main.f +main.g