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 with respect to field assignments.
24 i := 0 // ERROR "moved to heap: i$"
26 x.p1 = &i // ERROR "&i escapes to heap$"
27 sink = x.p1 // ERROR "x\.p1 escapes to heap"
31 i := 0 // ERROR "moved to heap: i$"
33 // BAD: &i should not escape
34 x.p1 = &i // ERROR "&i escapes to heap$"
35 sink = x.p2 // ERROR "x\.p2 escapes to heap"
39 i := 0 // ERROR "moved to heap: i$"
41 x.p1 = &i // ERROR "&i escapes to heap$"
42 sink = x // ERROR "x escapes to heap"
46 i := 0 // ERROR "moved to heap: i$"
48 y.x.p1 = &i // ERROR "&i escapes to heap$"
50 sink = x // ERROR "x escapes to heap"
54 i := 0 // ERROR "moved to heap: i$"
56 // BAD: &i should not escape here
57 x.a[0] = &i // ERROR "&i escapes to heap$"
58 sink = x.a[1] // ERROR "x\.a\[1\] escapes to heap"
61 // BAD: we are not leaking param x, only x.p2
62 func field6(x *X) { // ERROR "leaking param content: x$"
63 sink = x.p2 // ERROR "x\.p2 escapes to heap"
67 i := 0 // ERROR "moved to heap: i$"
69 // BAD: &i should not escape
70 x.p1 = &i // ERROR "&i escapes to heap$"
71 field6(&x) // ERROR "field6a &x does not escape"
77 y.x.p1 = &i // ERROR "field7 &i does not escape$"
85 i := 0 // ERROR "moved to heap: i$"
87 y.x.p1 = &i // ERROR "&i escapes to heap$"
91 sink = y1.x.p1 // ERROR "y1\.x\.p1 escapes to heap"
95 i := 0 // ERROR "moved to heap: i$"
97 y.x.p1 = &i // ERROR "&i escapes to heap$"
101 sink = y1.x // ERROR "y1\.x escapes to heap"
105 i := 0 // ERROR "moved to heap: i$"
107 // BAD: &i should not escape
108 y.x.p1 = &i // ERROR "&i escapes to heap$"
112 sink = y1.x.p2 // ERROR "y1\.x\.p2 escapes to heap"
116 i := 0 // ERROR "moved to heap: i$"
117 x := X{p1: &i} // ERROR "&i escapes to heap$"
118 sink = x.p1 // ERROR "x\.p1 escapes to heap"
122 i := 0 // ERROR "moved to heap: i$"
123 // BAD: &i should not escape
124 x := X{p1: &i} // ERROR "&i escapes to heap$"
125 sink = x.p2 // ERROR "x\.p2 escapes to heap"
129 i := 0 // ERROR "moved to heap: i$"
130 x := &X{p1: &i} // ERROR "&i escapes to heap$" "field13 &X literal does not escape$"
131 sink = x.p1 // ERROR "x\.p1 escapes to heap"
135 i := 0 // ERROR "moved to heap: i$"
136 // BAD: &i should not escape
137 x := &X{p1: &i} // ERROR "&i escapes to heap$" "field14 &X literal does not escape$"
138 sink = x.p2 // ERROR "x\.p2 escapes to heap"
142 i := 0 // ERROR "moved to heap: i$"
143 x := &X{p1: &i} // ERROR "&X literal escapes to heap$" "&i escapes to heap$"
144 sink = x // ERROR "x escapes to heap"
148 i := 0 // ERROR "moved to heap: i$"
150 // BAD: &i should not escape
151 x.p1 = &i // ERROR "&i escapes to heap$"
152 var iface interface{} = x // ERROR "x escapes to heap"
154 sink = x1.p2 // ERROR "x1\.p2 escapes to heap"
158 i := 0 // ERROR "moved to heap: i$"
160 x.p1 = &i // ERROR "&i escapes to heap$"
161 var iface interface{} = x // ERROR "x escapes to heap"
163 sink = x1.p1 // ERROR "x1\.p1 escapes to heap"
167 i := 0 // ERROR "moved to heap: i$"
169 // BAD: &i should not escape
170 x.p1 = &i // ERROR "&i escapes to heap$"
171 var iface interface{} = x // ERROR "x escapes to heap"
172 y, _ := iface.(Y) // Put X, but extracted Y. The cast will fail, so y is zero initialized.
173 sink = y // ERROR "y escapes to heap"