From 0bd7408f901f33c6f0a5a542f8de6bf17c901e79 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Wed, 4 May 2022 18:39:26 +0700 Subject: [PATCH] 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 Reviewed-by: Matthew Dempsky Reviewed-by: David Chase Run-TryBot: Cuong Manh Le --- src/cmd/compile/internal/walk/complit.go | 11 ++++++++++- test/fixedbugs/issue52673.go | 16 ++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/issue52673.go diff --git a/src/cmd/compile/internal/walk/complit.go b/src/cmd/compile/internal/walk/complit.go index df6d811d6242ce..748a53df33c0eb 100644 --- a/src/cmd/compile/internal/walk/complit.go +++ b/src/cmd/compile/internal/walk/complit.go @@ -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 } diff --git a/test/fixedbugs/issue52673.go b/test/fixedbugs/issue52673.go new file mode 100644 index 00000000000000..15403638932372 --- /dev/null +++ b/test/fixedbugs/issue52673.go @@ -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{}} + }() +}