Home | History | Annotate | Download | only in test
      1 // errorcheck -0 -N -m -l
      2 
      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 
      7 // Test, using compiler diagnostic flags, that the escape analysis is working.
      8 // Compiles but does not run.  Inlining is disabled.
      9 // Registerization is disabled too (-N), which should
     10 // have no effect on escape analysis.
     11 
     12 package foo
     13 
     14 import (
     15 	"fmt"
     16 	"unsafe"
     17 )
     18 
     19 var gxx *int
     20 
     21 func foo1(x int) { // ERROR "moved to heap: x$"
     22 	gxx = &x // ERROR "&x escapes to heap$"
     23 }
     24 
     25 func foo2(yy *int) { // ERROR "leaking param: yy$"
     26 	gxx = yy
     27 }
     28 
     29 func foo3(x int) *int { // ERROR "moved to heap: x$"
     30 	return &x // ERROR "&x escapes to heap$"
     31 }
     32 
     33 type T *T
     34 
     35 func foo3b(t T) { // ERROR "leaking param: t$"
     36 	*t = t
     37 }
     38 
     39 // xx isn't going anywhere, so use of yy is ok
     40 func foo4(xx, yy *int) { // ERROR "foo4 xx does not escape$" "foo4 yy does not escape$"
     41 	xx = yy
     42 }
     43 
     44 // xx isn't going anywhere, so taking address of yy is ok
     45 func foo5(xx **int, yy *int) { // ERROR "foo5 xx does not escape$" "foo5 yy does not escape$"
     46 	xx = &yy // ERROR "foo5 &yy does not escape$"
     47 }
     48 
     49 func foo6(xx **int, yy *int) { // ERROR "foo6 xx does not escape$" "leaking param: yy$"
     50 	*xx = yy
     51 }
     52 
     53 func foo7(xx **int, yy *int) { // ERROR "foo7 xx does not escape$" "foo7 yy does not escape$"
     54 	**xx = *yy
     55 }
     56 
     57 func foo8(xx, yy *int) int { // ERROR "foo8 xx does not escape$" "foo8 yy does not escape$"
     58 	xx = yy
     59 	return *xx
     60 }
     61 
     62 func foo9(xx, yy *int) *int { // ERROR "leaking param: xx to result ~r2 level=0$" "leaking param: yy to result ~r2 level=0$"
     63 	xx = yy
     64 	return xx
     65 }
     66 
     67 func foo10(xx, yy *int) { // ERROR "foo10 xx does not escape$" "foo10 yy does not escape$"
     68 	*xx = *yy
     69 }
     70 
     71 func foo11() int {
     72 	x, y := 0, 42
     73 	xx := &x // ERROR "foo11 &x does not escape$"
     74 	yy := &y // ERROR "foo11 &y does not escape$"
     75 	*xx = *yy
     76 	return x
     77 }
     78 
     79 var xxx **int
     80 
     81 func foo12(yyy **int) { // ERROR "leaking param: yyy$"
     82 	xxx = yyy
     83 }
     84 
     85 // Must treat yyy as leaking because *yyy leaks, and the escape analysis
     86 // summaries in exported metadata do not distinguish these two cases.
     87 func foo13(yyy **int) { // ERROR "leaking param content: yyy$"
     88 	*xxx = *yyy
     89 }
     90 
     91 func foo14(yyy **int) { // ERROR "foo14 yyy does not escape$"
     92 	**xxx = **yyy
     93 }
     94 
     95 func foo15(yy *int) { // ERROR "moved to heap: yy$"
     96 	xxx = &yy // ERROR "&yy escapes to heap$"
     97 }
     98 
     99 func foo16(yy *int) { // ERROR "leaking param: yy$"
    100 	*xxx = yy
    101 }
    102 
    103 func foo17(yy *int) { // ERROR "foo17 yy does not escape$"
    104 	**xxx = *yy
    105 }
    106 
    107 func foo18(y int) { // ERROR "moved to heap: y$"
    108 	*xxx = &y // ERROR "&y escapes to heap$"
    109 }
    110 
    111 func foo19(y int) {
    112 	**xxx = y
    113 }
    114 
    115 type Bar struct {
    116 	i  int
    117 	ii *int
    118 }
    119 
    120 func NewBar() *Bar {
    121 	return &Bar{42, nil} // ERROR "&Bar literal escapes to heap$"
    122 }
    123 
    124 func NewBarp(x *int) *Bar { // ERROR "leaking param: x to result ~r1 level=-1$"
    125 	return &Bar{42, x} // ERROR "&Bar literal escapes to heap$"
    126 }
    127 
    128 func NewBarp2(x *int) *Bar { // ERROR "NewBarp2 x does not escape$"
    129 	return &Bar{*x, nil} // ERROR "&Bar literal escapes to heap$"
    130 }
    131 
    132 func (b *Bar) NoLeak() int { // ERROR "\(\*Bar\).NoLeak b does not escape$"
    133 	return *(b.ii)
    134 }
    135 
    136 func (b *Bar) Leak() *int { // ERROR "leaking param: b to result ~r0 level=0$"
    137 	return &b.i // ERROR "&b.i escapes to heap$"
    138 }
    139 
    140 func (b *Bar) AlsoNoLeak() *int { // ERROR "leaking param: b to result ~r0 level=1$"
    141 	return b.ii
    142 }
    143 
    144 func (b Bar) AlsoLeak() *int { // ERROR "leaking param: b to result ~r0 level=0$"
    145 	return b.ii
    146 }
    147 
    148 func (b Bar) LeaksToo() *int { // ERROR "leaking param: b to result ~r0 level=0$"
    149 	v := 0    // ERROR "moved to heap: v$"
    150 	b.ii = &v // ERROR "&v escapes to heap$"
    151 	return b.ii
    152 }
    153 
    154 func (b *Bar) LeaksABit() *int { // ERROR "leaking param: b to result ~r0 level=1$"
    155 	v := 0    // ERROR "moved to heap: v$"
    156 	b.ii = &v // ERROR "&v escapes to heap$"
    157 	return b.ii
    158 }
    159 
    160 func (b Bar) StillNoLeak() int { // ERROR "Bar.StillNoLeak b does not escape$"
    161 	v := 0
    162 	b.ii = &v // ERROR "Bar.StillNoLeak &v does not escape$"
    163 	return b.i
    164 }
    165 
    166 func goLeak(b *Bar) { // ERROR "leaking param: b$"
    167 	go b.NoLeak()
    168 }
    169 
    170 type Bar2 struct {
    171 	i  [12]int
    172 	ii []int
    173 }
    174 
    175 func NewBar2() *Bar2 {
    176 	return &Bar2{[12]int{42}, nil} // ERROR "&Bar2 literal escapes to heap$"
    177 }
    178 
    179 func (b *Bar2) NoLeak() int { // ERROR "\(\*Bar2\).NoLeak b does not escape$"
    180 	return b.i[0]
    181 }
    182 
    183 func (b *Bar2) Leak() []int { // ERROR "leaking param: b to result ~r0 level=0$"
    184 	return b.i[:] // ERROR "b.i escapes to heap$"
    185 }
    186 
    187 func (b *Bar2) AlsoNoLeak() []int { // ERROR "leaking param: b to result ~r0 level=1$"
    188 	return b.ii[0:1]
    189 }
    190 
    191 func (b Bar2) AgainNoLeak() [12]int { // ERROR "Bar2.AgainNoLeak b does not escape$"
    192 	return b.i
    193 }
    194 
    195 func (b *Bar2) LeakSelf() { // ERROR "leaking param: b$"
    196 	b.ii = b.i[0:4] // ERROR "b.i escapes to heap$"
    197 }
    198 
    199 func (b *Bar2) LeakSelf2() { // ERROR "leaking param: b$"
    200 	var buf []int
    201 	buf = b.i[0:] // ERROR "b.i escapes to heap$"
    202 	b.ii = buf
    203 }
    204 
    205 func foo21() func() int {
    206 	x := 42
    207 	return func() int { // ERROR "func literal escapes to heap$"
    208 		return x
    209 	}
    210 }
    211 
    212 func foo21a() func() int {
    213 	x := 42             // ERROR "moved to heap: x$"
    214 	return func() int { // ERROR "func literal escapes to heap$"
    215 		x++ // ERROR "&x escapes to heap$"
    216 		return x
    217 	}
    218 }
    219 
    220 func foo22() int {
    221 	x := 42
    222 	return func() int { // ERROR "foo22 func literal does not escape$"
    223 		return x
    224 	}()
    225 }
    226 
    227 func foo23(x int) func() int {
    228 	return func() int { // ERROR "func literal escapes to heap$"
    229 		return x
    230 	}
    231 }
    232 
    233 func foo23a(x int) func() int {
    234 	f := func() int { // ERROR "func literal escapes to heap$"
    235 		return x
    236 	}
    237 	return f
    238 }
    239 
    240 func foo23b(x int) *(func() int) {
    241 	f := func() int { return x } // ERROR "func literal escapes to heap$" "moved to heap: f$"
    242 	return &f                    // ERROR "&f escapes to heap$"
    243 }
    244 
    245 func foo23c(x int) func() int { // ERROR "moved to heap: x$"
    246 	return func() int { // ERROR "func literal escapes to heap$"
    247 		x++ // ERROR "&x escapes to heap$"
    248 		return x
    249 	}
    250 }
    251 
    252 func foo24(x int) int {
    253 	return func() int { // ERROR "foo24 func literal does not escape$"
    254 		return x
    255 	}()
    256 }
    257 
    258 var x *int
    259 
    260 func fooleak(xx *int) int { // ERROR "leaking param: xx$"
    261 	x = xx
    262 	return *x
    263 }
    264 
    265 func foonoleak(xx *int) int { // ERROR "foonoleak xx does not escape$"
    266 	return *x + *xx
    267 }
    268 
    269 func foo31(x int) int { // ERROR "moved to heap: x$"
    270 	return fooleak(&x) // ERROR "&x escapes to heap$"
    271 }
    272 
    273 func foo32(x int) int {
    274 	return foonoleak(&x) // ERROR "foo32 &x does not escape$"
    275 }
    276 
    277 type Foo struct {
    278 	xx *int
    279 	x  int
    280 }
    281 
    282 var F Foo
    283 var pf *Foo
    284 
    285 func (f *Foo) fooleak() { // ERROR "leaking param: f$"
    286 	pf = f
    287 }
    288 
    289 func (f *Foo) foonoleak() { // ERROR "\(\*Foo\).foonoleak f does not escape$"
    290 	F.x = f.x
    291 }
    292 
    293 func (f *Foo) Leak() { // ERROR "leaking param: f$"
    294 	f.fooleak()
    295 }
    296 
    297 func (f *Foo) NoLeak() { // ERROR "\(\*Foo\).NoLeak f does not escape$"
    298 	f.foonoleak()
    299 }
    300 
    301 func foo41(x int) { // ERROR "moved to heap: x$"
    302 	F.xx = &x // ERROR "&x escapes to heap$"
    303 }
    304 
    305 func (f *Foo) foo42(x int) { // ERROR "\(\*Foo\).foo42 f does not escape$" "moved to heap: x$"
    306 	f.xx = &x // ERROR "&x escapes to heap$"
    307 }
    308 
    309 func foo43(f *Foo, x int) { // ERROR "foo43 f does not escape$" "moved to heap: x$"
    310 	f.xx = &x // ERROR "&x escapes to heap$"
    311 }
    312 
    313 func foo44(yy *int) { // ERROR "leaking param: yy$"
    314 	F.xx = yy
    315 }
    316 
    317 func (f *Foo) foo45() { // ERROR "\(\*Foo\).foo45 f does not escape$"
    318 	F.x = f.x
    319 }
    320 
    321 // See foo13 above for explanation of why f leaks.
    322 func (f *Foo) foo46() { // ERROR "leaking param content: f$"
    323 	F.xx = f.xx
    324 }
    325 
    326 func (f *Foo) foo47() { // ERROR "leaking param: f$"
    327 	f.xx = &f.x // ERROR "&f.x escapes to heap$"
    328 }
    329 
    330 var ptrSlice []*int
    331 
    332 func foo50(i *int) { // ERROR "leaking param: i$"
    333 	ptrSlice[0] = i
    334 }
    335 
    336 var ptrMap map[*int]*int
    337 
    338 func foo51(i *int) { // ERROR "leaking param: i$"
    339 	ptrMap[i] = i
    340 }
    341 
    342 func indaddr1(x int) *int { // ERROR "moved to heap: x$"
    343 	return &x // ERROR "&x escapes to heap$"
    344 }
    345 
    346 func indaddr2(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$"
    347 	return *&x // ERROR "indaddr2 &x does not escape$"
    348 }
    349 
    350 func indaddr3(x *int32) *int { // ERROR "leaking param: x to result ~r1 level=0$"
    351 	return *(**int)(unsafe.Pointer(&x)) // ERROR "indaddr3 &x does not escape$"
    352 }
    353 
    354 // From package math:
    355 
    356 func Float32bits(f float32) uint32 {
    357 	return *(*uint32)(unsafe.Pointer(&f)) // ERROR "Float32bits &f does not escape$"
    358 }
    359 
    360 func Float32frombits(b uint32) float32 {
    361 	return *(*float32)(unsafe.Pointer(&b)) // ERROR "Float32frombits &b does not escape$"
    362 }
    363 
    364 func Float64bits(f float64) uint64 {
    365 	return *(*uint64)(unsafe.Pointer(&f)) // ERROR "Float64bits &f does not escape$"
    366 }
    367 
    368 func Float64frombits(b uint64) float64 {
    369 	return *(*float64)(unsafe.Pointer(&b)) // ERROR "Float64frombits &b does not escape$"
    370 }
    371 
    372 // contrast with
    373 func float64bitsptr(f float64) *uint64 { // ERROR "moved to heap: f$"
    374 	return (*uint64)(unsafe.Pointer(&f)) // ERROR "&f escapes to heap$"
    375 }
    376 
    377 func float64ptrbitsptr(f *float64) *uint64 { // ERROR "leaking param: f to result ~r1 level=0$"
    378 	return (*uint64)(unsafe.Pointer(f))
    379 }
    380 
    381 func typesw(i interface{}) *int { // ERROR "leaking param: i to result ~r1 level=0$"
    382 	switch val := i.(type) {
    383 	case *int:
    384 		return val
    385 	case *int8:
    386 		v := int(*val) // ERROR "moved to heap: v$"
    387 		return &v      // ERROR "&v escapes to heap$"
    388 	}
    389 	return nil
    390 }
    391 
    392 func exprsw(i *int) *int { // ERROR "leaking param: i to result ~r1 level=0$"
    393 	switch j := i; *j + 110 {
    394 	case 12:
    395 		return j
    396 	case 42:
    397 		return nil
    398 	}
    399 	return nil
    400 
    401 }
    402 
    403 // assigning to an array element is like assigning to the array
    404 func foo60(i *int) *int { // ERROR "leaking param: i to result ~r1 level=0$"
    405 	var a [12]*int
    406 	a[0] = i
    407 	return a[1]
    408 }
    409 
    410 func foo60a(i *int) *int { // ERROR "foo60a i does not escape$"
    411 	var a [12]*int
    412 	a[0] = i
    413 	return nil
    414 }
    415 
    416 // assigning to a struct field  is like assigning to the struct
    417 func foo61(i *int) *int { // ERROR "leaking param: i to result ~r1 level=0$"
    418 	type S struct {
    419 		a, b *int
    420 	}
    421 	var s S
    422 	s.a = i
    423 	return s.b
    424 }
    425 
    426 func foo61a(i *int) *int { // ERROR "foo61a i does not escape$"
    427 	type S struct {
    428 		a, b *int
    429 	}
    430 	var s S
    431 	s.a = i
    432 	return nil
    433 }
    434 
    435 // assigning to a struct field is like assigning to the struct but
    436 // here this subtlety is lost, since s.a counts as an assignment to a
    437 // track-losing dereference.
    438 func foo62(i *int) *int { // ERROR "leaking param: i$"
    439 	type S struct {
    440 		a, b *int
    441 	}
    442 	s := new(S) // ERROR "foo62 new\(S\) does not escape$"
    443 	s.a = i
    444 	return nil // s.b
    445 }
    446 
    447 type M interface {
    448 	M()
    449 }
    450 
    451 func foo63(m M) { // ERROR "foo63 m does not escape$"
    452 }
    453 
    454 func foo64(m M) { // ERROR "leaking param: m$"
    455 	m.M()
    456 }
    457 
    458 func foo64b(m M) { // ERROR "leaking param: m$"
    459 	defer m.M()
    460 }
    461 
    462 type MV int
    463 
    464 func (MV) M() {}
    465 
    466 func foo65() {
    467 	var mv MV
    468 	foo63(&mv) // ERROR "foo65 &mv does not escape$"
    469 }
    470 
    471 func foo66() {
    472 	var mv MV  // ERROR "moved to heap: mv$"
    473 	foo64(&mv) // ERROR "&mv escapes to heap$"
    474 }
    475 
    476 func foo67() {
    477 	var mv MV
    478 	foo63(mv) // ERROR "foo67 mv does not escape$"
    479 }
    480 
    481 func foo68() {
    482 	var mv MV
    483 	// escapes but it's an int so irrelevant
    484 	foo64(mv) // ERROR "mv escapes to heap$"
    485 }
    486 
    487 func foo69(m M) { // ERROR "leaking param: m$"
    488 	foo64(m)
    489 }
    490 
    491 func foo70(mv1 *MV, m M) { // ERROR "leaking param: m$" "leaking param: mv1$"
    492 	m = mv1 // ERROR "mv1 escapes to heap$"
    493 	foo64(m)
    494 }
    495 
    496 func foo71(x *int) []*int { // ERROR "leaking param: x$"
    497 	var y []*int
    498 	y = append(y, x)
    499 	return y
    500 }
    501 
    502 func foo71a(x int) []*int { // ERROR "moved to heap: x$"
    503 	var y []*int
    504 	y = append(y, &x) // ERROR "&x escapes to heap$"
    505 	return y
    506 }
    507 
    508 func foo72() {
    509 	var x int
    510 	var y [1]*int
    511 	y[0] = &x // ERROR "foo72 &x does not escape$"
    512 }
    513 
    514 func foo72aa() [10]*int {
    515 	var x int // ERROR "moved to heap: x$"
    516 	var y [10]*int
    517 	y[0] = &x // ERROR "&x escapes to heap$"
    518 	return y
    519 }
    520 
    521 func foo72a() {
    522 	var y [10]*int
    523 	for i := 0; i < 10; i++ {
    524 		// escapes its scope
    525 		x := i    // ERROR "moved to heap: x$"
    526 		y[i] = &x // ERROR "&x escapes to heap$"
    527 	}
    528 	return
    529 }
    530 
    531 func foo72b() [10]*int {
    532 	var y [10]*int
    533 	for i := 0; i < 10; i++ {
    534 		x := i    // ERROR "moved to heap: x$"
    535 		y[i] = &x // ERROR "&x escapes to heap$"
    536 	}
    537 	return y
    538 }
    539 
    540 // issue 2145
    541 func foo73() {
    542 	s := []int{3, 2, 1} // ERROR "foo73 \[\]int literal does not escape$"
    543 	for _, v := range s {
    544 		vv := v
    545 		// actually just escapes its scope
    546 		defer func() { // ERROR "func literal escapes to heap$"
    547 			println(vv)
    548 		}()
    549 	}
    550 }
    551 
    552 func foo731() {
    553 	s := []int{3, 2, 1} // ERROR "foo731 \[\]int literal does not escape$"
    554 	for _, v := range s {
    555 		vv := v // ERROR "moved to heap: vv$"
    556 		// actually just escapes its scope
    557 		defer func() { // ERROR "func literal escapes to heap$"
    558 			vv = 42 // ERROR "&vv escapes to heap$"
    559 			println(vv)
    560 		}()
    561 	}
    562 }
    563 
    564 func foo74() {
    565 	s := []int{3, 2, 1} // ERROR "foo74 \[\]int literal does not escape$"
    566 	for _, v := range s {
    567 		vv := v
    568 		// actually just escapes its scope
    569 		fn := func() { // ERROR "func literal escapes to heap$"
    570 			println(vv)
    571 		}
    572 		defer fn()
    573 	}
    574 }
    575 
    576 func foo74a() {
    577 	s := []int{3, 2, 1} // ERROR "foo74a \[\]int literal does not escape$"
    578 	for _, v := range s {
    579 		vv := v // ERROR "moved to heap: vv$"
    580 		// actually just escapes its scope
    581 		fn := func() { // ERROR "func literal escapes to heap$"
    582 			vv += 1 // ERROR "&vv escapes to heap$"
    583 			println(vv)
    584 		}
    585 		defer fn()
    586 	}
    587 }
    588 
    589 // issue 3975
    590 func foo74b() {
    591 	var array [3]func()
    592 	s := []int{3, 2, 1} // ERROR "foo74b \[\]int literal does not escape$"
    593 	for i, v := range s {
    594 		vv := v
    595 		// actually just escapes its scope
    596 		array[i] = func() { // ERROR "func literal escapes to heap$"
    597 			println(vv)
    598 		}
    599 	}
    600 }
    601 
    602 func foo74c() {
    603 	var array [3]func()
    604 	s := []int{3, 2, 1} // ERROR "foo74c \[\]int literal does not escape$"
    605 	for i, v := range s {
    606 		vv := v // ERROR "moved to heap: vv$"
    607 		// actually just escapes its scope
    608 		array[i] = func() { // ERROR "func literal escapes to heap$"
    609 			println(&vv) // ERROR "&vv escapes to heap$" "foo74c.func1 &vv does not escape$"
    610 		}
    611 	}
    612 }
    613 
    614 func myprint(y *int, x ...interface{}) *int { // ERROR "leaking param: y to result ~r2 level=0$" "myprint x does not escape$"
    615 	return y
    616 }
    617 
    618 func myprint1(y *int, x ...interface{}) *interface{} { // ERROR "leaking param: x to result ~r2 level=0$" "myprint1 y does not escape$"
    619 	return &x[0] // ERROR "&x\[0\] escapes to heap$"
    620 }
    621 
    622 func foo75(z *int) { // ERROR "foo75 z does not escape$"
    623 	myprint(z, 1, 2, 3) // ERROR "1 escapes to heap$" "2 escapes to heap$" "3 escapes to heap$" "foo75 ... argument does not escape$"
    624 }
    625 
    626 func foo75a(z *int) { // ERROR "foo75a z does not escape$"
    627 	myprint1(z, 1, 2, 3) // ERROR "1 escapes to heap$" "2 escapes to heap$" "3 escapes to heap$" "foo75a ... argument does not escape$"
    628 }
    629 
    630 func foo75esc(z *int) { // ERROR "leaking param: z$"
    631 	gxx = myprint(z, 1, 2, 3) // ERROR "1 escapes to heap$" "2 escapes to heap$" "3 escapes to heap$" "foo75esc ... argument does not escape$"
    632 }
    633 
    634 func foo75aesc(z *int) { // ERROR "foo75aesc z does not escape$"
    635 	var ppi **interface{}       // assignments to pointer dereferences lose track
    636 	*ppi = myprint1(z, 1, 2, 3) // ERROR "... argument escapes to heap$" "1 escapes to heap$" "2 escapes to heap$" "3 escapes to heap$"
    637 }
    638 
    639 func foo75aesc1(z *int) { // ERROR "foo75aesc1 z does not escape$"
    640 	sink = myprint1(z, 1, 2, 3) // ERROR "... argument escapes to heap$" "1 escapes to heap$" "2 escapes to heap$" "3 escapes to heap$" "myprint1\(z, 1, 2, 3\) escapes to heap$"
    641 }
    642 
    643 // BAD: z does not escape here
    644 func foo76(z *int) { // ERROR "leaking param: z$"
    645 	myprint(nil, z) // ERROR "foo76 ... argument does not escape$" "z escapes to heap$"
    646 }
    647 
    648 // BAD: z does not escape here
    649 func foo76a(z *int) { // ERROR "leaking param: z$"
    650 	myprint1(nil, z) // ERROR "foo76a ... argument does not escape$" "z escapes to heap$"
    651 }
    652 
    653 func foo76b() {
    654 	myprint(nil, 1, 2, 3) // ERROR "1 escapes to heap$" "2 escapes to heap$" "3 escapes to heap$" "foo76b ... argument does not escape$"
    655 }
    656 
    657 func foo76c() {
    658 	myprint1(nil, 1, 2, 3) // ERROR "1 escapes to heap$" "2 escapes to heap$" "3 escapes to heap$" "foo76c ... argument does not escape$"
    659 }
    660 
    661 func foo76d() {
    662 	defer myprint(nil, 1, 2, 3) // ERROR "1 escapes to heap$" "2 escapes to heap$" "3 escapes to heap$" "foo76d ... argument does not escape$"
    663 }
    664 
    665 func foo76e() {
    666 	defer myprint1(nil, 1, 2, 3) // ERROR "1 escapes to heap$" "2 escapes to heap$" "3 escapes to heap$" "foo76e ... argument does not escape$"
    667 }
    668 
    669 func foo76f() {
    670 	for {
    671 		// TODO: This one really only escapes its scope, but we don't distinguish yet.
    672 		defer myprint(nil, 1, 2, 3) // ERROR "... argument escapes to heap$" "1 escapes to heap$" "2 escapes to heap$" "3 escapes to heap$"
    673 	}
    674 }
    675 
    676 func foo76g() {
    677 	for {
    678 		defer myprint1(nil, 1, 2, 3) // ERROR "... argument escapes to heap$" "1 escapes to heap$" "2 escapes to heap$" "3 escapes to heap$"
    679 	}
    680 }
    681 
    682 func foo77(z []interface{}) { // ERROR "foo77 z does not escape$"
    683 	myprint(nil, z...) // z does not escape
    684 }
    685 
    686 func foo77a(z []interface{}) { // ERROR "foo77a z does not escape$"
    687 	myprint1(nil, z...)
    688 }
    689 
    690 func foo77b(z []interface{}) { // ERROR "leaking param: z$"
    691 	var ppi **interface{}
    692 	*ppi = myprint1(nil, z...)
    693 }
    694 
    695 func foo77c(z []interface{}) { // ERROR "leaking param: z$"
    696 	sink = myprint1(nil, z...) // ERROR "myprint1\(nil, z...\) escapes to heap$"
    697 }
    698 
    699 func dotdotdot() {
    700 	// BAD: i should not escape here
    701 	i := 0           // ERROR "moved to heap: i$"
    702 	myprint(nil, &i) // ERROR "&i escapes to heap$" "dotdotdot ... argument does not escape$"
    703 
    704 	// BAD: j should not escape here
    705 	j := 0            // ERROR "moved to heap: j$"
    706 	myprint1(nil, &j) // ERROR "&j escapes to heap$" "dotdotdot ... argument does not escape$"
    707 }
    708 
    709 func foo78(z int) *int { // ERROR "moved to heap: z$"
    710 	return &z // ERROR "&z escapes to heap$"
    711 }
    712 
    713 func foo78a(z int) *int { // ERROR "moved to heap: z$"
    714 	y := &z   // ERROR "&z escapes to heap$"
    715 	x := &y   // ERROR "foo78a &y does not escape$"
    716 	return *x // really return y
    717 }
    718 
    719 func foo79() *int {
    720 	return new(int) // ERROR "new\(int\) escapes to heap$"
    721 }
    722 
    723 func foo80() *int {
    724 	var z *int
    725 	for {
    726 		// Really just escapes its scope but we don't distinguish
    727 		z = new(int) // ERROR "new\(int\) escapes to heap$"
    728 	}
    729 	_ = z
    730 	return nil
    731 }
    732 
    733 func foo81() *int {
    734 	for {
    735 		z := new(int) // ERROR "foo81 new\(int\) does not escape$"
    736 		_ = z
    737 	}
    738 	return nil
    739 }
    740 
    741 func tee(p *int) (x, y *int) { return p, p } // ERROR "leaking param: p to result x level=0$" "leaking param: p to result y level=0$"
    742 
    743 func noop(x, y *int) {} // ERROR "noop x does not escape$" "noop y does not escape$"
    744 
    745 func foo82() {
    746 	var x, y, z int  // ERROR "moved to heap: x$" "moved to heap: y$" "moved to heap: z$"
    747 	go noop(tee(&z)) // ERROR "&z escapes to heap$"
    748 	go noop(&x, &y)  // ERROR "&x escapes to heap$" "&y escapes to heap$"
    749 	for {
    750 		var u, v, w int     // ERROR "moved to heap: u$" "moved to heap: v$" "moved to heap: w$"
    751 		defer noop(tee(&u)) // ERROR "&u escapes to heap$"
    752 		defer noop(&v, &w)  // ERROR "&v escapes to heap$" "&w escapes to heap$"
    753 	}
    754 }
    755 
    756 type Fooer interface {
    757 	Foo()
    758 }
    759 
    760 type LimitedFooer struct {
    761 	Fooer
    762 	N int64
    763 }
    764 
    765 func LimitFooer(r Fooer, n int64) Fooer { // ERROR "leaking param: r to result ~r2 level=-1$"
    766 	return &LimitedFooer{r, n} // ERROR "&LimitedFooer literal escapes to heap$"
    767 }
    768 
    769 func foo90(x *int) map[*int]*int { // ERROR "leaking param: x$"
    770 	return map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int literal escapes to heap$"
    771 }
    772 
    773 func foo91(x *int) map[*int]*int { // ERROR "leaking param: x$"
    774 	return map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int literal escapes to heap$"
    775 }
    776 
    777 func foo92(x *int) [2]*int { // ERROR "leaking param: x to result ~r1 level=0$"
    778 	return [2]*int{x, nil}
    779 }
    780 
    781 // does not leak c
    782 func foo93(c chan *int) *int { // ERROR "foo93 c does not escape$"
    783 	for v := range c {
    784 		return v
    785 	}
    786 	return nil
    787 }
    788 
    789 // does not leak m
    790 func foo94(m map[*int]*int, b bool) *int { // ERROR "leaking param: m to result ~r2 level=1"
    791 	for k, v := range m {
    792 		if b {
    793 			return k
    794 		}
    795 		return v
    796 	}
    797 	return nil
    798 }
    799 
    800 // does leak x
    801 func foo95(m map[*int]*int, x *int) { // ERROR "foo95 m does not escape$" "leaking param: x$"
    802 	m[x] = x
    803 }
    804 
    805 // does not leak m but does leak content
    806 func foo96(m []*int) *int { // ERROR "leaking param: m to result ~r1 level=1"
    807 	return m[0]
    808 }
    809 
    810 // does leak m
    811 func foo97(m [1]*int) *int { // ERROR "leaking param: m to result ~r1 level=0$"
    812 	return m[0]
    813 }
    814 
    815 // does not leak m
    816 func foo98(m map[int]*int) *int { // ERROR "foo98 m does not escape$"
    817 	return m[0]
    818 }
    819 
    820 // does leak m
    821 func foo99(m *[1]*int) []*int { // ERROR "leaking param: m to result ~r1 level=0$"
    822 	return m[:]
    823 }
    824 
    825 // does not leak m
    826 func foo100(m []*int) *int { // ERROR "leaking param: m to result ~r1 level=1"
    827 	for _, v := range m {
    828 		return v
    829 	}
    830 	return nil
    831 }
    832 
    833 // does leak m
    834 func foo101(m [1]*int) *int { // ERROR "leaking param: m to result ~r1 level=0$"
    835 	for _, v := range m {
    836 		return v
    837 	}
    838 	return nil
    839 }
    840 
    841 // does not leak m
    842 func foo101a(m [1]*int) *int { // ERROR "foo101a m does not escape$"
    843 	for i := range m { // ERROR "moved to heap: i$"
    844 		return &i // ERROR "&i escapes to heap$"
    845 	}
    846 	return nil
    847 }
    848 
    849 // does leak x
    850 func foo102(m []*int, x *int) { // ERROR "foo102 m does not escape$" "leaking param: x$"
    851 	m[0] = x
    852 }
    853 
    854 // does not leak x
    855 func foo103(m [1]*int, x *int) { // ERROR "foo103 m does not escape$" "foo103 x does not escape$"
    856 	m[0] = x
    857 }
    858 
    859 var y []*int
    860 
    861 // does not leak x but does leak content
    862 func foo104(x []*int) { // ERROR "leaking param content: x"
    863 	copy(y, x)
    864 }
    865 
    866 // does not leak x but does leak content
    867 func foo105(x []*int) { // ERROR "leaking param content: x"
    868 	_ = append(y, x...)
    869 }
    870 
    871 // does leak x
    872 func foo106(x *int) { // ERROR "leaking param: x$"
    873 	_ = append(y, x)
    874 }
    875 
    876 func foo107(x *int) map[*int]*int { // ERROR "leaking param: x$"
    877 	return map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int literal escapes to heap$"
    878 }
    879 
    880 func foo108(x *int) map[*int]*int { // ERROR "leaking param: x$"
    881 	return map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int literal escapes to heap$"
    882 }
    883 
    884 func foo109(x *int) *int { // ERROR "leaking param: x$"
    885 	m := map[*int]*int{x: nil} // ERROR "foo109 map\[\*int\]\*int literal does not escape$"
    886 	for k, _ := range m {
    887 		return k
    888 	}
    889 	return nil
    890 }
    891 
    892 func foo110(x *int) *int { // ERROR "leaking param: x$"
    893 	m := map[*int]*int{nil: x} // ERROR "foo110 map\[\*int\]\*int literal does not escape$"
    894 	return m[nil]
    895 }
    896 
    897 func foo111(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0"
    898 	m := []*int{x} // ERROR "foo111 \[\]\*int literal does not escape$"
    899 	return m[0]
    900 }
    901 
    902 func foo112(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$"
    903 	m := [1]*int{x}
    904 	return m[0]
    905 }
    906 
    907 func foo113(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$"
    908 	m := Bar{ii: x}
    909 	return m.ii
    910 }
    911 
    912 func foo114(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$"
    913 	m := &Bar{ii: x} // ERROR "foo114 &Bar literal does not escape$"
    914 	return m.ii
    915 }
    916 
    917 func foo115(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$"
    918 	return (*int)(unsafe.Pointer(uintptr(unsafe.Pointer(x)) + 1))
    919 }
    920 
    921 func foo116(b bool) *int {
    922 	if b {
    923 		x := 1    // ERROR "moved to heap: x$"
    924 		return &x // ERROR "&x escapes to heap$"
    925 	} else {
    926 		y := 1    // ERROR "moved to heap: y$"
    927 		return &y // ERROR "&y escapes to heap$"
    928 	}
    929 	return nil
    930 }
    931 
    932 func foo117(unknown func(interface{})) { // ERROR "foo117 unknown does not escape$"
    933 	x := 1      // ERROR "moved to heap: x$"
    934 	unknown(&x) // ERROR "&x escapes to heap$"
    935 }
    936 
    937 func foo118(unknown func(*int)) { // ERROR "foo118 unknown does not escape$"
    938 	x := 1      // ERROR "moved to heap: x$"
    939 	unknown(&x) // ERROR "&x escapes to heap$"
    940 }
    941 
    942 func external(*int)
    943 
    944 func foo119(x *int) { // ERROR "leaking param: x$"
    945 	external(x)
    946 }
    947 
    948 func foo120() {
    949 	// formerly exponential time analysis
    950 L1:
    951 L2:
    952 L3:
    953 L4:
    954 L5:
    955 L6:
    956 L7:
    957 L8:
    958 L9:
    959 L10:
    960 L11:
    961 L12:
    962 L13:
    963 L14:
    964 L15:
    965 L16:
    966 L17:
    967 L18:
    968 L19:
    969 L20:
    970 L21:
    971 L22:
    972 L23:
    973 L24:
    974 L25:
    975 L26:
    976 L27:
    977 L28:
    978 L29:
    979 L30:
    980 L31:
    981 L32:
    982 L33:
    983 L34:
    984 L35:
    985 L36:
    986 L37:
    987 L38:
    988 L39:
    989 L40:
    990 L41:
    991 L42:
    992 L43:
    993 L44:
    994 L45:
    995 L46:
    996 L47:
    997 L48:
    998 L49:
    999 L50:
   1000 L51:
   1001 L52:
   1002 L53:
   1003 L54:
   1004 L55:
   1005 L56:
   1006 L57:
   1007 L58:
   1008 L59:
   1009 L60:
   1010 L61:
   1011 L62:
   1012 L63:
   1013 L64:
   1014 L65:
   1015 L66:
   1016 L67:
   1017 L68:
   1018 L69:
   1019 L70:
   1020 L71:
   1021 L72:
   1022 L73:
   1023 L74:
   1024 L75:
   1025 L76:
   1026 L77:
   1027 L78:
   1028 L79:
   1029 L80:
   1030 L81:
   1031 L82:
   1032 L83:
   1033 L84:
   1034 L85:
   1035 L86:
   1036 L87:
   1037 L88:
   1038 L89:
   1039 L90:
   1040 L91:
   1041 L92:
   1042 L93:
   1043 L94:
   1044 L95:
   1045 L96:
   1046 L97:
   1047 L98:
   1048 L99:
   1049 L100:
   1050 	// use the labels to silence compiler errors
   1051 	goto L1
   1052 	goto L2
   1053 	goto L3
   1054 	goto L4
   1055 	goto L5
   1056 	goto L6
   1057 	goto L7
   1058 	goto L8
   1059 	goto L9
   1060 	goto L10
   1061 	goto L11
   1062 	goto L12
   1063 	goto L13
   1064 	goto L14
   1065 	goto L15
   1066 	goto L16
   1067 	goto L17
   1068 	goto L18
   1069 	goto L19
   1070 	goto L20
   1071 	goto L21
   1072 	goto L22
   1073 	goto L23
   1074 	goto L24
   1075 	goto L25
   1076 	goto L26
   1077 	goto L27
   1078 	goto L28
   1079 	goto L29
   1080 	goto L30
   1081 	goto L31
   1082 	goto L32
   1083 	goto L33
   1084 	goto L34
   1085 	goto L35
   1086 	goto L36
   1087 	goto L37
   1088 	goto L38
   1089 	goto L39
   1090 	goto L40
   1091 	goto L41
   1092 	goto L42
   1093 	goto L43
   1094 	goto L44
   1095 	goto L45
   1096 	goto L46
   1097 	goto L47
   1098 	goto L48
   1099 	goto L49
   1100 	goto L50
   1101 	goto L51
   1102 	goto L52
   1103 	goto L53
   1104 	goto L54
   1105 	goto L55
   1106 	goto L56
   1107 	goto L57
   1108 	goto L58
   1109 	goto L59
   1110 	goto L60
   1111 	goto L61
   1112 	goto L62
   1113 	goto L63
   1114 	goto L64
   1115 	goto L65
   1116 	goto L66
   1117 	goto L67
   1118 	goto L68
   1119 	goto L69
   1120 	goto L70
   1121 	goto L71
   1122 	goto L72
   1123 	goto L73
   1124 	goto L74
   1125 	goto L75
   1126 	goto L76
   1127 	goto L77
   1128 	goto L78
   1129 	goto L79
   1130 	goto L80
   1131 	goto L81
   1132 	goto L82
   1133 	goto L83
   1134 	goto L84
   1135 	goto L85
   1136 	goto L86
   1137 	goto L87
   1138 	goto L88
   1139 	goto L89
   1140 	goto L90
   1141 	goto L91
   1142 	goto L92
   1143 	goto L93
   1144 	goto L94
   1145 	goto L95
   1146 	goto L96
   1147 	goto L97
   1148 	goto L98
   1149 	goto L99
   1150 	goto L100
   1151 }
   1152 
   1153 func foo121() {
   1154 	for i := 0; i < 10; i++ {
   1155 		defer myprint(nil, i) // ERROR "... argument escapes to heap$" "i escapes to heap$"
   1156 		go myprint(nil, i)    // ERROR "... argument escapes to heap$" "i escapes to heap$"
   1157 	}
   1158 }
   1159 
   1160 // same as foo121 but check across import
   1161 func foo121b() {
   1162 	for i := 0; i < 10; i++ {
   1163 		defer fmt.Printf("%d", i) // ERROR "... argument escapes to heap$" "i escapes to heap$"
   1164 		go fmt.Printf("%d", i)    // ERROR "... argument escapes to heap$" "i escapes to heap$"
   1165 	}
   1166 }
   1167 
   1168 // a harmless forward jump
   1169 func foo122() {
   1170 	var i *int
   1171 
   1172 	goto L1
   1173 L1:
   1174 	i = new(int) // ERROR "foo122 new\(int\) does not escape$"
   1175 	_ = i
   1176 }
   1177 
   1178 // a backward jump, increases loopdepth
   1179 func foo123() {
   1180 	var i *int
   1181 
   1182 L1:
   1183 	i = new(int) // ERROR "new\(int\) escapes to heap$"
   1184 
   1185 	goto L1
   1186 	_ = i
   1187 }
   1188 
   1189 func foo124(x **int) { // ERROR "foo124 x does not escape$"
   1190 	var i int // ERROR "moved to heap: i$"
   1191 	p := &i   // ERROR "&i escapes to heap$"
   1192 	func() {  // ERROR "foo124 func literal does not escape$"
   1193 		*x = p // ERROR "leaking closure reference p$"
   1194 	}()
   1195 }
   1196 
   1197 func foo125(ch chan *int) { // ERROR "foo125 ch does not escape$"
   1198 	var i int // ERROR "moved to heap: i$"
   1199 	p := &i   // ERROR "&i escapes to heap$"
   1200 	func() {  // ERROR "foo125 func literal does not escape$"
   1201 		ch <- p // ERROR "leaking closure reference p$"
   1202 	}()
   1203 }
   1204 
   1205 func foo126() {
   1206 	var px *int // loopdepth 0
   1207 	for {
   1208 		// loopdepth 1
   1209 		var i int // ERROR "moved to heap: i$"
   1210 		func() {  // ERROR "foo126 func literal does not escape$"
   1211 			px = &i // ERROR "&i escapes to heap$"
   1212 		}()
   1213 	}
   1214 	_ = px
   1215 }
   1216 
   1217 var px *int
   1218 
   1219 func foo127() {
   1220 	var i int // ERROR "moved to heap: i$"
   1221 	p := &i   // ERROR "&i escapes to heap$"
   1222 	q := p
   1223 	px = q
   1224 }
   1225 
   1226 func foo128() {
   1227 	var i int
   1228 	p := &i // ERROR "foo128 &i does not escape$"
   1229 	q := p
   1230 	_ = q
   1231 }
   1232 
   1233 func foo129() {
   1234 	var i int // ERROR "moved to heap: i$"
   1235 	p := &i   // ERROR "&i escapes to heap$"
   1236 	func() {  // ERROR "foo129 func literal does not escape$"
   1237 		q := p   // ERROR "leaking closure reference p$"
   1238 		func() { // ERROR "foo129.func1 func literal does not escape$"
   1239 			r := q // ERROR "leaking closure reference q$"
   1240 			px = r
   1241 		}()
   1242 	}()
   1243 }
   1244 
   1245 func foo130() {
   1246 	for {
   1247 		var i int // ERROR "moved to heap: i$"
   1248 		func() {  // ERROR "foo130 func literal does not escape$"
   1249 			px = &i // ERROR "&i escapes to heap$" "leaking closure reference i$"
   1250 		}()
   1251 	}
   1252 }
   1253 
   1254 func foo131() {
   1255 	var i int // ERROR "moved to heap: i$"
   1256 	func() {  // ERROR "foo131 func literal does not escape$"
   1257 		px = &i // ERROR "&i escapes to heap$" "leaking closure reference i$"
   1258 	}()
   1259 }
   1260 
   1261 func foo132() {
   1262 	var i int   // ERROR "moved to heap: i$"
   1263 	go func() { // ERROR "func literal escapes to heap$"
   1264 		px = &i // ERROR "&i escapes to heap$" "leaking closure reference i$"
   1265 	}()
   1266 }
   1267 
   1268 func foo133() {
   1269 	var i int      // ERROR "moved to heap: i$"
   1270 	defer func() { // ERROR "foo133 func literal does not escape$"
   1271 		px = &i // ERROR "&i escapes to heap$" "leaking closure reference i$"
   1272 	}()
   1273 }
   1274 
   1275 func foo134() {
   1276 	var i int
   1277 	p := &i  // ERROR "foo134 &i does not escape$"
   1278 	func() { // ERROR "foo134 func literal does not escape$"
   1279 		q := p
   1280 		func() { // ERROR "foo134.func1 func literal does not escape$"
   1281 			r := q
   1282 			_ = r
   1283 		}()
   1284 	}()
   1285 }
   1286 
   1287 func foo135() {
   1288 	var i int   // ERROR "moved to heap: i$"
   1289 	p := &i     // ERROR "&i escapes to heap$"
   1290 	go func() { // ERROR "func literal escapes to heap$"
   1291 		q := p
   1292 		func() { // ERROR "foo135.func1 func literal does not escape$"
   1293 			r := q
   1294 			_ = r
   1295 		}()
   1296 	}()
   1297 }
   1298 
   1299 func foo136() {
   1300 	var i int   // ERROR "moved to heap: i$"
   1301 	p := &i     // ERROR "&i escapes to heap$"
   1302 	go func() { // ERROR "func literal escapes to heap$"
   1303 		q := p   // ERROR "leaking closure reference p$"
   1304 		func() { // ERROR "foo136.func1 func literal does not escape$"
   1305 			r := q // ERROR "leaking closure reference q$"
   1306 			px = r
   1307 		}()
   1308 	}()
   1309 }
   1310 
   1311 func foo137() {
   1312 	var i int // ERROR "moved to heap: i$"
   1313 	p := &i   // ERROR "&i escapes to heap$"
   1314 	func() {  // ERROR "foo137 func literal does not escape$"
   1315 		q := p      // ERROR "leaking closure reference p$"
   1316 		go func() { // ERROR "func literal escapes to heap$"
   1317 			r := q
   1318 			_ = r
   1319 		}()
   1320 	}()
   1321 }
   1322 
   1323 func foo138() *byte {
   1324 	type T struct {
   1325 		x [1]byte
   1326 	}
   1327 	t := new(T)    // ERROR "new\(T\) escapes to heap$"
   1328 	return &t.x[0] // ERROR "&t.x\[0\] escapes to heap$"
   1329 }
   1330 
   1331 func foo139() *byte {
   1332 	type T struct {
   1333 		x struct {
   1334 			y byte
   1335 		}
   1336 	}
   1337 	t := new(T)   // ERROR "new\(T\) escapes to heap$"
   1338 	return &t.x.y // ERROR "&t.x.y escapes to heap$"
   1339 }
   1340 
   1341 // issue 4751
   1342 func foo140() interface{} {
   1343 	type T struct {
   1344 		X string
   1345 	}
   1346 	type U struct {
   1347 		X string
   1348 		T *T
   1349 	}
   1350 	t := &T{} // ERROR "&T literal escapes to heap$"
   1351 	return U{ // ERROR "U literal escapes to heap$"
   1352 		X: t.X,
   1353 		T: t,
   1354 	}
   1355 }
   1356 
   1357 //go:noescape
   1358 
   1359 func F1([]byte)
   1360 
   1361 func F2([]byte)
   1362 
   1363 //go:noescape
   1364 
   1365 func F3(x []byte) // ERROR "F3 x does not escape$"
   1366 
   1367 func F4(x []byte)
   1368 
   1369 func G() {
   1370 	var buf1 [10]byte
   1371 	F1(buf1[:]) // ERROR "G buf1 does not escape$"
   1372 
   1373 	var buf2 [10]byte // ERROR "moved to heap: buf2$"
   1374 	F2(buf2[:])       // ERROR "buf2 escapes to heap$"
   1375 
   1376 	var buf3 [10]byte
   1377 	F3(buf3[:]) // ERROR "G buf3 does not escape$"
   1378 
   1379 	var buf4 [10]byte // ERROR "moved to heap: buf4$"
   1380 	F4(buf4[:])       // ERROR "buf4 escapes to heap$"
   1381 }
   1382 
   1383 type Tm struct {
   1384 	x int
   1385 }
   1386 
   1387 func (t *Tm) M() { // ERROR "\(\*Tm\).M t does not escape$"
   1388 }
   1389 
   1390 func foo141() {
   1391 	var f func()
   1392 
   1393 	t := new(Tm) // ERROR "new\(Tm\) escapes to heap$"
   1394 	f = t.M      // ERROR "foo141 t.M does not escape$"
   1395 	_ = f
   1396 }
   1397 
   1398 var gf func()
   1399 
   1400 func foo142() {
   1401 	t := new(Tm) // ERROR "new\(Tm\) escapes to heap$"
   1402 	gf = t.M     // ERROR "t.M escapes to heap$"
   1403 }
   1404 
   1405 // issue 3888.
   1406 func foo143() {
   1407 	for i := 0; i < 1000; i++ {
   1408 		func() { // ERROR "foo143 func literal does not escape$"
   1409 			for i := 0; i < 1; i++ {
   1410 				var t Tm
   1411 				t.M() // ERROR "foo143.func1 t does not escape$"
   1412 			}
   1413 		}()
   1414 	}
   1415 }
   1416 
   1417 // issue 5773
   1418 // Check that annotations take effect regardless of whether they
   1419 // are before or after the use in the source code.
   1420 
   1421 //go:noescape
   1422 
   1423 func foo144a(*int)
   1424 
   1425 func foo144() {
   1426 	var x int
   1427 	foo144a(&x) // ERROR "foo144 &x does not escape$"
   1428 	var y int
   1429 	foo144b(&y) // ERROR "foo144 &y does not escape$"
   1430 }
   1431 
   1432 //go:noescape
   1433 
   1434 func foo144b(*int)
   1435 
   1436 // issue 7313: for loop init should not be treated as "in loop"
   1437 
   1438 type List struct {
   1439 	Next *List
   1440 }
   1441 
   1442 func foo145(l List) { // ERROR "foo145 l does not escape$"
   1443 	var p *List
   1444 	for p = &l; p.Next != nil; p = p.Next { // ERROR "foo145 &l does not escape$"
   1445 	}
   1446 }
   1447 
   1448 func foo146(l List) { // ERROR "foo146 l does not escape$"
   1449 	var p *List
   1450 	p = &l // ERROR "foo146 &l does not escape$"
   1451 	for ; p.Next != nil; p = p.Next {
   1452 	}
   1453 }
   1454 
   1455 func foo147(l List) { // ERROR "foo147 l does not escape$"
   1456 	var p *List
   1457 	p = &l // ERROR "foo147 &l does not escape$"
   1458 	for p.Next != nil {
   1459 		p = p.Next
   1460 	}
   1461 }
   1462 
   1463 func foo148(l List) { // ERROR "foo148 l does not escape$"
   1464 	for p := &l; p.Next != nil; p = p.Next { // ERROR "foo148 &l does not escape$"
   1465 	}
   1466 }
   1467 
   1468 // related: address of variable should have depth of variable, not of loop
   1469 
   1470 func foo149(l List) { // ERROR "foo149 l does not escape$"
   1471 	var p *List
   1472 	for {
   1473 		for p = &l; p.Next != nil; p = p.Next { // ERROR "foo149 &l does not escape$"
   1474 		}
   1475 	}
   1476 }
   1477 
   1478 // issue 7934: missed ... if element type had no pointers
   1479 
   1480 var save150 []byte
   1481 
   1482 func foo150(x ...byte) { // ERROR "leaking param: x$"
   1483 	save150 = x
   1484 }
   1485 
   1486 func bar150() {
   1487 	foo150(1, 2, 3) // ERROR "... argument escapes to heap$"
   1488 }
   1489 
   1490 // issue 7931: bad handling of slice of array
   1491 
   1492 var save151 *int
   1493 
   1494 func foo151(x *int) { // ERROR "leaking param: x$"
   1495 	save151 = x
   1496 }
   1497 
   1498 func bar151() {
   1499 	var a [64]int // ERROR "moved to heap: a$"
   1500 	a[4] = 101
   1501 	foo151(&(&a)[4:8][0]) // ERROR "&\(&a\)\[4:8\]\[0\] escapes to heap$" "&a escapes to heap$"
   1502 }
   1503 
   1504 func bar151b() {
   1505 	var a [10]int      // ERROR "moved to heap: a$"
   1506 	b := a[:]          // ERROR "a escapes to heap$"
   1507 	foo151(&b[4:8][0]) // ERROR "&b\[4:8\]\[0\] escapes to heap$"
   1508 }
   1509 
   1510 func bar151c() {
   1511 	var a [64]int // ERROR "moved to heap: a$"
   1512 	a[4] = 101
   1513 	foo151(&(&a)[4:8:8][0]) // ERROR "&\(&a\)\[4:8:8\]\[0\] escapes to heap$" "&a escapes to heap$"
   1514 }
   1515 
   1516 func bar151d() {
   1517 	var a [10]int        // ERROR "moved to heap: a$"
   1518 	b := a[:]            // ERROR "a escapes to heap$"
   1519 	foo151(&b[4:8:8][0]) // ERROR "&b\[4:8:8\]\[0\] escapes to heap$"
   1520 }
   1521 
   1522 // issue 8120
   1523 
   1524 type U struct {
   1525 	s *string
   1526 }
   1527 
   1528 func (u *U) String() *string { // ERROR "leaking param: u to result ~r0 level=1$"
   1529 	return u.s
   1530 }
   1531 
   1532 type V struct {
   1533 	s *string
   1534 }
   1535 
   1536 // BAD -- level of leak ought to be 0
   1537 func NewV(u U) *V { // ERROR "leaking param: u to result ~r1 level=-1"
   1538 	return &V{u.String()} // ERROR "&V literal escapes to heap$" "NewV u does not escape"
   1539 }
   1540 
   1541 func foo152() {
   1542 	a := "a"   // ERROR "moved to heap: a$"
   1543 	u := U{&a} // ERROR "&a escapes to heap$"
   1544 	v := NewV(u)
   1545 	println(v)
   1546 }
   1547 
   1548 // issue 8176 - &x in type switch body not marked as escaping
   1549 
   1550 func foo153(v interface{}) *int { // ERROR "leaking param: v to result ~r1 level=-1$"
   1551 	switch x := v.(type) {
   1552 	case int: // ERROR "moved to heap: x$"
   1553 		return &x // ERROR "&x escapes to heap$"
   1554 	}
   1555 	panic(0)
   1556 }
   1557 
   1558 // issue 8185 - &result escaping into result
   1559 
   1560 func f() (x int, y *int) { // ERROR "moved to heap: x$"
   1561 	y = &x // ERROR "&x escapes to heap$"
   1562 	return
   1563 }
   1564 
   1565 func g() (x interface{}) { // ERROR "moved to heap: x$"
   1566 	x = &x // ERROR "&x escapes to heap$"
   1567 	return
   1568 }
   1569 
   1570 var sink interface{}
   1571 
   1572 type Lit struct {
   1573 	p *int
   1574 }
   1575 
   1576 func ptrlitNoescape() {
   1577 	// Both literal and element do not escape.
   1578 	i := 0
   1579 	x := &Lit{&i} // ERROR "ptrlitNoescape &Lit literal does not escape$" "ptrlitNoescape &i does not escape$"
   1580 	_ = x
   1581 }
   1582 
   1583 func ptrlitNoEscape2() {
   1584 	// Literal does not escape, but element does.
   1585 	i := 0        // ERROR "moved to heap: i$"
   1586 	x := &Lit{&i} // ERROR "&i escapes to heap$" "ptrlitNoEscape2 &Lit literal does not escape$"
   1587 	sink = *x     // ERROR "\*x escapes to heap$"
   1588 }
   1589 
   1590 func ptrlitEscape() {
   1591 	// Both literal and element escape.
   1592 	i := 0        // ERROR "moved to heap: i$"
   1593 	x := &Lit{&i} // ERROR "&Lit literal escapes to heap$" "&i escapes to heap$"
   1594 	sink = x      // ERROR "x escapes to heap$"
   1595 }
   1596 
   1597 // self-assignments
   1598 
   1599 type Buffer struct {
   1600 	arr  [64]byte
   1601 	buf1 []byte
   1602 	buf2 []byte
   1603 	str1 string
   1604 	str2 string
   1605 }
   1606 
   1607 func (b *Buffer) foo() { // ERROR "\(\*Buffer\).foo b does not escape$"
   1608 	b.buf1 = b.buf1[1:2]   // ERROR "\(\*Buffer\).foo ignoring self-assignment to b.buf1$"
   1609 	b.buf1 = b.buf1[1:2:3] // ERROR "\(\*Buffer\).foo ignoring self-assignment to b.buf1$"
   1610 	b.buf1 = b.buf2[1:2]   // ERROR "\(\*Buffer\).foo ignoring self-assignment to b.buf1$"
   1611 	b.buf1 = b.buf2[1:2:3] // ERROR "\(\*Buffer\).foo ignoring self-assignment to b.buf1$"
   1612 }
   1613 
   1614 func (b *Buffer) bar() { // ERROR "leaking param: b$"
   1615 	b.buf1 = b.arr[1:2] // ERROR "b.arr escapes to heap$"
   1616 }
   1617 
   1618 func (b *Buffer) baz() { // ERROR "\(\*Buffer\).baz b does not escape$"
   1619 	b.str1 = b.str1[1:2] // ERROR "\(\*Buffer\).baz ignoring self-assignment to b.str1$"
   1620 	b.str1 = b.str2[1:2] // ERROR "\(\*Buffer\).baz ignoring self-assignment to b.str1$"
   1621 }
   1622 
   1623 func (b *Buffer) bat() { // ERROR "leaking param content: b$"
   1624 	o := new(Buffer) // ERROR "new\(Buffer\) escapes to heap$"
   1625 	o.buf1 = b.buf1[1:2]
   1626 	sink = o // ERROR "o escapes to heap$"
   1627 }
   1628 
   1629 func quux(sp *string, bp *[]byte) { // ERROR "quux bp does not escape$" "quux sp does not escape$"
   1630 	*sp = (*sp)[1:2] // ERROR "quux ignoring self-assignment to \*sp$"
   1631 	*bp = (*bp)[1:2] // ERROR "quux ignoring self-assignment to \*bp$"
   1632 }
   1633 
   1634 type StructWithString struct {
   1635 	p *int
   1636 	s string
   1637 }
   1638 
   1639 // This is escape analysis false negative.
   1640 // We assign the pointer to x.p but leak x.s. Escape analysis coarsens flows
   1641 // to just x, and thus &i looks escaping.
   1642 func fieldFlowTracking() {
   1643 	var x StructWithString
   1644 	i := 0     // ERROR "moved to heap: i$"
   1645 	x.p = &i   // ERROR "&i escapes to heap$"
   1646 	sink = x.s // ERROR "x.s escapes to heap$"
   1647 }
   1648 
   1649 // String operations.
   1650 
   1651 func slicebytetostring0() {
   1652 	b := make([]byte, 20) // ERROR "slicebytetostring0 make\(\[\]byte, 20\) does not escape$"
   1653 	s := string(b)        // ERROR "slicebytetostring0 string\(b\) does not escape$"
   1654 	_ = s
   1655 }
   1656 
   1657 func slicebytetostring1() {
   1658 	b := make([]byte, 20) // ERROR "slicebytetostring1 make\(\[\]byte, 20\) does not escape$"
   1659 	s := string(b)        // ERROR "slicebytetostring1 string\(b\) does not escape$"
   1660 	s1 := s[0:1]
   1661 	_ = s1
   1662 }
   1663 
   1664 func slicebytetostring2() {
   1665 	b := make([]byte, 20) // ERROR "slicebytetostring2 make\(\[\]byte, 20\) does not escape$"
   1666 	s := string(b)        // ERROR "string\(b\) escapes to heap$"
   1667 	s1 := s[0:1]          // ERROR "moved to heap: s1$"
   1668 	sink = &s1            // ERROR "&s1 escapes to heap$"
   1669 }
   1670 
   1671 func slicebytetostring3() {
   1672 	b := make([]byte, 20) // ERROR "slicebytetostring3 make\(\[\]byte, 20\) does not escape$"
   1673 	s := string(b)        // ERROR "string\(b\) escapes to heap$"
   1674 	s1 := s[0:1]
   1675 	sink = s1 // ERROR "s1 escapes to heap$"
   1676 }
   1677 
   1678 func addstr0() {
   1679 	s0 := "a"
   1680 	s1 := "b"
   1681 	s := s0 + s1 // ERROR "addstr0 s0 \+ s1 does not escape$"
   1682 	_ = s
   1683 }
   1684 
   1685 func addstr1() {
   1686 	s0 := "a"
   1687 	s1 := "b"
   1688 	s := "c"
   1689 	s += s0 + s1 // ERROR "addstr1 s0 \+ s1 does not escape$"
   1690 	_ = s
   1691 }
   1692 
   1693 func addstr2() {
   1694 	b := make([]byte, 20) // ERROR "addstr2 make\(\[\]byte, 20\) does not escape$"
   1695 	s0 := "a"
   1696 	s := string(b) + s0 // ERROR "addstr2 string\(b\) \+ s0 does not escape$" "addstr2 string\(b\) does not escape$"
   1697 	_ = s
   1698 }
   1699 
   1700 func addstr3() {
   1701 	s0 := "a"
   1702 	s1 := "b"
   1703 	s := s0 + s1 // ERROR "s0 \+ s1 escapes to heap$"
   1704 	s2 := s[0:1]
   1705 	sink = s2 // ERROR "s2 escapes to heap$"
   1706 }
   1707 
   1708 func intstring0() bool {
   1709 	// string does not escape
   1710 	x := '0'
   1711 	s := string(x) // ERROR "intstring0 string\(x\) does not escape$"
   1712 	return s == "0"
   1713 }
   1714 
   1715 func intstring1() string {
   1716 	// string does not escape, but the buffer does
   1717 	x := '0'
   1718 	s := string(x) // ERROR "string\(x\) escapes to heap$"
   1719 	return s
   1720 }
   1721 
   1722 func intstring2() {
   1723 	// string escapes to heap
   1724 	x := '0'
   1725 	s := string(x) // ERROR "moved to heap: s$" "string\(x\) escapes to heap$"
   1726 	sink = &s      // ERROR "&s escapes to heap$"
   1727 }
   1728 
   1729 func stringtoslicebyte0() {
   1730 	s := "foo"
   1731 	x := []byte(s) // ERROR "stringtoslicebyte0 \(\[\]byte\)\(s\) does not escape$"
   1732 	_ = x
   1733 }
   1734 
   1735 func stringtoslicebyte1() []byte {
   1736 	s := "foo"
   1737 	return []byte(s) // ERROR "\(\[\]byte\)\(s\) escapes to heap$"
   1738 }
   1739 
   1740 func stringtoslicebyte2() {
   1741 	s := "foo"
   1742 	sink = []byte(s) // ERROR "\(\[\]byte\)\(s\) escapes to heap$"
   1743 }
   1744 
   1745 func stringtoslicerune0() {
   1746 	s := "foo"
   1747 	x := []rune(s) // ERROR "stringtoslicerune0 \(\[\]rune\)\(s\) does not escape$"
   1748 	_ = x
   1749 }
   1750 
   1751 func stringtoslicerune1() []rune {
   1752 	s := "foo"
   1753 	return []rune(s) // ERROR "\(\[\]rune\)\(s\) escapes to heap$"
   1754 }
   1755 
   1756 func stringtoslicerune2() {
   1757 	s := "foo"
   1758 	sink = []rune(s) // ERROR "\(\[\]rune\)\(s\) escapes to heap$"
   1759 }
   1760 
   1761 func slicerunetostring0() {
   1762 	r := []rune{1, 2, 3} // ERROR "slicerunetostring0 \[\]rune literal does not escape$"
   1763 	s := string(r)       // ERROR "slicerunetostring0 string\(r\) does not escape$"
   1764 	_ = s
   1765 }
   1766 
   1767 func slicerunetostring1() string {
   1768 	r := []rune{1, 2, 3} // ERROR "slicerunetostring1 \[\]rune literal does not escape$"
   1769 	return string(r)     // ERROR "string\(r\) escapes to heap$"
   1770 }
   1771 
   1772 func slicerunetostring2() {
   1773 	r := []rune{1, 2, 3} // ERROR "slicerunetostring2 \[\]rune literal does not escape$"
   1774 	sink = string(r)     // ERROR "string\(r\) escapes to heap$"
   1775 }
   1776 
   1777 func makemap0() {
   1778 	m := make(map[int]int) // ERROR "makemap0 make\(map\[int\]int\) does not escape$"
   1779 	m[0] = 0
   1780 	m[1]++
   1781 	delete(m, 1)
   1782 	sink = m[0] // ERROR "m\[0\] escapes to heap$"
   1783 }
   1784 
   1785 func makemap1() map[int]int {
   1786 	return make(map[int]int) // ERROR "make\(map\[int\]int\) escapes to heap$"
   1787 }
   1788 
   1789 func makemap2() {
   1790 	m := make(map[int]int) // ERROR "make\(map\[int\]int\) escapes to heap$"
   1791 	sink = m               // ERROR "m escapes to heap$"
   1792 }
   1793 
   1794 func nonescapingEface(m map[interface{}]bool) bool { // ERROR "nonescapingEface m does not escape$"
   1795 	return m["foo"] // ERROR "nonescapingEface .foo. does not escape$"
   1796 }
   1797 
   1798 func nonescapingIface(m map[M]bool) bool { // ERROR "nonescapingIface m does not escape$"
   1799 	return m[MV(0)] // ERROR "nonescapingIface MV\(0\) does not escape$"
   1800 }
   1801 
   1802 func issue10353() {
   1803 	x := new(int) // ERROR "new\(int\) escapes to heap$"
   1804 	issue10353a(x)()
   1805 }
   1806 
   1807 func issue10353a(x *int) func() { // ERROR "leaking param: x to result ~r1 level=-1$"
   1808 	return func() { // ERROR "func literal escapes to heap$"
   1809 		println(*x)
   1810 	}
   1811 }
   1812 
   1813 func issue10353b() {
   1814 	var f func()
   1815 	for {
   1816 		x := new(int) // ERROR "new\(int\) escapes to heap$"
   1817 		f = func() {  // ERROR "func literal escapes to heap$"
   1818 			println(*x)
   1819 		}
   1820 	}
   1821 	_ = f
   1822 }
   1823 
   1824 func issue11387(x int) func() int {
   1825 	f := func() int { return x }    // ERROR "func literal escapes to heap"
   1826 	slice1 := []func() int{f}       // ERROR "\[\].* does not escape"
   1827 	slice2 := make([]func() int, 1) // ERROR "make\(.*\) does not escape"
   1828 	copy(slice2, slice1)
   1829 	return slice2[0]
   1830 }
   1831