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:
parent
8bd8cede03
commit
334056a7bc
@ -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;
|
||||
|
22
test/fixedbugs/issue7083.go
Normal file
22
test/fixedbugs/issue7083.go
Normal 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")
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user