From 26be4b9113e9c4f14399388652e961137658b6cb Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Fri, 24 Mar 2017 13:30:19 -0700 Subject: [PATCH] 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 Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/walk.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 4dca20ef3b..32e5be1be2 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -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) }