github.com/alash3al/go@v0.0.0-20150827002835-d497eeb00540/test/escape2n.go (about)

     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  }