mirror of
https://github.com/golang/go
synced 2024-11-22 09:14:40 -07:00
cmd/compile: keep all open-coded defer slots as used
Open-coded defer slots are assigned indices upfront, so they're logically like elements in an array. Without reassigning the indices, we need to keep all of the elements alive so their relative offsets are correct. Fixes #61895. Change-Id: Ie0191fdb33276f4e8ed0becb69086524fff022b2 Reviewed-on: https://go-review.googlesource.com/c/go/+/517856 Reviewed-by: Keith Randall <khr@google.com> Reviewed-by: Keith Randall <khr@golang.org> Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
d32b4798f8
commit
8c5a54f698
@ -121,6 +121,14 @@ func (s *ssafn) AllocFrame(f *ssa.Func) {
|
||||
|
||||
// Mark the PAUTO's unused.
|
||||
for _, ln := range fn.Dcl {
|
||||
if ln.OpenDeferSlot() {
|
||||
// Open-coded defer slots have indices that were assigned
|
||||
// upfront during SSA construction, but the defer statement can
|
||||
// later get removed during deadcode elimination (#61895). To
|
||||
// keep their relative offsets correct, treat them all as used.
|
||||
continue
|
||||
}
|
||||
|
||||
if needAlloc(ln) {
|
||||
ln.SetUsed(false)
|
||||
}
|
||||
|
15
test/fixedbugs/issue61895.go
Normal file
15
test/fixedbugs/issue61895.go
Normal file
@ -0,0 +1,15 @@
|
||||
// compile
|
||||
|
||||
// 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
|
||||
|
||||
func main() {
|
||||
for {
|
||||
}
|
||||
|
||||
defer func() {}()
|
||||
defer func() {}()
|
||||
}
|
Loading…
Reference in New Issue
Block a user