1
0
mirror of https://github.com/golang/go synced 2024-09-23 17:20:13 -06:00

cmd/compile: do not substitute OGOTO inside a closure when inlining

The inlsubst already does the same thing for OLABEL, so we must do the
same thing for OGOTO. Otherwise, new inlined OGOTO node will be
associated with non-existed label.

Fixes #45947

Change-Id: I40eef095f57fd3438c38a0b5d9751d5d7ebf759e
Reviewed-on: https://go-review.googlesource.com/c/go/+/316931
Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Trust: Dan Scales <danscales@google.com>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Dan Scales <danscales@google.com>
This commit is contained in:
Cuong Manh Le 2021-05-05 09:23:52 +07:00
parent d0583b131a
commit 95dde3f029
2 changed files with 20 additions and 0 deletions

View File

@ -1394,6 +1394,10 @@ func (subst *inlsubst) node(n ir.Node) ir.Node {
return ir.NewBlockStmt(base.Pos, init) return ir.NewBlockStmt(base.Pos, init)
case ir.OGOTO: case ir.OGOTO:
if subst.newclofn != nil {
// Don't do special substitutions if inside a closure
break
}
n := n.(*ir.BranchStmt) n := n.(*ir.BranchStmt)
m := ir.Copy(n).(*ir.BranchStmt) m := ir.Copy(n).(*ir.BranchStmt)
m.SetPos(subst.updatedPos(m.Pos())) m.SetPos(subst.updatedPos(m.Pos()))

View File

@ -0,0 +1,16 @@
// compile
// Copyright 2021 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 p
func f() {
_ = func() func() {
return func() {
l:
goto l
}
}()
}