1
0
mirror of https://github.com/golang/go synced 2024-09-24 03:10:16 -06:00

cmd/gc: for loop init statement misanalyzed by escape analysis

Logically, the init statement is in the enclosing scopes loopdepth, not inside the for loop.

Fixes #7313.

LGTM=rsc
R=golang-codereviews, gobot, rsc
CC=golang-codereviews
https://golang.org/cl/62430043
This commit is contained in:
Daniel Morsing 2014-02-13 19:04:43 +00:00
parent 7861cd6082
commit e0a55a6c98
2 changed files with 35 additions and 1 deletions

View File

@ -423,6 +423,9 @@ esc(EscState *e, Node *n)
lno = setlineno(n);
// ninit logically runs at a different loopdepth than the rest of the for loop.
esclist(e, n->ninit);
if(n->op == OFOR || n->op == ORANGE)
e->loopdepth++;
@ -430,7 +433,6 @@ esc(EscState *e, Node *n)
esc(e, n->right);
esc(e, n->ntest);
esc(e, n->nincr);
esclist(e, n->ninit);
esclist(e, n->nbody);
esclist(e, n->nelse);
esclist(e, n->list);

View File

@ -1357,3 +1357,35 @@ func foo144() {
//go:noescape
func foo144b(*int)
// issue 7313: for loop init should not be treated as "in loop"
type List struct {
Next *List
}
func foo145(l List) { // ERROR "l does not escape"
var p *List
for p = &l; p.Next != nil; p = p.Next { // ERROR "&l does not escape"
}
}
func foo146(l List) { // ERROR "l does not escape"
var p *List
p = &l // ERROR "&l does not escape"
for ; p.Next != nil; p = p.Next {
}
}
func foo147(l List) { // ERROR "l does not escape"
var p *List
p = &l // ERROR "&l does not escape"
for p.Next != nil {
p = p.Next
}
}
func foo148(l List) { // ERROR " l does not escape"
for p := &l; p.Next != nil; p = p.Next { // ERROR "&l does not escape"
}
}