Commit 334056a7 authored by Russ Cox's avatar Russ Cox

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
parent 8bd8cede
......@@ -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;
}
......@@ -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));
}
......
......@@ -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;
......
// 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")
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment