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>
This commit is contained in:
Dmitry Vyukov 2015-02-19 17:54:55 +03:00
parent c61d86af72
commit 1f5617e37c
2 changed files with 44 additions and 4 deletions

View file

@ -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"
}

View file

@ -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"
}