diff options
author | Russ Cox <rsc@golang.org> | 2014-05-28 19:50:19 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2014-05-28 19:50:19 -0400 |
commit | 73044738e146bec259f7b8e89ecc816a421921aa (patch) | |
tree | 181e98d4a3bba678b89ab4f80452cf58daaeed13 /test/live.go | |
parent | 76fe11c57b2efe4c1ffb53730efadcd928e976c2 (diff) | |
download | go-73044738e146bec259f7b8e89ecc816a421921aa.tar.gz |
cmd/gc: fix x=x crash
The 'nodarg' function is used to obtain a Node*
representing a function argument or result.
It returned a brand new Node*, but that violates
the guarantee in most places in the compiler that
two Node*s refer to the same variable if and only if
they are the same Node* pointer. Reestablish that
invariant by making nodarg return a preexisting
named variable if present.
Having fixed that, avoid any copy during x=x in
componentgen, because the VARDEF we emit
before the copy marks the lhs x as dead incorrectly.
The change in walk.c avoids modifying the result
of nodarg. This was the only place in the compiler
that did so.
Fixes issue 8097.
LGTM=r, khr
R=golang-codereviews, r, khr
CC=golang-codereviews, iant
https://codereview.appspot.com/102820043
Diffstat (limited to 'test/live.go')
-rw-r--r-- | test/live.go | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/test/live.go b/test/live.go index 21d3e6a5f..286fcc306 100644 --- a/test/live.go +++ b/test/live.go @@ -564,3 +564,29 @@ func f38(b bool) { } println() } + +// issue 8097: mishandling of x = x during return. + +func f39() (x []int) { + x = []int{1} + println() // ERROR "live at call to printnl: x" + return x +} + +func f39a() (x []int) { + x = []int{1} + println() // ERROR "live at call to printnl: x" + return +} + +func f39b() (x [10]*int) { + x = [10]*int{new(int)} // ERROR "live at call to new: x" + println() // ERROR "live at call to printnl: x" + return x +} + +func f39c() (x [10]*int) { + x = [10]*int{new(int)} // ERROR "live at call to new: x" + println() // ERROR "live at call to printnl: x" + return +} |