mirror of
https://github.com/golang/go
synced 2024-11-26 07:27:59 -07:00
cmd/compile: repaired loop-finder to handle trickier nesting
The loop-A-encloses-loop-C code did not properly handle the case where really C was already known to be enclosed by B, and A was nearest-outer to B, not C. Fixes #19217. Change-Id: I755dd768e823cb707abdc5302fed39c11cdb34d4 Reviewed-on: https://go-review.googlesource.com/37340 Run-TryBot: David Chase <drchase@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
parent
8ca68c3fec
commit
abdb2c35b6
@ -33,15 +33,26 @@ type loop struct {
|
||||
|
||||
// outerinner records that outer contains inner
|
||||
func (sdom SparseTree) outerinner(outer, inner *loop) {
|
||||
// There could be other outer loops found in some random order,
|
||||
// locate the new outer loop appropriately among them.
|
||||
oldouter := inner.outer
|
||||
if oldouter == nil || sdom.isAncestorEq(oldouter.header, outer.header) {
|
||||
for oldouter != nil && sdom.isAncestor(outer.header, oldouter.header) {
|
||||
inner = oldouter
|
||||
oldouter = inner.outer
|
||||
}
|
||||
if outer == oldouter {
|
||||
return
|
||||
}
|
||||
if oldouter != nil {
|
||||
outer.outer = oldouter
|
||||
}
|
||||
|
||||
inner.outer = outer
|
||||
outer.isInner = false
|
||||
if inner.containsCall {
|
||||
outer.setContainsCall()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (l *loop) setContainsCall() {
|
||||
for ; l != nil && !l.containsCall; l = l.outer {
|
||||
|
39
test/fixedbugs/issue19217.go
Normal file
39
test/fixedbugs/issue19217.go
Normal file
@ -0,0 +1,39 @@
|
||||
// compile
|
||||
|
||||
// Copyright 2017 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 foo
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
)
|
||||
|
||||
type DbBuilder struct {
|
||||
arr []int
|
||||
}
|
||||
|
||||
func (bld *DbBuilder) Finish() error {
|
||||
defer bld.Finish()
|
||||
|
||||
var hash []byte
|
||||
for _, ixw := range bld.arr {
|
||||
for {
|
||||
if ixw != 0 {
|
||||
panic("ixw != 0")
|
||||
}
|
||||
ixw--
|
||||
insertOne:
|
||||
for {
|
||||
for i := 0; i < 1; i++ {
|
||||
if binary.LittleEndian.Uint16(hash[i:]) == 0 {
|
||||
break insertOne
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
Loading…
Reference in New Issue
Block a user