]> Cypherpunks.ru repositories - gostls13.git/blob - test/escape_map.go
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / test / escape_map.go
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 maps.
8
9 package escape
10
11 var sink interface{}
12
13 func map0() {
14         m := make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) does not escape"
15         // BAD: i should not escape
16         i := 0 // ERROR "moved to heap: i"
17         // BAD: j should not escape
18         j := 0 // ERROR "moved to heap: j"
19         m[&i] = &j
20         _ = m
21 }
22
23 func map1() *int {
24         m := make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) does not escape"
25         // BAD: i should not escape
26         i := 0 // ERROR "moved to heap: i"
27         j := 0 // ERROR "moved to heap: j"
28         m[&i] = &j
29         return m[&i]
30 }
31
32 func map2() map[*int]*int {
33         m := make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) escapes to heap"
34         i := 0                   // ERROR "moved to heap: i"
35         j := 0                   // ERROR "moved to heap: j"
36         m[&i] = &j
37         return m
38 }
39
40 func map3() []*int {
41         m := make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) does not escape"
42         i := 0                   // ERROR "moved to heap: i"
43         // BAD: j should not escape
44         j := 0 // ERROR "moved to heap: j"
45         m[&i] = &j
46         var r []*int
47         for k := range m {
48                 r = append(r, k)
49         }
50         return r
51 }
52
53 func map4() []*int {
54         m := make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) does not escape"
55         // BAD: i should not escape
56         i := 0 // ERROR "moved to heap: i"
57         j := 0 // ERROR "moved to heap: j"
58         m[&i] = &j
59         var r []*int
60         for k, v := range m {
61                 // We want to test exactly "for k, v := range m" rather than "for _, v := range m".
62                 // The following if is merely to use (but not leak) k.
63                 if k != nil {
64                         r = append(r, v)
65                 }
66         }
67         return r
68 }
69
70 func map5(m map[*int]*int) { // ERROR "m does not escape"
71         i := 0 // ERROR "moved to heap: i"
72         j := 0 // ERROR "moved to heap: j"
73         m[&i] = &j
74 }
75
76 func map6(m map[*int]*int) { // ERROR "m does not escape"
77         if m != nil {
78                 m = make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) does not escape"
79         }
80         i := 0 // ERROR "moved to heap: i"
81         j := 0 // ERROR "moved to heap: j"
82         m[&i] = &j
83 }
84
85 func map7() {
86         // BAD: i should not escape
87         i := 0 // ERROR "moved to heap: i"
88         // BAD: j should not escape
89         j := 0                     // ERROR "moved to heap: j"
90         m := map[*int]*int{&i: &j} // ERROR "map\[\*int\]\*int{...} does not escape"
91         _ = m
92 }
93
94 func map8() {
95         i := 0                     // ERROR "moved to heap: i"
96         j := 0                     // ERROR "moved to heap: j"
97         m := map[*int]*int{&i: &j} // ERROR "map\[\*int\]\*int{...} escapes to heap"
98         sink = m
99 }
100
101 func map9() *int {
102         // BAD: i should not escape
103         i := 0                     // ERROR "moved to heap: i"
104         j := 0                     // ERROR "moved to heap: j"
105         m := map[*int]*int{&i: &j} // ERROR "map\[\*int\]\*int{...} does not escape"
106         return m[nil]
107 }