mirror of https://github.com/golang/go.git
cmd/compile: handle copy in escape analysis
Somehow we missed this! Fixes #11387. Change-Id: Ida08fe52eff7da2ef7765b4cf35a39a301420c43 Reviewed-on: https://go-review.googlesource.com/11460 Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
parent
a9e536442e
commit
66130907d1
|
|
@ -809,6 +809,9 @@ func esc(e *EscState, n *Node, up *Node) {
|
||||||
}
|
}
|
||||||
escassignDereference(e, &e.theSink, n.List.N) // The original elements are now leaked, too
|
escassignDereference(e, &e.theSink, n.List.N) // The original elements are now leaked, too
|
||||||
|
|
||||||
|
case OCOPY:
|
||||||
|
escassignDereference(e, &e.theSink, n.Right) // lose track of assign of dereference
|
||||||
|
|
||||||
case OCONV, OCONVNOP:
|
case OCONV, OCONVNOP:
|
||||||
escassign(e, n, n.Left)
|
escassign(e, n, n.Left)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -858,8 +858,8 @@ func foo103(m [1]*int, x *int) { // ERROR "foo103 m does not escape$" "foo103 x
|
||||||
|
|
||||||
var y []*int
|
var y []*int
|
||||||
|
|
||||||
// does not leak x
|
// does not leak x but does leak content
|
||||||
func foo104(x []*int) { // ERROR "foo104 x does not escape$"
|
func foo104(x []*int) { // ERROR "leaking param content: x"
|
||||||
copy(y, x)
|
copy(y, x)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1820,3 +1820,11 @@ func issue10353b() {
|
||||||
}
|
}
|
||||||
_ = f
|
_ = f
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func issue11387(x int) func() int {
|
||||||
|
f := func() int { return x } // ERROR "func literal escapes to heap"
|
||||||
|
slice1 := []func() int{f} // ERROR "\[\].* does not escape"
|
||||||
|
slice2 := make([]func() int, 1) // ERROR "make\(.*\) does not escape"
|
||||||
|
copy(slice2, slice1)
|
||||||
|
return slice2[0]
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -858,8 +858,8 @@ func foo103(m [1]*int, x *int) { // ERROR "foo103 m does not escape$" "foo103 x
|
||||||
|
|
||||||
var y []*int
|
var y []*int
|
||||||
|
|
||||||
// does not leak x
|
// does not leak x but does leak content
|
||||||
func foo104(x []*int) { // ERROR "foo104 x does not escape$"
|
func foo104(x []*int) { // ERROR "leaking param content: x"
|
||||||
copy(y, x)
|
copy(y, x)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1820,3 +1820,11 @@ func issue10353b() {
|
||||||
}
|
}
|
||||||
_ = f
|
_ = f
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func issue11387(x int) func() int {
|
||||||
|
f := func() int { return x } // ERROR "func literal escapes to heap"
|
||||||
|
slice1 := []func() int{f} // ERROR "\[\].* does not escape"
|
||||||
|
slice2 := make([]func() int, 1) // ERROR "make\(.*\) does not escape"
|
||||||
|
copy(slice2, slice1)
|
||||||
|
return slice2[0]
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue