1
0
mirror of https://github.com/golang/go synced 2024-11-11 20:50:23 -07:00

cmd/gc: return canonical Node* from temp

For historical reasons, temp was returning a copy
of the created Node*, not the original Node*.
This meant that if analysis recorded information in the
returned node (for example, n->addrtaken = 1), the
analysis would not show up on the original Node*, the
one kept in fn->dcl and consulted during liveness
bitmap creation.

Correct this, and watch for it when setting addrtaken.

Fixes #7083.

R=khr, dave, minux.ma
CC=golang-codereviews
https://golang.org/cl/51010045
This commit is contained in:
Russ Cox 2014-01-14 10:43:13 -05:00
parent 8bd8cede03
commit 334056a7bc
4 changed files with 26 additions and 1 deletions

View File

@ -939,5 +939,5 @@ temp(Type *t)
n = nod(OXXX, N, N);
tempname(n, t);
n->sym->def->used = 1;
return n;
return n->orig;
}

View File

@ -468,6 +468,7 @@ staticassign(Node *l, Node *r, NodeList **out)
else {
a = nod(OXXX, N, N);
*a = n1;
a->orig = a; // completely separate copy
if(!staticassign(a, e->expr, out))
*out = list(*out, nod(OAS, a, e->expr));
}

View File

@ -723,6 +723,8 @@ reswitch:
checklvalue(n->left, "take the address of");
for(l=n->left; l->op == ODOT; l=l->left)
l->addrtaken = 1;
if(l->orig != l && l->op == ONAME)
fatal("found non-orig name node %N", l);
l->addrtaken = 1;
defaultlit(&n->left, T);
l = n->left;

View File

@ -0,0 +1,22 @@
// run
package main
import "runtime/debug"
func f(m map[int]*string, i int) {
s := ""
m[i] = &s
}
func main() {
debug.SetGCPercent(0)
m := map[int]*string{}
for i := 0; i < 40; i++ {
f(m, i)
if len(*m[i]) != 0 {
println("bad length", i, m[i], len(*m[i]))
panic("bad length")
}
}
}