mirror of
https://github.com/golang/go
synced 2024-11-22 02:34:40 -07:00
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;
|
||||
if(n->op == OCALLMETH)
|
||||
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)
|
||||
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
Block a user