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:
Cuong Manh Le 2022-05-04 18:39:26 +07:00
parent ed462a66a5
commit 0bd7408f90
2 changed files with 26 additions and 1 deletions

View file

@ -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
}

View 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{}}
}()
}