mirror of https://github.com/golang/go.git
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:
parent
94dba61276
commit
973befe714
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
Loading…
Reference in New Issue