mirror of
https://github.com/golang/go.git
synced 2025-05-05 23:53:05 +00:00
cmd/compile: fix static init of literal contains dynamic exprs
Fixes #52673 Change-Id: Ib2faa5a669c05778fc6beb38c3e63d558af9b2be Reviewed-on: https://go-review.googlesource.com/c/go/+/403995 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com> Reviewed-by: David Chase <drchase@google.com> Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
This commit is contained in:
parent
ed462a66a5
commit
0bd7408f90
@ -235,7 +235,16 @@ func fixedlit(ctxt initContext, kind initKind, n *ir.CompLitExpr, var_ ir.Node,
|
|||||||
case ir.OSLICELIT:
|
case ir.OSLICELIT:
|
||||||
value := value.(*ir.CompLitExpr)
|
value := value.(*ir.CompLitExpr)
|
||||||
if (kind == initKindStatic && ctxt == inNonInitFunction) || (kind == initKindDynamic && ctxt == inInitFunction) {
|
if (kind == initKindStatic && ctxt == inNonInitFunction) || (kind == initKindDynamic && ctxt == inInitFunction) {
|
||||||
slicelit(ctxt, value, a, init)
|
var sinit ir.Nodes
|
||||||
|
slicelit(ctxt, value, a, &sinit)
|
||||||
|
if kind == initKindStatic {
|
||||||
|
// When doing static initialization, init statements may contain dynamic
|
||||||
|
// expression, which will be initialized later, causing liveness analysis
|
||||||
|
// confuses about variables lifetime. So making sure those expressions
|
||||||
|
// are ordered correctly here. See issue #52673.
|
||||||
|
orderBlock(&sinit, map[string][]*ir.Name{})
|
||||||
|
}
|
||||||
|
init.Append(sinit...)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
16
test/fixedbugs/issue52673.go
Normal file
16
test/fixedbugs/issue52673.go
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
// compile
|
||||||
|
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
package p
|
||||||
|
|
||||||
|
func f() {
|
||||||
|
var x string
|
||||||
|
func() [10][]bool {
|
||||||
|
return [10][]bool{
|
||||||
|
[]bool{bool(x < "")},
|
||||||
|
[]bool{}, []bool{}, []bool{}, []bool{}}
|
||||||
|
}()
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user