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>
diff --git a/test/escape2.go b/test/escape2.go
index 3fd62d1..69c5913 100644
--- a/test/escape2.go
+++ b/test/escape2.go
@@ -610,11 +610,11 @@
}
}
-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 @@
*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 @@
*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"
}