mirror of
https://github.com/golang/go.git
synced 2026-01-29 07:02:05 +03:00
cmd/compile/internal/staticinit: fix bug in global new(expr)
The StaticInit pass asserts that the operand of &v is a global, but this is not so for the &autotemp desugaring of new(expr). (The variable has by that point escaped to the heap, so the object code calls runtime.newobject. A future optimization would be to statically allocate the variable when it is safe and advantageous to do so.) Thanks to khr for suggesting the fix. + static test Fixes #77237 Change-Id: I71b34a1353fe0f3e297beab9851f8f87d765d8f1 Reviewed-on: https://go-review.googlesource.com/c/go/+/737680 Reviewed-by: Keith Randall <khr@golang.org> Reviewed-by: Keith Randall <khr@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
@@ -228,6 +228,9 @@ func (s *Schedule) staticcopy(l *ir.Name, loff int64, rn *ir.Name, typ *types.Ty
|
||||
case ir.OADDR:
|
||||
r := r.(*ir.AddrExpr)
|
||||
if a, ok := r.X.(*ir.Name); ok && a.Op() == ir.ONAME {
|
||||
if a.Class != ir.PEXTERN {
|
||||
return false // e.g. local from new(expr)
|
||||
}
|
||||
staticdata.InitAddr(l, loff, staticdata.GlobalLinksym(a))
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -37,3 +37,10 @@ func main() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Regression test for ICE in staticdata.GlobalLinksym from
|
||||
// use of autotemp outside a function (go.dev/issue/77237).
|
||||
var (
|
||||
x = new(0)
|
||||
y = x
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user