From 5038ce82b628e195af703168422e139e7faf1485 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Sat, 30 Mar 2024 06:09:57 +0700 Subject: [PATCH] cmd/compile: add missing OASOP case in mayModifyPkgVar CL 395541 made staticopy safe, stop applying the optimization once seeing an expression that may modify global variables. However, it misses the case for OASOP expression, causing the static init mis-recognizes the modification and think it's safe. Fixing this by adding missing OASOP case. Fixes #66585 Change-Id: I603cec018d3b5a09825c14e1f066a0e16f8bde23 Cq-Include-Trybots: luci.golang.try:gotip-linux-amd64-longtest Reviewed-on: https://go-review.googlesource.com/c/go/+/575216 Reviewed-by: Keith Randall Reviewed-by: Keith Randall Reviewed-by: Than McIntosh LUCI-TryBot-Result: Go LUCI --- src/cmd/compile/internal/staticinit/sched.go | 6 +++++ test/fixedbugs/issue66585.go | 25 ++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 test/fixedbugs/issue66585.go diff --git a/src/cmd/compile/internal/staticinit/sched.go b/src/cmd/compile/internal/staticinit/sched.go index 1f119920e9..7317ed1fec 100644 --- a/src/cmd/compile/internal/staticinit/sched.go +++ b/src/cmd/compile/internal/staticinit/sched.go @@ -899,6 +899,12 @@ func mayModifyPkgVar(n ir.Node) bool { case ir.OAPPEND, ir.OCLEAR, ir.OCOPY: return true // could mutate a global array + case ir.OASOP: + n := n.(*ir.AssignOpStmt) + if !safeLHS(n.X) { + return true + } + case ir.OAS: n := n.(*ir.AssignStmt) if !safeLHS(n.X) { diff --git a/test/fixedbugs/issue66585.go b/test/fixedbugs/issue66585.go new file mode 100644 index 0000000000..fdadf59d63 --- /dev/null +++ b/test/fixedbugs/issue66585.go @@ -0,0 +1,25 @@ +// run + +// 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 main + +var x = 0 +var a = foo() +var b = x + +func foo() int { + x++ + return x +} + +func main() { + if a != 1 { + panic("unexpected a value") + } + if b != 1 { + panic("unexpected b value") + } +} -- 2.48.1