]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.typeparams] cmd/compile: fix case where we were copying a raw Node
authorDan Scales <danscales@google.com>
Sat, 22 May 2021 03:09:55 +0000 (20:09 -0700)
committerDan Scales <danscales@google.com>
Mon, 24 May 2021 16:01:17 +0000 (16:01 +0000)
Replace the raw Node copy with the creation of a new node, and the
copying of the needed flags and fields.

Change-Id: I636bf228ba28c0d5dc25f8366d82379d86ecd731
Reviewed-on: https://go-review.googlesource.com/c/go/+/322189
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Trust: Dan Scales <danscales@google.com>

src/cmd/compile/internal/inline/inl.go

index a6829e9835f3d35e4d873d64f7b89c703b821b45..bd453e40a5ed55f3ed769bb40abb5d412bbd598c 100644 (file)
@@ -1153,17 +1153,21 @@ func (subst *inlsubst) fields(oldt *types.Type) []*types.Field {
 // clovar creates a new ONAME node for a local variable or param of a closure
 // inside a function being inlined.
 func (subst *inlsubst) clovar(n *ir.Name) *ir.Name {
-       // TODO(danscales): want to get rid of this shallow copy, with code like the
-       // following, but it is hard to copy all the necessary flags in a maintainable way.
-       // m := ir.NewNameAt(n.Pos(), n.Sym())
-       // m.Class = n.Class
-       // m.SetType(n.Type())
-       // m.SetTypecheck(1)
-       //if n.IsClosureVar() {
-       //      m.SetIsClosureVar(true)
-       //}
-       m := &ir.Name{}
-       *m = *n
+       m := ir.NewNameAt(n.Pos(), n.Sym())
+       m.Class = n.Class
+       m.SetType(n.Type())
+       m.SetTypecheck(1)
+       if n.IsClosureVar() {
+               m.SetIsClosureVar(true)
+       }
+       if n.Addrtaken() {
+               m.SetAddrtaken(true)
+       }
+       if n.Used() {
+               m.SetUsed(true)
+       }
+       m.Defn = n.Defn
+
        m.Curfn = subst.newclofn
 
        switch defn := n.Defn.(type) {