blob: 73b2a7e58973eb73377e19da9d1596cd56336680 [file] [log] [blame]
Russ Cox4a6b07f2012-01-10 20:08:53 -08001// errchk -0 $G -m -l $D/$F.go
Luuk van Dijk847b61b2011-08-24 19:07:08 +02002
3// Copyright 2010 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
7package foo
8
Russ Coxb4df33a2011-11-01 11:02:43 -04009import (
10 "fmt"
11 "unsafe"
12)
Luuk van Dijk847b61b2011-08-24 19:07:08 +020013
14var gxx *int
15
Luuk van Dijkb536adb2011-10-08 19:37:06 +020016func foo1(x int) { // ERROR "moved to heap: x"
Russ Coxb4df33a2011-11-01 11:02:43 -040017 gxx = &x // ERROR "&x escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +020018}
19
Luuk van Dijkb536adb2011-10-08 19:37:06 +020020func foo2(yy *int) { // ERROR "leaking param: yy"
Luuk van Dijk847b61b2011-08-24 19:07:08 +020021 gxx = yy
22}
23
Luuk van Dijkb536adb2011-10-08 19:37:06 +020024func foo3(x int) *int { // ERROR "moved to heap: x"
Russ Coxb4df33a2011-11-01 11:02:43 -040025 return &x // ERROR "&x escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +020026}
27
28type T *T
Russ Coxdb5f9da2011-08-28 12:05:00 -040029
Luuk van Dijkb536adb2011-10-08 19:37:06 +020030func foo3b(t T) { // ERROR "leaking param: t"
Luuk van Dijk847b61b2011-08-24 19:07:08 +020031 *t = t
32}
33
34// xx isn't going anywhere, so use of yy is ok
Russ Coxdb5f9da2011-08-28 12:05:00 -040035func foo4(xx, yy *int) { // ERROR "xx does not escape" "yy does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +020036 xx = yy
37}
38
39// xx isn't going anywhere, so taking address of yy is ok
Russ Coxdb5f9da2011-08-28 12:05:00 -040040func foo5(xx **int, yy *int) { // ERROR "xx does not escape" "yy does not escape"
Russ Coxb4df33a2011-11-01 11:02:43 -040041 xx = &yy // ERROR "&yy does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +020042}
43
Luuk van Dijkb536adb2011-10-08 19:37:06 +020044func foo6(xx **int, yy *int) { // ERROR "xx does not escape" "leaking param: yy"
Luuk van Dijk847b61b2011-08-24 19:07:08 +020045 *xx = yy
46}
47
Russ Coxdb5f9da2011-08-28 12:05:00 -040048func foo7(xx **int, yy *int) { // ERROR "xx does not escape" "yy does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +020049 **xx = *yy
50}
51
Russ Coxdb5f9da2011-08-28 12:05:00 -040052func foo8(xx, yy *int) int { // ERROR "xx does not escape" "yy does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +020053 xx = yy
54 return *xx
55}
56
Luuk van Dijkb536adb2011-10-08 19:37:06 +020057func foo9(xx, yy *int) *int { // ERROR "leaking param: xx" "leaking param: yy"
Luuk van Dijk847b61b2011-08-24 19:07:08 +020058 xx = yy
59 return xx
60}
61
Russ Coxdb5f9da2011-08-28 12:05:00 -040062func foo10(xx, yy *int) { // ERROR "xx does not escape" "yy does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +020063 *xx = *yy
64}
65
66func foo11() int {
67 x, y := 0, 42
Russ Coxb4df33a2011-11-01 11:02:43 -040068 xx := &x // ERROR "&x does not escape"
69 yy := &y // ERROR "&y does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +020070 *xx = *yy
71 return x
72}
73
Luuk van Dijk847b61b2011-08-24 19:07:08 +020074var xxx **int
75
Luuk van Dijkb536adb2011-10-08 19:37:06 +020076func foo12(yyy **int) { // ERROR "leaking param: yyy"
Luuk van Dijk847b61b2011-08-24 19:07:08 +020077 xxx = yyy
78}
79
Russ Coxdb5f9da2011-08-28 12:05:00 -040080func foo13(yyy **int) { // ERROR "yyy does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +020081 *xxx = *yyy
82}
83
Russ Coxdb5f9da2011-08-28 12:05:00 -040084func foo14(yyy **int) { // ERROR "yyy does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +020085 **xxx = **yyy
86}
87
Luuk van Dijkb536adb2011-10-08 19:37:06 +020088func foo15(yy *int) { // ERROR "moved to heap: yy"
Russ Coxb4df33a2011-11-01 11:02:43 -040089 xxx = &yy // ERROR "&yy escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +020090}
91
Luuk van Dijkb536adb2011-10-08 19:37:06 +020092func foo16(yy *int) { // ERROR "leaking param: yy"
Luuk van Dijk847b61b2011-08-24 19:07:08 +020093 *xxx = yy
94}
95
Russ Coxdb5f9da2011-08-28 12:05:00 -040096func foo17(yy *int) { // ERROR "yy does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +020097 **xxx = *yy
98}
99
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200100func foo18(y int) { // ERROR "moved to heap: "y"
Russ Coxb4df33a2011-11-01 11:02:43 -0400101 *xxx = &y // ERROR "&y escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200102}
103
104func foo19(y int) {
105 **xxx = y
106}
107
108type Bar struct {
Russ Coxdb5f9da2011-08-28 12:05:00 -0400109 i int
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200110 ii *int
111}
112
113func NewBar() *Bar {
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200114 return &Bar{42, nil} // ERROR "&Bar literal escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200115}
116
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200117func NewBarp(x *int) *Bar { // ERROR "leaking param: x"
118 return &Bar{42, x} // ERROR "&Bar literal escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200119}
120
Russ Coxdb5f9da2011-08-28 12:05:00 -0400121func NewBarp2(x *int) *Bar { // ERROR "x does not escape"
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200122 return &Bar{*x, nil} // ERROR "&Bar literal escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200123}
124
Russ Coxdb5f9da2011-08-28 12:05:00 -0400125func (b *Bar) NoLeak() int { // ERROR "b does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200126 return *(b.ii)
127}
128
Rémy Oudompheng94ff3112012-01-12 12:08:40 +0100129func (b *Bar) Leak() *int { // ERROR "leaking param: b"
130 return &b.i // ERROR "&b.i escapes to heap"
131}
132
Russ Coxdb5f9da2011-08-28 12:05:00 -0400133func (b *Bar) AlsoNoLeak() *int { // ERROR "b does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200134 return b.ii
135}
136
Rémy Oudompheng94ff3112012-01-12 12:08:40 +0100137func (b Bar) AlsoLeak() *int { // ERROR "leaking param: b"
138 return b.ii
139}
140
141func (b Bar) LeaksToo() *int { // ERROR "leaking param: b"
142 v := 0 // ERROR "moved to heap: v"
143 b.ii = &v // ERROR "&v escapes"
144 return b.ii
145}
146
147func (b *Bar) LeaksABit() *int { // ERROR "b does not escape"
148 v := 0 // ERROR "moved to heap: v"
149 b.ii = &v // ERROR "&v escapes"
150 return b.ii
151}
152
153func (b Bar) StillNoLeak() int { // ERROR "b does not escape"
154 v := 0
155 b.ii = &v // ERROR "&v does not escape"
156 return b.i
157}
158
Russ Coxb4df33a2011-11-01 11:02:43 -0400159func goLeak(b *Bar) { // ERROR "leaking param: b"
Luuk van Dijkf2460a82011-09-07 19:03:11 +0200160 go b.NoLeak()
161}
162
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200163type Bar2 struct {
Russ Coxdb5f9da2011-08-28 12:05:00 -0400164 i [12]int
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200165 ii []int
166}
167
168func NewBar2() *Bar2 {
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200169 return &Bar2{[12]int{42}, nil} // ERROR "&Bar2 literal escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200170}
171
Russ Coxdb5f9da2011-08-28 12:05:00 -0400172func (b *Bar2) NoLeak() int { // ERROR "b does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200173 return b.i[0]
174}
175
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200176func (b *Bar2) Leak() []int { // ERROR "leaking param: b"
Rémy Oudompheng94ff3112012-01-12 12:08:40 +0100177 return b.i[:] // ERROR "b.i escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200178}
179
Russ Coxdb5f9da2011-08-28 12:05:00 -0400180func (b *Bar2) AlsoNoLeak() []int { // ERROR "b does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200181 return b.ii[0:1]
182}
183
Rémy Oudompheng94ff3112012-01-12 12:08:40 +0100184func (b Bar2) AgainNoLeak() [12]int { // ERROR "b does not escape"
185 return b.i
186}
187
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200188func (b *Bar2) LeakSelf() { // ERROR "leaking param: b"
Rémy Oudompheng94ff3112012-01-12 12:08:40 +0100189 b.ii = b.i[0:4] // ERROR "b.i escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200190}
191
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200192func (b *Bar2) LeakSelf2() { // ERROR "leaking param: b"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200193 var buf []int
Rémy Oudompheng94ff3112012-01-12 12:08:40 +0100194 buf = b.i[0:] // ERROR "b.i escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200195 b.ii = buf
196}
197
198func foo21() func() int {
Russ Coxb4df33a2011-11-01 11:02:43 -0400199 x := 42 // ERROR "moved to heap: x"
200 return func() int { // ERROR "func literal escapes to heap"
201 return x // ERROR "&x escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200202 }
203}
204
205func foo22() int {
206 x := 42
Russ Coxb4df33a2011-11-01 11:02:43 -0400207 return func() int { // ERROR "func literal does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200208 return x
209 }()
210}
211
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200212func foo23(x int) func() int { // ERROR "moved to heap: x"
Russ Coxb4df33a2011-11-01 11:02:43 -0400213 return func() int { // ERROR "func literal escapes to heap"
214 return x // ERROR "&x escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200215 }
216}
217
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200218func foo23a(x int) func() int { // ERROR "moved to heap: x"
Russ Coxb4df33a2011-11-01 11:02:43 -0400219 f := func() int { // ERROR "func literal escapes to heap"
220 return x // ERROR "&x escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200221 }
222 return f
223}
224
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200225func foo23b(x int) *(func() int) { // ERROR "moved to heap: x"
226 f := func() int { return x } // ERROR "moved to heap: f" "func literal escapes to heap" "&x escapes to heap"
Russ Coxb4df33a2011-11-01 11:02:43 -0400227 return &f // ERROR "&f escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200228}
229
230func foo24(x int) int {
Russ Coxb4df33a2011-11-01 11:02:43 -0400231 return func() int { // ERROR "func literal does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200232 return x
233 }()
234}
235
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200236var x *int
237
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200238func fooleak(xx *int) int { // ERROR "leaking param: xx"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200239 x = xx
240 return *x
241}
242
Russ Coxdb5f9da2011-08-28 12:05:00 -0400243func foonoleak(xx *int) int { // ERROR "xx does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200244 return *x + *xx
245}
246
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200247func foo31(x int) int { // ERROR "moved to heap: x"
Russ Coxb4df33a2011-11-01 11:02:43 -0400248 return fooleak(&x) // ERROR "&x escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200249}
250
251func foo32(x int) int {
Russ Coxb4df33a2011-11-01 11:02:43 -0400252 return foonoleak(&x) // ERROR "&x does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200253}
254
255type Foo struct {
256 xx *int
Russ Coxdb5f9da2011-08-28 12:05:00 -0400257 x int
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200258}
259
260var F Foo
261var pf *Foo
262
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200263func (f *Foo) fooleak() { // ERROR "leaking param: f"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200264 pf = f
265}
266
Russ Coxdb5f9da2011-08-28 12:05:00 -0400267func (f *Foo) foonoleak() { // ERROR "f does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200268 F.x = f.x
269}
270
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200271func (f *Foo) Leak() { // ERROR "leaking param: f"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200272 f.fooleak()
273}
274
Russ Coxdb5f9da2011-08-28 12:05:00 -0400275func (f *Foo) NoLeak() { // ERROR "f does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200276 f.foonoleak()
277}
278
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200279func foo41(x int) { // ERROR "moved to heap: x"
Russ Coxb4df33a2011-11-01 11:02:43 -0400280 F.xx = &x // ERROR "&x escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200281}
282
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200283func (f *Foo) foo42(x int) { // ERROR "f does not escape" "moved to heap: x"
Russ Coxb4df33a2011-11-01 11:02:43 -0400284 f.xx = &x // ERROR "&x escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200285}
286
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200287func foo43(f *Foo, x int) { // ERROR "f does not escape" "moved to heap: x"
Russ Coxb4df33a2011-11-01 11:02:43 -0400288 f.xx = &x // ERROR "&x escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200289}
290
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200291func foo44(yy *int) { // ERROR "leaking param: yy"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200292 F.xx = yy
293}
294
Russ Coxdb5f9da2011-08-28 12:05:00 -0400295func (f *Foo) foo45() { // ERROR "f does not escape"
296 F.x = f.x
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200297}
298
Russ Coxdb5f9da2011-08-28 12:05:00 -0400299func (f *Foo) foo46() { // ERROR "f does not escape"
300 F.xx = f.xx
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200301}
302
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200303func (f *Foo) foo47() { // ERROR "leaking param: f"
Russ Coxb4df33a2011-11-01 11:02:43 -0400304 f.xx = &f.x // ERROR "&f.x escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200305}
306
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200307var ptrSlice []*int
308
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200309func foo50(i *int) { // ERROR "leaking param: i"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200310 ptrSlice[0] = i
311}
312
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200313var ptrMap map[*int]*int
314
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200315func foo51(i *int) { // ERROR "leaking param: i"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200316 ptrMap[i] = i
317}
318
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200319func indaddr1(x int) *int { // ERROR "moved to heap: x"
Russ Coxb4df33a2011-11-01 11:02:43 -0400320 return &x // ERROR "&x escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200321}
322
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200323func indaddr2(x *int) *int { // ERROR "leaking param: x"
Russ Coxb4df33a2011-11-01 11:02:43 -0400324 return *&x // ERROR "&x does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200325}
326
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200327func indaddr3(x *int32) *int { // ERROR "leaking param: x"
Russ Coxb4df33a2011-11-01 11:02:43 -0400328 return *(**int)(unsafe.Pointer(&x)) // ERROR "&x does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200329}
330
331// From package math:
332
333func Float32bits(f float32) uint32 {
Russ Coxb4df33a2011-11-01 11:02:43 -0400334 return *(*uint32)(unsafe.Pointer(&f)) // ERROR "&f does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200335}
336
337func Float32frombits(b uint32) float32 {
Russ Coxb4df33a2011-11-01 11:02:43 -0400338 return *(*float32)(unsafe.Pointer(&b)) // ERROR "&b does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200339}
340
341func Float64bits(f float64) uint64 {
Russ Coxb4df33a2011-11-01 11:02:43 -0400342 return *(*uint64)(unsafe.Pointer(&f)) // ERROR "&f does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200343}
344
345func Float64frombits(b uint64) float64 {
Russ Coxb4df33a2011-11-01 11:02:43 -0400346 return *(*float64)(unsafe.Pointer(&b)) // ERROR "&b does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200347}
348
349// contrast with
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200350func float64bitsptr(f float64) *uint64 { // ERROR "moved to heap: f"
Russ Coxb4df33a2011-11-01 11:02:43 -0400351 return (*uint64)(unsafe.Pointer(&f)) // ERROR "&f escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200352}
353
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200354func float64ptrbitsptr(f *float64) *uint64 { // ERROR "leaking param: f"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200355 return (*uint64)(unsafe.Pointer(f))
356}
357
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200358func typesw(i interface{}) *int { // ERROR "leaking param: i"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200359 switch val := i.(type) {
360 case *int:
361 return val
362 case *int8:
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200363 v := int(*val) // ERROR "moved to heap: v"
Russ Coxb4df33a2011-11-01 11:02:43 -0400364 return &v // ERROR "&v escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200365 }
366 return nil
367}
368
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200369func exprsw(i *int) *int { // ERROR "leaking param: i"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200370 switch j := i; *j + 110 {
371 case 12:
372 return j
373 case 42:
374 return nil
375 }
376 return nil
377
378}
379
380// assigning to an array element is like assigning to the array
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200381func foo60(i *int) *int { // ERROR "leaking param: i"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200382 var a [12]*int
383 a[0] = i
384 return a[1]
385}
386
Russ Coxdb5f9da2011-08-28 12:05:00 -0400387func foo60a(i *int) *int { // ERROR "i does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200388 var a [12]*int
389 a[0] = i
390 return nil
391}
392
393// assigning to a struct field is like assigning to the struct
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200394func foo61(i *int) *int { // ERROR "leaking param: i"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200395 type S struct {
Russ Coxdb5f9da2011-08-28 12:05:00 -0400396 a, b *int
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200397 }
398 var s S
399 s.a = i
400 return s.b
401}
402
Russ Coxdb5f9da2011-08-28 12:05:00 -0400403func foo61a(i *int) *int { // ERROR "i does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200404 type S struct {
Russ Coxdb5f9da2011-08-28 12:05:00 -0400405 a, b *int
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200406 }
407 var s S
408 s.a = i
409 return nil
410}
411
412// assigning to a struct field is like assigning to the struct but
413// here this subtlety is lost, since s.a counts as an assignment to a
414// track-losing dereference.
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200415func foo62(i *int) *int { // ERROR "leaking param: i"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200416 type S struct {
Russ Coxdb5f9da2011-08-28 12:05:00 -0400417 a, b *int
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200418 }
Russ Coxdb5f9da2011-08-28 12:05:00 -0400419 s := new(S) // ERROR "new[(]S[)] does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200420 s.a = i
Russ Coxdb5f9da2011-08-28 12:05:00 -0400421 return nil // s.b
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200422}
423
Russ Coxdb5f9da2011-08-28 12:05:00 -0400424type M interface {
425 M()
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200426}
427
Russ Coxdb5f9da2011-08-28 12:05:00 -0400428func foo63(m M) { // ERROR "m does not escape"
429}
430
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200431func foo64(m M) { // ERROR "leaking param: m"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200432 m.M()
433}
434
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200435func foo64b(m M) { // ERROR "leaking param: m"
Luuk van Dijkf2460a82011-09-07 19:03:11 +0200436 defer m.M()
437}
438
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200439type MV int
Russ Coxdb5f9da2011-08-28 12:05:00 -0400440
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200441func (MV) M() {}
442
443func foo65() {
444 var mv MV
Russ Coxb4df33a2011-11-01 11:02:43 -0400445 foo63(&mv) // ERROR "&mv does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200446}
447
448func foo66() {
Russ Coxb4df33a2011-11-01 11:02:43 -0400449 var mv MV // ERROR "moved to heap: mv"
450 foo64(&mv) // ERROR "&mv escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200451}
452
453func foo67() {
454 var mv MV
455 foo63(mv)
456}
457
458func foo68() {
459 var mv MV
Russ Coxdb5f9da2011-08-28 12:05:00 -0400460 foo64(mv) // escapes but it's an int so irrelevant
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200461}
462
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200463func foo69(m M) { // ERROR "leaking param: m"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200464 foo64(m)
465}
466
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200467func foo70(mv1 *MV, m M) { // ERROR "leaking param: mv1" "leaking param: m"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200468 m = mv1
469 foo64(m)
470}
471
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200472func foo71(x *int) []*int { // ERROR "leaking param: x"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200473 var y []*int
474 y = append(y, x)
475 return y
476}
477
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200478func foo71a(x int) []*int { // ERROR "moved to heap: x"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200479 var y []*int
Russ Coxb4df33a2011-11-01 11:02:43 -0400480 y = append(y, &x) // ERROR "&x escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200481 return y
482}
483
484func foo72() {
485 var x int
486 var y [1]*int
Russ Coxb4df33a2011-11-01 11:02:43 -0400487 y[0] = &x // ERROR "&x does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200488}
489
490func foo72aa() [10]*int {
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200491 var x int // ERROR "moved to heap: x"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200492 var y [10]*int
Russ Coxb4df33a2011-11-01 11:02:43 -0400493 y[0] = &x // ERROR "&x escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200494 return y
495}
496
497func foo72a() {
498 var y [10]*int
499 for i := 0; i < 10; i++ {
Russ Coxdb5f9da2011-08-28 12:05:00 -0400500 // escapes its scope
Russ Coxb4df33a2011-11-01 11:02:43 -0400501 x := i // ERROR "moved to heap: x"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400502 y[i] = &x // ERROR "&x escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200503 }
504 return
505}
506
507func foo72b() [10]*int {
508 var y [10]*int
509 for i := 0; i < 10; i++ {
Russ Coxb4df33a2011-11-01 11:02:43 -0400510 x := i // ERROR "moved to heap: x"
511 y[i] = &x // ERROR "&x escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200512 }
513 return y
514}
515
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200516// issue 2145
517func foo73() {
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200518 s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200519 for _, v := range s {
Russ Coxb4df33a2011-11-01 11:02:43 -0400520 vv := v // ERROR "moved to heap: vv"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400521 // actually just escapes its scope
522 defer func() { // ERROR "func literal escapes to heap"
Russ Coxb4df33a2011-11-01 11:02:43 -0400523 println(vv) // ERROR "&vv escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200524 }()
525 }
526}
527
528func foo74() {
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200529 s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200530 for _, v := range s {
Russ Coxb4df33a2011-11-01 11:02:43 -0400531 vv := v // ERROR "moved to heap: vv"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400532 // actually just escapes its scope
533 fn := func() { // ERROR "func literal escapes to heap"
Russ Coxb4df33a2011-11-01 11:02:43 -0400534 println(vv) // ERROR "&vv escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200535 }
536 defer fn()
537 }
538}
539
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200540func myprint(y *int, x ...interface{}) *int { // ERROR "x does not escape" "leaking param: y"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200541 return y
542}
543
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200544func myprint1(y *int, x ...interface{}) *interface{} { // ERROR "y does not escape" "leaking param: x"
Russ Coxb4df33a2011-11-01 11:02:43 -0400545 return &x[0] // ERROR "&x.0. escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200546}
547
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200548func foo75(z *int) { // ERROR "leaking param: z"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400549 myprint(z, 1, 2, 3) // ERROR "[.][.][.] argument does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200550}
551
Russ Coxdb5f9da2011-08-28 12:05:00 -0400552func foo75a(z *int) { // ERROR "z does not escape"
553 myprint1(z, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200554}
555
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200556func foo76(z *int) { // ERROR "leaking param: z"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400557 myprint(nil, z) // ERROR "[.][.][.] argument does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200558}
559
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200560func foo76a(z *int) { // ERROR "leaking param: z"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400561 myprint1(nil, z) // ERROR "[.][.][.] argument escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200562}
563
564func foo76b() {
Russ Coxdb5f9da2011-08-28 12:05:00 -0400565 myprint(nil, 1, 2, 3) // ERROR "[.][.][.] argument does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200566}
567
568func foo76c() {
Russ Coxdb5f9da2011-08-28 12:05:00 -0400569 myprint1(nil, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200570}
571
572func foo76d() {
Russ Coxdb5f9da2011-08-28 12:05:00 -0400573 defer myprint(nil, 1, 2, 3) // ERROR "[.][.][.] argument does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200574}
575
576func foo76e() {
Russ Coxdb5f9da2011-08-28 12:05:00 -0400577 defer myprint1(nil, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200578}
579
580func foo76f() {
581 for {
Russ Coxdb5f9da2011-08-28 12:05:00 -0400582 // TODO: This one really only escapes its scope, but we don't distinguish yet.
583 defer myprint(nil, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200584 }
585}
586
587func foo76g() {
588 for {
Russ Coxdb5f9da2011-08-28 12:05:00 -0400589 defer myprint1(nil, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200590 }
591}
592
Russ Coxdb5f9da2011-08-28 12:05:00 -0400593func foo77(z []interface{}) { // ERROR "z does not escape"
594 myprint(nil, z...) // z does not escape
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200595}
596
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200597func foo77a(z []interface{}) { // ERROR "leaking param: z"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200598 myprint1(nil, z...)
599}
600
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200601func foo78(z int) *int { // ERROR "moved to heap: z"
Russ Coxb4df33a2011-11-01 11:02:43 -0400602 return &z // ERROR "&z escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200603}
604
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200605func foo78a(z int) *int { // ERROR "moved to heap: z"
Russ Coxb4df33a2011-11-01 11:02:43 -0400606 y := &z // ERROR "&z escapes to heap"
607 x := &y // ERROR "&y does not escape"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400608 return *x // really return y
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200609}
610
611func foo79() *int {
Russ Coxdb5f9da2011-08-28 12:05:00 -0400612 return new(int) // ERROR "new[(]int[)] escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200613}
614
615func foo80() *int {
616 var z *int
617 for {
Russ Coxdb5f9da2011-08-28 12:05:00 -0400618 // Really just escapes its scope but we don't distinguish
619 z = new(int) // ERROR "new[(]int[)] escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200620 }
621 _ = z
622 return nil
623}
624
625func foo81() *int {
626 for {
Russ Coxdb5f9da2011-08-28 12:05:00 -0400627 z := new(int) // ERROR "new[(]int[)] does not escape"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200628 _ = z
629 }
630 return nil
631}
632
633type Fooer interface {
634 Foo()
635}
636
637type LimitedFooer struct {
Russ Coxdb5f9da2011-08-28 12:05:00 -0400638 Fooer
639 N int64
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200640}
641
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200642func LimitFooer(r Fooer, n int64) Fooer { // ERROR "leaking param: r"
643 return &LimitedFooer{r, n} // ERROR "&LimitedFooer literal escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200644}
645
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200646func foo90(x *int) map[*int]*int { // ERROR "leaking param: x"
Russ Cox434a6c82011-12-02 14:45:07 -0500647 return map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int literal escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200648}
649
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200650func foo91(x *int) map[*int]*int { // ERROR "leaking param: x"
Russ Cox434a6c82011-12-02 14:45:07 -0500651 return map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int literal escapes to heap"
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200652}
653
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200654func foo92(x *int) [2]*int { // ERROR "leaking param: x"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400655 return [2]*int{x, nil}
Luuk van Dijk847b61b2011-08-24 19:07:08 +0200656}
657
Russ Cox0227c452011-08-25 09:26:13 -0400658// does not leak c
Russ Coxdb5f9da2011-08-28 12:05:00 -0400659func foo93(c chan *int) *int { // ERROR "c does not escape"
Russ Cox0227c452011-08-25 09:26:13 -0400660 for v := range c {
661 return v
662 }
663 return nil
664}
665
666// does not leak m
Russ Coxdb5f9da2011-08-28 12:05:00 -0400667func foo94(m map[*int]*int, b bool) *int { // ERROR "m does not escape"
Russ Cox0227c452011-08-25 09:26:13 -0400668 for k, v := range m {
669 if b {
670 return k
671 }
672 return v
673 }
674 return nil
675}
676
677// does leak x
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200678func foo95(m map[*int]*int, x *int) { // ERROR "m does not escape" "leaking param: x"
Russ Cox0227c452011-08-25 09:26:13 -0400679 m[x] = x
680}
681
682// does not leak m
Russ Coxdb5f9da2011-08-28 12:05:00 -0400683func foo96(m []*int) *int { // ERROR "m does not escape"
Russ Cox0227c452011-08-25 09:26:13 -0400684 return m[0]
685}
686
687// does leak m
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200688func foo97(m [1]*int) *int { // ERROR "leaking param: m"
Russ Cox0227c452011-08-25 09:26:13 -0400689 return m[0]
690}
691
692// does not leak m
Russ Coxdb5f9da2011-08-28 12:05:00 -0400693func foo98(m map[int]*int) *int { // ERROR "m does not escape"
Russ Cox0227c452011-08-25 09:26:13 -0400694 return m[0]
695}
696
697// does leak m
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200698func foo99(m *[1]*int) []*int { // ERROR "leaking param: m"
Russ Cox0227c452011-08-25 09:26:13 -0400699 return m[:]
700}
701
702// does not leak m
Russ Coxdb5f9da2011-08-28 12:05:00 -0400703func foo100(m []*int) *int { // ERROR "m does not escape"
Russ Cox0227c452011-08-25 09:26:13 -0400704 for _, v := range m {
705 return v
706 }
707 return nil
708}
709
710// does leak m
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200711func foo101(m [1]*int) *int { // ERROR "leaking param: m"
Russ Cox0227c452011-08-25 09:26:13 -0400712 for _, v := range m {
713 return v
714 }
715 return nil
716}
717
Russ Coxdb5f9da2011-08-28 12:05:00 -0400718// does not leak m
719func foo101a(m [1]*int) *int { // ERROR "m does not escape"
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200720 for i := range m { // ERROR "moved to heap: i"
Russ Coxb4df33a2011-11-01 11:02:43 -0400721 return &i // ERROR "&i escapes to heap"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400722 }
723 return nil
724}
725
Russ Cox0227c452011-08-25 09:26:13 -0400726// does leak x
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200727func foo102(m []*int, x *int) { // ERROR "m does not escape" "leaking param: x"
Russ Cox0227c452011-08-25 09:26:13 -0400728 m[0] = x
729}
730
731// does not leak x
Russ Coxdb5f9da2011-08-28 12:05:00 -0400732func foo103(m [1]*int, x *int) { // ERROR "m does not escape" "x does not escape"
Russ Cox0227c452011-08-25 09:26:13 -0400733 m[0] = x
734}
735
736var y []*int
737
738// does not leak x
Russ Coxb4df33a2011-11-01 11:02:43 -0400739func foo104(x []*int) { // ERROR "x does not escape"
Russ Cox0227c452011-08-25 09:26:13 -0400740 copy(y, x)
741}
742
743// does not leak x
Russ Coxb4df33a2011-11-01 11:02:43 -0400744func foo105(x []*int) { // ERROR "x does not escape"
Russ Cox0227c452011-08-25 09:26:13 -0400745 _ = append(y, x...)
746}
747
748// does leak x
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200749func foo106(x *int) { // ERROR "leaking param: x"
Russ Cox0227c452011-08-25 09:26:13 -0400750 _ = append(y, x)
751}
Russ Coxdb5f9da2011-08-28 12:05:00 -0400752
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200753func foo107(x *int) map[*int]*int { // ERROR "leaking param: x"
754 return map[*int]*int{x: nil} // ERROR "map.* literal escapes to heap"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400755}
756
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200757func foo108(x *int) map[*int]*int { // ERROR "leaking param: x"
758 return map[*int]*int{nil: x} // ERROR "map.* literal escapes to heap"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400759}
760
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200761func foo109(x *int) *int { // ERROR "leaking param: x"
Russ Coxb4df33a2011-11-01 11:02:43 -0400762 m := map[*int]*int{x: nil} // ERROR "map.* literal does not escape"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400763 for k, _ := range m {
764 return k
765 }
766 return nil
767}
768
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200769func foo110(x *int) *int { // ERROR "leaking param: x"
Russ Coxb4df33a2011-11-01 11:02:43 -0400770 m := map[*int]*int{nil: x} // ERROR "map.* literal does not escape"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400771 return m[nil]
772}
773
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200774func foo111(x *int) *int { // ERROR "leaking param: x"
Russ Coxb4df33a2011-11-01 11:02:43 -0400775 m := []*int{x} // ERROR "\[\]\*int literal does not escape"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400776 return m[0]
777}
778
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200779func foo112(x *int) *int { // ERROR "leaking param: x"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400780 m := [1]*int{x}
781 return m[0]
782}
783
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200784func foo113(x *int) *int { // ERROR "leaking param: x"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400785 m := Bar{ii: x}
786 return m.ii
787}
788
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200789func foo114(x *int) *int { // ERROR "leaking param: x"
Russ Coxb4df33a2011-11-01 11:02:43 -0400790 m := &Bar{ii: x} // ERROR "&Bar literal does not escape"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400791 return m.ii
792}
793
Luuk van Dijkb536adb2011-10-08 19:37:06 +0200794func foo115(x *int) *int { // ERROR "leaking param: x"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400795 return (*int)(unsafe.Pointer(uintptr(unsafe.Pointer(x)) + 1))
796}
797
798func foo116(b bool) *int {
799 if b {
Russ Coxb4df33a2011-11-01 11:02:43 -0400800 x := 1 // ERROR "moved to heap: x"
801 return &x // ERROR "&x escapes to heap"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400802 } else {
Russ Coxb4df33a2011-11-01 11:02:43 -0400803 y := 1 // ERROR "moved to heap: y"
804 return &y // ERROR "&y escapes to heap"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400805 }
806 return nil
807}
808
Russ Coxb4df33a2011-11-01 11:02:43 -0400809func foo117(unknown func(interface{})) { // ERROR "unknown does not escape"
810 x := 1 // ERROR "moved to heap: x"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400811 unknown(&x) // ERROR "&x escapes to heap"
812}
813
Russ Coxb4df33a2011-11-01 11:02:43 -0400814func foo118(unknown func(*int)) { // ERROR "unknown does not escape"
815 x := 1 // ERROR "moved to heap: x"
Russ Coxdb5f9da2011-08-28 12:05:00 -0400816 unknown(&x) // ERROR "&x escapes to heap"
817}
Russ Cox77f0bdc2011-08-28 23:29:34 -0400818
819func external(*int)
820
Russ Coxb4df33a2011-11-01 11:02:43 -0400821func foo119(x *int) { // ERROR "leaking param: x"
Russ Cox77f0bdc2011-08-28 23:29:34 -0400822 external(x)
823}
Russ Cox60d47102011-09-01 13:44:46 -0400824
825func foo120() {
826 // formerly exponential time analysis
827L1:
828L2:
829L3:
830L4:
831L5:
832L6:
833L7:
834L8:
835L9:
836L10:
837L11:
838L12:
839L13:
840L14:
841L15:
842L16:
843L17:
844L18:
845L19:
846L20:
847L21:
848L22:
849L23:
850L24:
851L25:
852L26:
853L27:
854L28:
855L29:
856L30:
857L31:
858L32:
859L33:
860L34:
861L35:
862L36:
863L37:
864L38:
865L39:
866L40:
867L41:
868L42:
869L43:
870L44:
871L45:
872L46:
873L47:
874L48:
875L49:
876L50:
877L51:
878L52:
879L53:
880L54:
881L55:
882L56:
883L57:
884L58:
885L59:
886L60:
887L61:
888L62:
889L63:
890L64:
891L65:
892L66:
893L67:
894L68:
895L69:
896L70:
897L71:
898L72:
899L73:
900L74:
901L75:
902L76:
903L77:
904L78:
905L79:
906L80:
907L81:
908L82:
909L83:
910L84:
911L85:
912L86:
913L87:
914L88:
915L89:
916L90:
917L91:
918L92:
919L93:
920L94:
921L95:
922L96:
923L97:
924L98:
925L99:
926L100:
927 // use the labels to silence compiler errors
928 goto L1
929 goto L2
930 goto L3
931 goto L4
932 goto L5
933 goto L6
934 goto L7
935 goto L8
936 goto L9
937 goto L10
938 goto L11
939 goto L12
940 goto L13
941 goto L14
942 goto L15
943 goto L16
944 goto L17
945 goto L18
946 goto L19
947 goto L20
948 goto L21
949 goto L22
950 goto L23
951 goto L24
952 goto L25
953 goto L26
954 goto L27
955 goto L28
956 goto L29
957 goto L30
958 goto L31
959 goto L32
960 goto L33
961 goto L34
962 goto L35
963 goto L36
964 goto L37
965 goto L38
966 goto L39
967 goto L40
968 goto L41
969 goto L42
970 goto L43
971 goto L44
972 goto L45
973 goto L46
974 goto L47
975 goto L48
976 goto L49
977 goto L50
978 goto L51
979 goto L52
980 goto L53
981 goto L54
982 goto L55
983 goto L56
984 goto L57
985 goto L58
986 goto L59
987 goto L60
988 goto L61
989 goto L62
990 goto L63
991 goto L64
992 goto L65
993 goto L66
994 goto L67
995 goto L68
996 goto L69
997 goto L70
998 goto L71
999 goto L72
1000 goto L73
1001 goto L74
1002 goto L75
1003 goto L76
1004 goto L77
1005 goto L78
1006 goto L79
1007 goto L80
1008 goto L81
1009 goto L82
1010 goto L83
1011 goto L84
1012 goto L85
1013 goto L86
1014 goto L87
1015 goto L88
1016 goto L89
1017 goto L90
1018 goto L91
1019 goto L92
1020 goto L93
1021 goto L94
1022 goto L95
1023 goto L96
1024 goto L97
1025 goto L98
1026 goto L99
1027 goto L100
1028}
Russ Coxb4df33a2011-11-01 11:02:43 -04001029
1030func foo121() {
1031 for i := 0; i < 10; i++ {
1032 defer myprint(nil, i) // ERROR "[.][.][.] argument escapes to heap"
1033 go myprint(nil, i) // ERROR "[.][.][.] argument escapes to heap"
1034 }
1035}
1036
1037// same as foo121 but check across import
1038func foo121b() {
1039 for i := 0; i < 10; i++ {
1040 defer fmt.Printf("%d", i) // ERROR "[.][.][.] argument escapes to heap"
1041 go fmt.Printf("%d", i) // ERROR "[.][.][.] argument escapes to heap"
1042 }
1043}
Luuk van Dijk9bf34782011-12-15 17:35:59 +01001044
1045// a harmless forward jump
1046func foo122() {
1047 var i *int
1048
1049 goto L1
1050L1:
Rémy Oudompheng94ff3112012-01-12 12:08:40 +01001051 i = new(int) // ERROR "does not escape"
Luuk van Dijk9bf34782011-12-15 17:35:59 +01001052 _ = i
1053}
1054
1055// a backward jump, increases loopdepth
1056func foo123() {
1057 var i *int
1058
1059L1:
Rémy Oudompheng94ff3112012-01-12 12:08:40 +01001060 i = new(int) // ERROR "escapes"
Luuk van Dijk9bf34782011-12-15 17:35:59 +01001061
1062 goto L1
1063 _ = i
Rémy Oudompheng94ff3112012-01-12 12:08:40 +01001064}