diff options
Diffstat (limited to 'test/escape_map.go')
-rw-r--r-- | test/escape_map.go | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/test/escape_map.go b/test/escape_map.go new file mode 100644 index 0000000..23abaa1 --- /dev/null +++ b/test/escape_map.go @@ -0,0 +1,107 @@ +// errorcheck -0 -m -l + +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Test escape analysis for maps. + +package escape + +var sink interface{} + +func map0() { + m := make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) does not escape" + // BAD: i should not escape + i := 0 // ERROR "moved to heap: i" + // BAD: j should not escape + j := 0 // ERROR "moved to heap: j" + m[&i] = &j + _ = m +} + +func map1() *int { + m := make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) does not escape" + // BAD: i should not escape + i := 0 // ERROR "moved to heap: i" + j := 0 // ERROR "moved to heap: j" + m[&i] = &j + return m[&i] +} + +func map2() map[*int]*int { + m := make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) escapes to heap" + i := 0 // ERROR "moved to heap: i" + j := 0 // ERROR "moved to heap: j" + m[&i] = &j + return m +} + +func map3() []*int { + m := make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) does not escape" + i := 0 // ERROR "moved to heap: i" + // BAD: j should not escape + j := 0 // ERROR "moved to heap: j" + m[&i] = &j + var r []*int + for k := range m { + r = append(r, k) + } + return r +} + +func map4() []*int { + m := make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) does not escape" + // BAD: i should not escape + i := 0 // ERROR "moved to heap: i" + j := 0 // ERROR "moved to heap: j" + m[&i] = &j + var r []*int + for k, v := range m { + // We want to test exactly "for k, v := range m" rather than "for _, v := range m". + // The following if is merely to use (but not leak) k. + if k != nil { + r = append(r, v) + } + } + return r +} + +func map5(m map[*int]*int) { // ERROR "m does not escape" + i := 0 // ERROR "moved to heap: i" + j := 0 // ERROR "moved to heap: j" + m[&i] = &j +} + +func map6(m map[*int]*int) { // ERROR "m does not escape" + if m != nil { + m = make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) does not escape" + } + i := 0 // ERROR "moved to heap: i" + j := 0 // ERROR "moved to heap: j" + m[&i] = &j +} + +func map7() { + // BAD: i should not escape + i := 0 // ERROR "moved to heap: i" + // BAD: j should not escape + j := 0 // ERROR "moved to heap: j" + m := map[*int]*int{&i: &j} // ERROR "map\[\*int\]\*int{...} does not escape" + _ = m +} + +func map8() { + i := 0 // ERROR "moved to heap: i" + j := 0 // ERROR "moved to heap: j" + m := map[*int]*int{&i: &j} // ERROR "map\[\*int\]\*int{...} escapes to heap" + sink = m +} + +func map9() *int { + // BAD: i should not escape + i := 0 // ERROR "moved to heap: i" + j := 0 // ERROR "moved to heap: j" + m := map[*int]*int{&i: &j} // ERROR "map\[\*int\]\*int{...} does not escape" + return m[nil] +} |