diff options
author | Dmitry Vyukov <dvyukov@google.com> | 2015-02-19 17:54:55 +0300 |
---|---|---|
committer | Dmitry Vyukov <dvyukov@google.com> | 2015-03-28 13:07:19 +0000 |
commit | 1f5617e37c9078dbe082151c9e17d5dc900cb5a0 (patch) | |
tree | e796ebebf17d68c790ecf31e4bfc2510d21aea7f /test/escape2n.go | |
parent | c61d86af72e2323c32ba2c12528866ecc2264bb3 (diff) | |
download | go-1f5617e37c9078dbe082151c9e17d5dc900cb5a0.tar.gz go-1f5617e37c9078dbe082151c9e17d5dc900cb5a0.zip |
test: add additional ... tests for escape analysis
False positives (var incorrectly escapes) are marked with BAD.
Change-Id: I646a29ffe24d963c63db09cba81dbc101d7c7242
Reviewed-on: https://go-review.googlesource.com/5296
Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'test/escape2n.go')
-rw-r--r-- | test/escape2n.go | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/test/escape2n.go b/test/escape2n.go index e9dd7b984e..5e58537111 100644 --- a/test/escape2n.go +++ b/test/escape2n.go @@ -610,11 +610,11 @@ func foo74c() { } } -func myprint(y *int, x ...interface{}) *int { // ERROR "x does not escape" "leaking param: y" +func myprint(y *int, x ...interface{}) *int { // ERROR "x does not escape" "leaking param: y to result ~r2" return y } -func myprint1(y *int, x ...interface{}) *interface{} { // ERROR "y does not escape" "leaking param: x" +func myprint1(y *int, x ...interface{}) *interface{} { // ERROR "y does not escape" "leaking param: x to result ~r2" return &x[0] // ERROR "&x.0. escapes to heap" } @@ -635,10 +635,16 @@ func foo75aesc(z *int) { // ERROR "z does not escape" *ppi = myprint1(z, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap" } +func foo75aesc1(z *int) { // ERROR "z does not escape" + sink = myprint1(z, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap" +} + +// BAD: z does not escape here func foo76(z *int) { // ERROR "leaking param: z" myprint(nil, z) // ERROR "[.][.][.] argument does not escape" } +// BAD: z does not escape here func foo76a(z *int) { // ERROR "leaking param: z" myprint1(nil, z) // ERROR "[.][.][.] argument does not escape" } @@ -685,6 +691,20 @@ func foo77b(z []interface{}) { // ERROR "leaking param: z" *ppi = myprint1(nil, z...) } +func foo77c(z []interface{}) { // ERROR "leaking param: z" + sink = myprint1(nil, z...) +} + +func dotdotdot() { + // BAD: i should not escape here + i := 0 // ERROR "moved to heap: i" + myprint(nil, &i) // ERROR "&i escapes to heap" "\.\.\. argument does not escape" + + // BAD: j should not escape here + j := 0 // ERROR "moved to heap: j" + myprint1(nil, &j) // ERROR "&j escapes to heap" "\.\.\. argument does not escape" +} + func foo78(z int) *int { // ERROR "moved to heap: z" return &z // ERROR "&z escapes to heap" } |