diff options
author | Russ Cox <rsc@golang.org> | 2014-02-13 20:59:39 -0500 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2014-02-13 20:59:39 -0500 |
commit | e0ed119d47728176de20aedeb519e6b470e7e411 (patch) | |
tree | eaaf55c2dd390512ef6c54ada8e4bab5b7c83842 /test/live.go | |
parent | 627d914dff9f9b31d835a6aaa57073364c13638a (diff) | |
download | go-e0ed119d47728176de20aedeb519e6b470e7e411.tar.gz |
cmd/gc: distinguish unnamed vs blank-named return variables better
Before, an unnamed return value turned into an ONAME node n with n->sym
named ~anon%d, and n->orig == n.
A blank-named return value turned into an ONAME node n with n->sym
named ~anon%d but n->orig == the original blank n. Code generation and
printing uses n->orig, so that this node formatted as _.
But some code does not use n->orig. In particular the liveness code does
not know about the n->orig convention and so mishandles blank identifiers.
It is possible to fix but seemed better to avoid the confusion entirely.
Now the first kind of node is named ~r%d and the second ~b%d; both have
n->orig == n, so that it doesn't matter whether code uses n or n->orig.
After this change the ->orig field is only used for other kinds of expressions,
not for ONAME nodes.
This requires distinguishing ~b from ~r names in a few places that care.
It fixes a liveness analysis bug without actually changing the liveness code.
TBR=ken2
CC=golang-codereviews
https://codereview.appspot.com/63630043
Diffstat (limited to 'test/live.go')
-rw-r--r-- | test/live.go | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/test/live.go b/test/live.go index dc2ec86fd..c0ea13129 100644 --- a/test/live.go +++ b/test/live.go @@ -79,3 +79,10 @@ func f5(b1 bool) { } print(**z) // ERROR "live at call to printint: x y$" } + +// confusion about the _ result used to cause spurious "live at entry to f6: _". + +func f6() (_, y string) { + y = "hello" + return +} |