mirror of
https://github.com/golang/go
synced 2024-11-23 10:50:09 -07:00
cmd/compile/internal/ir: prevent NewClosureVar misuse
NewClosureVar should only be called to capture locally declared variables in the enclosing function scope. This CL adds a check to make sure it's used that way, in particular to make sure it's not called to capture global variables. This came up because for generic method values, we desugar the method value into a function literal that captures the receiver value after evaluating it. However, due to compiler backend limitations, for package-scope generic method values we spill the receiver value into a global variable rather than capturing it normally. To prevent confusing backend issues when misusing NewClosureVar with global variables, this CL adds an extra check. Change-Id: I80f0f083dc80f70c7f0298020efe56dba00b67d7 Reviewed-on: https://go-review.googlesource.com/c/go/+/422195 Reviewed-by: Than McIntosh <thanm@google.com> Run-TryBot: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
b911771f12
commit
bd901af30b
@ -336,6 +336,14 @@ func (n *Name) Byval() bool {
|
|||||||
// NewClosureVar returns a new closure variable for fn to refer to
|
// NewClosureVar returns a new closure variable for fn to refer to
|
||||||
// outer variable n.
|
// outer variable n.
|
||||||
func NewClosureVar(pos src.XPos, fn *Func, n *Name) *Name {
|
func NewClosureVar(pos src.XPos, fn *Func, n *Name) *Name {
|
||||||
|
switch n.Class {
|
||||||
|
case PAUTO, PPARAM, PPARAMOUT, PAUTOHEAP:
|
||||||
|
// ok
|
||||||
|
default:
|
||||||
|
// Prevent mistaken capture of global variables.
|
||||||
|
base.Fatalf("NewClosureVar: %+v", n)
|
||||||
|
}
|
||||||
|
|
||||||
c := NewNameAt(pos, n.Sym())
|
c := NewNameAt(pos, n.Sym())
|
||||||
c.Curfn = fn
|
c.Curfn = fn
|
||||||
c.Class = PAUTOHEAP
|
c.Class = PAUTOHEAP
|
||||||
|
Loading…
Reference in New Issue
Block a user