mirror of https://github.com/golang/go.git
cmd/gc: fix escape analysis ordering
Functions without bodies were excluded from the ordering logic, because when I wrote the ordering logic there was no reason to analyze them. But then we added //go:noescape tags that need analysis, and we didn't update the ordering logic. So in the absence of good ordering, //go:noescape only worked if it appeared before the use in the source code. Fixes #5773. R=golang-dev, r CC=golang-dev https://golang.org/cl/10570043
This commit is contained in:
parent
a14e143c21
commit
148fac79a3
|
|
@ -144,7 +144,7 @@ visitcode(Node *n, uint32 min)
|
||||||
fn = n->left;
|
fn = n->left;
|
||||||
if(n->op == OCALLMETH)
|
if(n->op == OCALLMETH)
|
||||||
fn = n->left->right->sym->def;
|
fn = n->left->right->sym->def;
|
||||||
if(fn && fn->op == ONAME && fn->class == PFUNC && fn->defn && fn->defn->nbody)
|
if(fn && fn->op == ONAME && fn->class == PFUNC && fn->defn)
|
||||||
if((m = visit(fn->defn)) < min)
|
if((m = visit(fn->defn)) < min)
|
||||||
min = m;
|
min = m;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1337,3 +1337,22 @@ func foo143() {
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// issue 5773
|
||||||
|
// Check that annotations take effect regardless of whether they
|
||||||
|
// are before or after the use in the source code.
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
|
||||||
|
func foo144a(*int)
|
||||||
|
|
||||||
|
func foo144() {
|
||||||
|
var x int
|
||||||
|
foo144a(&x) // ERROR "&x does not escape"
|
||||||
|
var y int
|
||||||
|
foo144b(&y) // ERROR "&y does not escape"
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
|
||||||
|
func foo144b(*int)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue