Commit 26be4b91 authored by Josh Bleecher Snyder's avatar Josh Bleecher Snyder

cmd/compile: avoid an assignment of n.Type in walk

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: default avatarBrad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 5e954047
...@@ -1614,9 +1614,10 @@ opswitch: ...@@ -1614,9 +1614,10 @@ opswitch:
// walk of y%1 may have replaced it by 0. // walk of y%1 may have replaced it by 0.
// Check whether n with its updated args is itself now a constant. // Check whether n with its updated args is itself now a constant.
t := n.Type t := n.Type
evconst(n) 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 { if n.Op == OLITERAL {
n = typecheck(n, Erv) n = typecheck(n, Erv)
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment