cmd/compile: check ODEREF for safe lhs in assignment during static init

For #66585

Change-Id: Iddc407e3ef4c3b6ecf5173963b66b3e65e43c92d
Reviewed-on: https://go-review.googlesource.com/c/go/+/575336
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Keith Randall <khr@golang.org>
Auto-Submit: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
This commit is contained in:
Cuong Manh Le 2024-03-30 17:35:46 +07:00 committed by Gopher Robot
parent 94dba61276
commit 973befe714
2 changed files with 31 additions and 1 deletions

View File

@ -881,7 +881,13 @@ func mayModifyPkgVar(n ir.Node) bool {
// safeLHS reports whether the assigned-to variable lhs is either a
// local variable or a global from another package.
safeLHS := func(lhs ir.Node) bool {
v, ok := ir.OuterValue(lhs).(*ir.Name)
outer := ir.OuterValue(lhs)
// "*p = ..." should be safe if p is a local variable.
// TODO: Should ir.OuterValue handle this?
for outer.Op() == ir.ODEREF {
outer = outer.(*ir.StarExpr).X
}
v, ok := outer.(*ir.Name)
return ok && v.Op() == ir.ONAME && !(v.Class == ir.PEXTERN && v.Sym().Pkg == types.LocalPkg)
}

View File

@ -0,0 +1,24 @@
// asmcheck
// Copyright 2024 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
var x = func() int {
n := 0
f(&n)
return n
}()
func f(p *int) {
*p = 1
}
var y = 1
// z can be static initialized.
//
// amd64:-"MOVQ"
var z = y