github.com/rsc/go@v0.0.0-20150416155037-e040fd465409/test/escape_slice.go (about) 1 // errorcheck -0 -m -l 2 3 // Copyright 2015 The Go Authors. All rights reserved. 4 // Use of this source code is governed by a BSD-style 5 // license that can be found in the LICENSE file. 6 7 // Test escape analysis for slices. 8 9 package escape 10 11 var sink interface{} 12 13 func slice0() { 14 var s []*int 15 // BAD: i should not escape 16 i := 0 // ERROR "moved to heap: i" 17 s = append(s, &i) // ERROR "&i escapes to heap" 18 _ = s 19 } 20 21 func slice1() *int { 22 var s []*int 23 i := 0 // ERROR "moved to heap: i" 24 s = append(s, &i) // ERROR "&i escapes to heap" 25 return s[0] 26 } 27 28 func slice2() []*int { 29 var s []*int 30 i := 0 // ERROR "moved to heap: i" 31 s = append(s, &i) // ERROR "&i escapes to heap" 32 return s 33 } 34 35 func slice3() *int { 36 var s []*int 37 i := 0 // ERROR "moved to heap: i" 38 s = append(s, &i) // ERROR "&i escapes to heap" 39 for _, p := range s { 40 return p 41 } 42 return nil 43 } 44 45 func slice4(s []*int) { // ERROR "s does not escape" 46 i := 0 // ERROR "moved to heap: i" 47 s[0] = &i // ERROR "&i escapes to heap" 48 } 49 50 func slice5(s []*int) { // ERROR "s does not escape" 51 if s != nil { 52 s = make([]*int, 10) // ERROR "make\(\[\]\*int, 10\) does not escape" 53 } 54 i := 0 // ERROR "moved to heap: i" 55 s[0] = &i // ERROR "&i escapes to heap" 56 } 57 58 func slice6() { 59 s := make([]*int, 10) // ERROR "make\(\[\]\*int, 10\) does not escape" 60 // BAD: i should not escape 61 i := 0 // ERROR "moved to heap: i" 62 s[0] = &i // ERROR "&i escapes to heap" 63 _ = s 64 } 65 66 func slice7() *int { 67 s := make([]*int, 10) // ERROR "make\(\[\]\*int, 10\) does not escape" 68 i := 0 // ERROR "moved to heap: i" 69 s[0] = &i // ERROR "&i escapes to heap" 70 return s[0] 71 } 72 73 func slice8() { 74 // BAD: i should not escape here 75 i := 0 // ERROR "moved to heap: i" 76 s := []*int{&i} // ERROR "&i escapes to heap" "literal does not escape" 77 _ = s 78 } 79 80 func slice9() *int { 81 i := 0 // ERROR "moved to heap: i" 82 s := []*int{&i} // ERROR "&i escapes to heap" "literal does not escape" 83 return s[0] 84 } 85 86 func slice10() []*int { 87 i := 0 // ERROR "moved to heap: i" 88 s := []*int{&i} // ERROR "&i escapes to heap" "literal escapes to heap" 89 return s 90 }