diff --git a/transform/testdata/allocs2.go b/transform/testdata/allocs2.go index 35ab7bf3f..88c411493 100644 --- a/transform/testdata/allocs2.go +++ b/transform/testdata/allocs2.go @@ -9,7 +9,6 @@ func main() { n1 := 5 derefInt(&n1) - // This should eventually be modified to not escape. n2 := 6 returnIntPtr(&n2) @@ -19,7 +18,6 @@ func main() { s2 := [3]int{} readIntSlice(s2[:]) - // This should also be modified to not escape. s3 := make([]int, 3) returnIntSlice(s3) @@ -78,6 +76,61 @@ func main() { keepAliveNoEscape(unsafe.Pointer(&dmaBuf2[0])) } +type vector3 [3]float32 + +func scaleVector3(vec *vector3, f float32) *vector3 { + vec[0] *= f + vec[1] *= f + vec[2] *= f + return vec +} + +func crossVector3(a, b *vector3) vector3 { + return vector3{ + a[1]*b[2] - a[2]*b[1], + a[2]*b[0] - a[0]*b[2], + a[0]*b[1] - a[1]*b[0], + } +} + +func nonEscapingReturnedPointer() vector3 { + a := vector3{1, 2, 3} + b := vector3{4, 5, 6} + + c := scaleVector3(&b, 0.5) + return crossVector3(&a, c) +} + +var escapedSlice []int + +func escapingReturnedSlice() { + s := make([]int, 3) + escapedSlice = returnIntSlice(s) +} + +var escapedVector3 *vector3 + +func escapingReturnedPointer() { + b := vector3{4, 5, 6} + + c := scaleVector3(&b, 0.5) + escapedVector3 = c +} + +func recursiveScaleVector3(vec *vector3, n int) *vector3 { + if n == 0 { + return vec + } + return recursiveScaleVector3(vec, n-1) +} + +func recursiveReturnedPointer() vector3 { + b := vector3{4, 5, 6} + + c := recursiveScaleVector3(&b, 1) + return *c +} + func derefInt(x *int) int { return *x } diff --git a/transform/testdata/allocs2.out.cover b/transform/testdata/allocs2.out.cover index a26c2a81d..2d42ec7c8 100644 --- a/transform/testdata/allocs2.out.cover +++ b/transform/testdata/allocs2.out.cover @@ -1,10 +1,14 @@ -testdata/allocs2.go:13.1,13.9 1 0 -testdata/allocs2.go:23.1,23.22 1 0 -testdata/allocs2.go:26.1,26.43 1 0 -testdata/allocs2.go:28.1,28.25 1 0 -testdata/allocs2.go:31.1,31.22 1 0 -testdata/allocs2.go:38.1,38.23 1 0 -testdata/allocs2.go:46.1,46.23 1 0 -testdata/allocs2.go:48.1,48.22 1 0 -testdata/allocs2.go:51.1,51.9 1 0 -testdata/allocs2.go:52.1,52.9 1 0 +testdata/allocs2.go:12.1,12.9 1 0 +testdata/allocs2.go:21.1,21.22 1 0 +testdata/allocs2.go:24.1,24.43 1 0 +testdata/allocs2.go:26.1,26.25 1 0 +testdata/allocs2.go:29.1,29.22 1 0 +testdata/allocs2.go:36.1,36.23 1 0 +testdata/allocs2.go:44.1,44.23 1 0 +testdata/allocs2.go:46.1,46.22 1 0 +testdata/allocs2.go:49.1,49.9 1 0 +testdata/allocs2.go:50.1,50.9 1 0 +testdata/allocs2.go:98.1,98.23 1 0 +testdata/allocs2.go:107.1,107.21 1 0 +testdata/allocs2.go:114.1,114.23 1 0 +testdata/allocs2.go:128.1,128.23 1 0 diff --git a/transform/testdata/allocs2.out.reason b/transform/testdata/allocs2.out.reason index 22f798e4b..82c2efd97 100644 --- a/transform/testdata/allocs2.out.reason +++ b/transform/testdata/allocs2.out.reason @@ -1,10 +1,14 @@ -testdata/allocs2.go:13:2: object allocated on the heap: escapes at line 14 -testdata/allocs2.go:23:12: object allocated on the heap: escapes at line 24 -testdata/allocs2.go:26:15: object allocated on the heap: size is not constant -testdata/allocs2.go:28:12: object allocated on the heap: object size 300 exceeds maximum stack allocation size 256 -testdata/allocs2.go:31:12: object allocated on the heap: escapes at line 32 -testdata/allocs2.go:38:21: object allocated on the heap: escapes at line 39 -testdata/allocs2.go:46:22: object allocated on the heap: escapes at line 46 -testdata/allocs2.go:48:13: object allocated on the heap: escapes at line 49 -testdata/allocs2.go:51:2: object allocated on the heap: escapes at line 53 -testdata/allocs2.go:52:2: object allocated on the heap: escapes at line 53 +testdata/allocs2.go:12:2: object allocated on the heap: escapes at line 13 +testdata/allocs2.go:21:12: object allocated on the heap: escapes at line 22 +testdata/allocs2.go:24:15: object allocated on the heap: size is not constant +testdata/allocs2.go:26:12: object allocated on the heap: object size 300 exceeds maximum stack allocation size 256 +testdata/allocs2.go:29:12: object allocated on the heap: escapes at line 30 +testdata/allocs2.go:36:21: object allocated on the heap: escapes at line 37 +testdata/allocs2.go:44:22: object allocated on the heap: escapes at line 44 +testdata/allocs2.go:46:13: object allocated on the heap: escapes at line 47 +testdata/allocs2.go:49:2: object allocated on the heap: escapes at line 51 +testdata/allocs2.go:50:2: object allocated on the heap: escapes at line 51 +testdata/allocs2.go:98:2: object allocated on the heap: escapes at line 100 +testdata/allocs2.go:107:11: object allocated on the heap: escapes at line 108 +testdata/allocs2.go:114:2: object allocated on the heap: escapes at line 116 +testdata/allocs2.go:128:2: object allocated on the heap: escapes at line 130