From 1f5617e37c9078dbe082151c9e17d5dc900cb5a0 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Thu, 19 Feb 2015 17:54:55 +0300 Subject: [PATCH] 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 --- test/escape2.go | 24 ++++++++++++++++++++++-- test/escape2n.go | 24 ++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/test/escape2.go b/test/escape2.go index 3fd62d1dfc..69c5913db0 100644 --- a/test/escape2.go +++ b/test/escape2.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" } 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" } -- 2.48.1