mirror of
https://github.com/golang/go
synced 2024-11-26 05:07:59 -07: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:
parent
7861cd6082
commit
e0a55a6c98
@ -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);
|
||||
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user