summaryrefslogtreecommitdiff
path: root/test/live.go
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2014-05-29 13:47:31 -0400
committerRuss Cox <rsc@golang.org>2014-05-29 13:47:31 -0400
commitc3a33fa71bb22fc6e1948c97e6ae877adb9c0e29 (patch)
treebf95d7a8ad6837f31d08997204a8a44332933687 /test/live.go
parent112af3545d8afbaf7a95891ea78f94de9d79996d (diff)
downloadgo-c3a33fa71bb22fc6e1948c97e6ae877adb9c0e29.tar.gz
cmd/gc: fix x=x crash
[Same as CL 102820043 except applied changes to 6g/gsubr.c also to 5g/gsubr.c and 8g/gsubr.c. The problem I had last night trying to do that was that 8g's copy of nodarg has different (but equivalent) control flow and I was pasting the new code into the wrong place.] Description from CL 102820043: 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=khr R=golang-codereviews, khr CC=golang-codereviews, iant, khr, r https://codereview.appspot.com/103750043
Diffstat (limited to 'test/live.go')
-rw-r--r--test/live.go26
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
+}