]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: avoid an assignment of n.Type in walk
authorJosh Bleecher Snyder <josharian@gmail.com>
Fri, 24 Mar 2017 20:30:19 +0000 (13:30 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Fri, 24 Mar 2017 22:19:02 +0000 (22:19 +0000)
In the future, walk will probably run concurrently
with SSA construction. It is possible for walk
to be walking a function node that is referred
to by another function undergoing SSA construction.
In that case, this particular assignment to n.Type
is race-y.

This assignment is also not necessary;
evconst does not change the type of n.
Both arguments to evconst must have the same type,
and at the end of evconst, n is replaced with n.Left.

Remove the assignment, and add a check to ensure
that its removal remains correct.

Updates #15756

Change-Id: Id95faaff42d5abd76be56445d1d3e285775de8bf
Reviewed-on: https://go-review.googlesource.com/38609
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/gc/walk.go

index 4dca20ef3bbebd4a62c0666cbe5213eb0e34a5d5..32e5be1be2c2fb800de4260e43dc38def3051d76 100644 (file)
@@ -1614,9 +1614,10 @@ opswitch:
        // walk of y%1 may have replaced it by 0.
        // Check whether n with its updated args is itself now a constant.
        t := n.Type
-
        evconst(n)
-       n.Type = t
+       if n.Type != t {
+               Fatalf("evconst changed Type: %v had type %v, now %v", n, t, n.Type)
+       }
        if n.Op == OLITERAL {
                n = typecheck(n, Erv)
        }