mirror of
https://github.com/golang/go.git
synced 2025-05-05 15:43:04 +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:
|
||||
value := value.(*ir.CompLitExpr)
|
||||
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
|
||||
}
|
||||
|
||||
|
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