From: Russ Cox Date: Wed, 24 Jun 2015 21:31:57 +0000 (-0400) Subject: cmd/compile: handle copy in escape analysis X-Git-Tag: go1.5beta1~131 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=66130907d1483f851b514ab564c64fe1d1fceec6;p=gostls13.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 --- diff --git a/src/cmd/compile/internal/gc/esc.go b/src/cmd/compile/internal/gc/esc.go index 020ca9b40c..85561cdb27 100644 --- a/src/cmd/compile/internal/gc/esc.go +++ b/src/cmd/compile/internal/gc/esc.go @@ -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 + case OCOPY: + escassignDereference(e, &e.theSink, n.Right) // lose track of assign of dereference + case OCONV, OCONVNOP: escassign(e, n, n.Left) diff --git a/test/escape2.go b/test/escape2.go index c048f1b7aa..46cfde4a94 100644 --- a/test/escape2.go +++ b/test/escape2.go @@ -858,8 +858,8 @@ func foo103(m [1]*int, x *int) { // ERROR "foo103 m does not escape$" "foo103 x var y []*int -// does not leak x -func foo104(x []*int) { // ERROR "foo104 x does not escape$" +// does not leak x but does leak content +func foo104(x []*int) { // ERROR "leaking param content: x" copy(y, x) } @@ -1820,3 +1820,11 @@ func issue10353b() { } _ = 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] +} diff --git a/test/escape2n.go b/test/escape2n.go index f1481c1a36..c32877321f 100644 --- a/test/escape2n.go +++ b/test/escape2n.go @@ -858,8 +858,8 @@ func foo103(m [1]*int, x *int) { // ERROR "foo103 m does not escape$" "foo103 x var y []*int -// does not leak x -func foo104(x []*int) { // ERROR "foo104 x does not escape$" +// does not leak x but does leak content +func foo104(x []*int) { // ERROR "leaking param content: x" copy(y, x) } @@ -1820,3 +1820,11 @@ func issue10353b() { } _ = 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] +}