mirror of
https://github.com/golang/go
synced 2024-11-19 07:54:43 -07:00
cmd/compile: fix varexpr handling of ODOT
For a long time varexpr has handled ODOT incorrectly: it has always returned false. Before https://golang.org/cl/20890 this has been because an ODOT had a Right field with an ONAME with no Class, for which varexpr returns false. CL 20890 preserved the behavior of varexpr for ODOT, so that the change would pass toolstash -cmp. This CL fixes varexpr so that ODOT can return true in some cases. This breaks toolstash -cmp. While the changed compiler allocates temporary variables in a different order, I have not been able to find any examples where the generated code is different, other than using different stack offsets and, in some cases, registers. It seems that other parts of the compiler will force the ODOT into a temporary anyhow. Still, this change is clearly correct, and is a minor compiler cleanup. Change-Id: I71506877aa3c13966bb03c281aa16271ee7fe80a Reviewed-on: https://go-review.googlesource.com/20907 Run-TryBot: Ian Lance Taylor <iant@golang.org> Reviewed-by: David Crawshaw <crawshaw@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
93098de0cc
commit
a9407b5797
@ -2487,10 +2487,7 @@ func varexpr(n *Node) bool {
|
||||
return varexpr(n.Left) && varexpr(n.Right)
|
||||
|
||||
case ODOT: // but not ODOTPTR
|
||||
// The original code always returned false for ODOT,
|
||||
// because n.Right would be an ONAME with n.Class not set.
|
||||
// TODO(iant): Fix this to remove "&& false".
|
||||
return varexpr(n.Left) && false
|
||||
return varexpr(n.Left)
|
||||
}
|
||||
|
||||
// Be conservative.
|
||||
|
Loading…
Reference in New Issue
Block a user