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
n = nod(OXXX, N, N);
tempname(n, t);
n->sym->def->used = 1;
- return n;
+ return n->orig;
}
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));
}
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;
--- /dev/null
+// 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")
+ }
+ }
+}