mirror of
https://github.com/golang/go
synced 2024-10-14 20:05:36 +00:00
cmd/compile: don't deadcode eliminate labels
Dead-code eliminating labels is tricky because there might be gotos that can still reach them. Bug probably introduced with CL 91056 Fixes #28616 Change-Id: I6680465134e3486dcb658896f5172606cc51b104 Reviewed-on: https://go-review.googlesource.com/c/147817 Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Iskander Sharipov <iskander.sharipov@intel.com>
This commit is contained in:
parent
8b4692096b
commit
95a4f793c0
|
@ -4084,6 +4084,12 @@ func deadcode(fn *Node) {
|
|||
}
|
||||
|
||||
func deadcodeslice(nn Nodes) {
|
||||
var lastLabel = -1
|
||||
for i, n := range nn.Slice() {
|
||||
if n != nil && n.Op == OLABEL {
|
||||
lastLabel = i
|
||||
}
|
||||
}
|
||||
for i, n := range nn.Slice() {
|
||||
// Cut is set to true when all nodes after i'th position
|
||||
// should be removed.
|
||||
|
@ -4106,10 +4112,14 @@ func deadcodeslice(nn Nodes) {
|
|||
// If "then" or "else" branch ends with panic or return statement,
|
||||
// it is safe to remove all statements after this node.
|
||||
// isterminating is not used to avoid goto-related complications.
|
||||
// We must be careful not to deadcode-remove labels, as they
|
||||
// might be the target of a goto. See issue 28616.
|
||||
if body := body.Slice(); len(body) != 0 {
|
||||
switch body[(len(body) - 1)].Op {
|
||||
case ORETURN, ORETJMP, OPANIC:
|
||||
cut = true
|
||||
if i > lastLabel {
|
||||
cut = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
25
test/fixedbugs/issue28616.go
Normal file
25
test/fixedbugs/issue28616.go
Normal file
|
@ -0,0 +1,25 @@
|
|||
// compile
|
||||
|
||||
// Copyright 2018 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.
|
||||
|
||||
// Make sure we don't dead code eliminate a label.
|
||||
|
||||
package p
|
||||
|
||||
var i int
|
||||
|
||||
func f() {
|
||||
|
||||
if true {
|
||||
|
||||
if i == 1 {
|
||||
goto label
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
label:
|
||||
}
|
Loading…
Reference in a new issue