]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.typeparams] cmd/compile: avoid ir.DeepCopy in noder.constDecl
authorMatthew Dempsky <mdempsky@google.com>
Sat, 12 Jun 2021 01:51:56 +0000 (18:51 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Sat, 12 Jun 2021 13:53:06 +0000 (13:53 +0000)
Instead of using ir.DeepCopy to copy the IR from the previous constant
declaration, just call exprList again and then fix up the position
information. This is equivalent in practice, but has cleaner semantics
for tricky corner cases like constant declarations that contain
function literals.

In particular, this refactoring is necessary for the next CL that
cleans up function literal construction, because it adds extra
consistency checks that weren't satisfied by DeepCopy'd OCLOSUREs.

Change-Id: I0372bde5d6613695ee572cc8bf8fb4ff9aef4cb4
Reviewed-on: https://go-review.googlesource.com/c/go/+/327449
Trust: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
src/cmd/compile/internal/noder/noder.go

index 08c05a69bea70b3d57ee204b42cc107ebe2f0277..9dc05182d13f02306d1a13e5e716acb4fbb4ef4b 100644 (file)
@@ -450,7 +450,7 @@ func (p *noder) varDecl(decl *syntax.VarDecl) []ir.Node {
 type constState struct {
        group  *syntax.Group
        typ    ir.Ntype
-       values []ir.Node
+       values syntax.Expr
        iota   int64
 }
 
@@ -468,16 +468,15 @@ func (p *noder) constDecl(decl *syntax.ConstDecl, cs *constState) []ir.Node {
        names := p.declNames(ir.OLITERAL, decl.NameList)
        typ := p.typeExprOrNil(decl.Type)
 
-       var values []ir.Node
        if decl.Values != nil {
-               values = p.exprList(decl.Values)
-               cs.typ, cs.values = typ, values
+               cs.typ, cs.values = typ, decl.Values
        } else {
                if typ != nil {
                        base.Errorf("const declaration cannot have type without expression")
                }
-               typ, values = cs.typ, cs.values
+               typ = cs.typ
        }
+       values := p.exprList(cs.values)
 
        nn := make([]ir.Node, 0, len(names))
        for i, n := range names {
@@ -485,10 +484,16 @@ func (p *noder) constDecl(decl *syntax.ConstDecl, cs *constState) []ir.Node {
                        base.Errorf("missing value in const declaration")
                        break
                }
+
                v := values[i]
                if decl.Values == nil {
-                       v = ir.DeepCopy(n.Pos(), v)
+                       ir.Visit(v, func(v ir.Node) {
+                               if ir.HasUniquePos(v) {
+                                       v.SetPos(n.Pos())
+                               }
+                       })
                }
+
                typecheck.Declare(n, typecheck.DeclContext)
 
                n.Ntype = typ