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.
7 // Test escape analysis for interface conversions.
17 func mescapes(m M) { // ERROR "leaking param: m"
18 sink = m // ERROR "m escapes to heap"
21 func mdoesnotescape(m M) { // ERROR "m does not escape"
24 // Tests for type stored directly in iface and with value receiver method.
35 v := M0{&i} // ERROR "&i does not escape"
36 var x M = v // ERROR "v does not escape"
40 i := 0 // ERROR "moved to heap: i"
41 v := M0{&i} // ERROR "&i escapes to heap"
42 var x M = v // ERROR "v escapes to heap"
43 sink = x // ERROR "x escapes to heap"
47 v := M0{&i} // ERROR "&i does not escape"
48 var x M = v // ERROR "v does not escape"
53 i := 0 // ERROR "moved to heap: i"
54 v := M0{&i} // ERROR "&i escapes to heap"
55 // BAD: v does not escape to heap here
56 var x M = v // ERROR "v escapes to heap"
58 sink = v1 // ERROR "v1 escapes to heap"
61 i := 0 // ERROR "moved to heap: i"
62 v := M0{&i} // ERROR "&i escapes to heap"
63 // BAD: v does not escape to heap here
64 var x M = v // ERROR "v escapes to heap"
68 i := 0 // ERROR "moved to heap: i"
69 v := M0{&i} // ERROR "&i escapes to heap"
70 var x M = v // ERROR "v escapes to heap"
75 v := M0{&i} // ERROR "&i does not escape"
76 var x M = v // ERROR "v does not escape"
81 // Tests for type stored indirectly in iface and with value receiver method.
93 v := M1{&i, 0} // ERROR "&i does not escape"
94 var x M = v // ERROR "v does not escape"
98 i := 0 // ERROR "moved to heap: i"
99 v := M1{&i, 0} // ERROR "&i escapes to heap"
100 var x M = v // ERROR "v escapes to heap"
101 sink = x // ERROR "x escapes to heap"
105 v := M1{&i, 0} // ERROR "&i does not escape"
106 var x M = v // ERROR "v does not escape"
111 i := 0 // ERROR "moved to heap: i"
112 v := M1{&i, 0} // ERROR "&i escapes to heap"
113 // BAD: v does not escape to heap here
114 var x M = v // ERROR "v escapes to heap"
116 sink = v1 // ERROR "v1 escapes to heap"
119 i := 0 // ERROR "moved to heap: i"
120 v := M1{&i, 0} // ERROR "&i escapes to heap"
121 // BAD: v does not escape to heap here
122 var x M = v // ERROR "v escapes to heap"
126 i := 0 // ERROR "moved to heap: i"
127 v := M1{&i, 0} // ERROR "&i escapes to heap"
128 var x M = v // ERROR "v escapes to heap"
133 v := M1{&i, 0} // ERROR "&i does not escape"
134 var x M = v // ERROR "v does not escape"
139 // Tests for type stored directly in iface and with pointer receiver method.
147 func efaceEscape2() {
150 v := &M2{&i} // ERROR "&i does not escape" "&M2 literal does not escape"
151 var x M = v // ERROR "v does not escape"
155 i := 0 // ERROR "moved to heap: i"
156 v := &M2{&i} // ERROR "&i escapes to heap" "&M2 literal escapes to heap"
157 var x M = v // ERROR "v escapes to heap"
158 sink = x // ERROR "x escapes to heap"
162 v := &M2{&i} // ERROR "&i does not escape" "&M2 literal does not escape"
163 var x M = v // ERROR "v does not escape"
168 i := 0 // ERROR "moved to heap: i"
169 v := &M2{&i} // ERROR "&i escapes to heap" "&M2 literal escapes to heap"
170 // BAD: v does not escape to heap here
171 var x M = v // ERROR "v escapes to heap"
173 sink = v1 // ERROR "v1 escapes to heap"
176 i := 0 // ERROR "moved to heap: i"
177 v := &M2{&i} // ERROR "&i escapes to heap" "&M2 literal does not escape"
178 // BAD: v does not escape to heap here
179 var x M = v // ERROR "v does not escape"
181 sink = *v1 // ERROR "v1 escapes to heap"
184 i := 0 // ERROR "moved to heap: i"
185 v := &M2{&i} // ERROR "&i escapes to heap" "&M2 literal does not escape"
186 // BAD: v does not escape to heap here
187 var x M = v // ERROR "v does not escape"
189 sink = *v1 // ERROR "v1 escapes to heap"
193 i := 0 // ERROR "moved to heap: i"
194 v := &M2{&i} // ERROR "&i escapes to heap" "&M2 literal escapes to heap"
195 // BAD: v does not escape to heap here
196 var x M = v // ERROR "v escapes to heap"
200 i := 0 // ERROR "moved to heap: i"
201 v := &M2{&i} // ERROR "&i escapes to heap" "&M2 literal escapes to heap"
202 var x M = v // ERROR "v escapes to heap"
207 v := &M2{&i} // ERROR "&i does not escape" "&M2 literal does not escape"
208 var x M = v // ERROR "v does not escape"