]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.18] cmd/compile: use AutogeneratedPos for method value wrapper
authorCherry Mui <cherryyz@google.com>
Tue, 1 Mar 2022 17:02:38 +0000 (12:02 -0500)
committerDmitri Shuralyov <dmitshur@golang.org>
Fri, 4 Mar 2022 20:35:59 +0000 (20:35 +0000)
We use AutogeneratedPos for most compiler-generated functions. But
for method value wrappers we currently don't. Instead, we use the
Pos for their (direct) declaration if there is one, otherwise
not set it in methodValueWrapper, which will probably cause it to
inherit from the caller, i.e. the Pos of that method value
expression. If that Pos has inline information, it will cause the
method wrapper to have bogus inline information, which could lead
to infinite loop when printing a stack trace.

Change it to use AutogeneratedPos instead.

Fixes #51401.

Change-Id: I398dfe85f9f875e1fd82dc2f489dab63ada6570d
Reviewed-on: https://go-review.googlesource.com/c/go/+/388794
Trust: Cherry Mui <cherryyz@google.com>
Run-TryBot: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
(cherry picked from commit b0db2f00a0d540c3d3f5d14433da2e3e1ad41f9f)
Reviewed-on: https://go-review.googlesource.com/c/go/+/388918
Trust: Dmitri Shuralyov <dmitshur@golang.org>
Run-TryBot: Dmitri Shuralyov <dmitshur@golang.org>

src/cmd/compile/internal/walk/closure.go
test/fixedbugs/issue51401.go [new file with mode: 0644]

index 4d1c5621fec857fe3a9487bf9da3c422367e08d5..cd922c98c46e8d58de0f479feb90e869637ed337 100644 (file)
@@ -235,15 +235,7 @@ func methodValueWrapper(dot *ir.SelectorExpr) *ir.Name {
        saveLineNo := base.Pos
        ir.CurFunc = nil
 
-       // Set line number equal to the line number where the method is declared.
-       if pos := dot.Selection.Pos; pos.IsKnown() {
-               base.Pos = pos
-       }
-       // Note: !dot.Selection.Pos.IsKnown() happens for method expressions where
-       // the method is implicitly declared. The Error method of the
-       // built-in error type is one such method.  We leave the line
-       // number at the use of the method expression in this
-       // case. See issue 29389.
+       base.Pos = base.AutogeneratedPos
 
        tfn := ir.NewFuncType(base.Pos, nil,
                typecheck.NewFuncParams(t0.Params(), true),
diff --git a/test/fixedbugs/issue51401.go b/test/fixedbugs/issue51401.go
new file mode 100644 (file)
index 0000000..1e8e0d0
--- /dev/null
@@ -0,0 +1,44 @@
+// run
+
+// Copyright 2022 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.
+
+// Issue 51401: bad inline info in generated interface method wrapper
+// causes infinite loop in stack unwinding.
+
+package main
+
+import "runtime"
+
+type Outer interface{ Inner }
+
+type impl struct{}
+
+func New() Outer { return &impl{} }
+
+type Inner interface {
+       DoStuff() error
+}
+
+func (a *impl) DoStuff() error {
+       return newError()
+}
+
+func newError() error {
+       stack := make([]uintptr, 50)
+       runtime.Callers(2, stack[:])
+
+       return nil
+}
+
+func main() {
+       funcs := listFuncs(New())
+       for _, f := range funcs {
+               f()
+       }
+}
+
+func listFuncs(outer Outer) []func() error {
+       return []func() error{outer.DoStuff}
+}