| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | // errchk -0 $G -m $D/$F.go | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Copyright 2010 The Go Authors.  All rights reserved. | 
					
						
							|  |  |  | // Use of this source code is governed by a BSD-style | 
					
						
							|  |  |  | // license that can be found in the LICENSE file. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package foo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import "unsafe" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var gxx *int | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo1(x int) { // ERROR "moved to heap: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	gxx = &x  // ERROR "&x escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo2(yy *int) { // ERROR "leaking param: yy" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	gxx = yy | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo3(x int) *int { // ERROR "moved to heap: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return &x  // ERROR "&x escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type T *T | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo3b(t T) { // ERROR "leaking param: t" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	*t = t | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // xx isn't going anywhere, so use of yy is ok | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foo4(xx, yy *int) { // ERROR "xx does not escape" "yy does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	xx = yy | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // xx isn't going anywhere, so taking address of yy is ok | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foo5(xx **int, yy *int) { // ERROR "xx does not escape" "yy does not escape" | 
					
						
							|  |  |  | 	xx = &yy  // ERROR "&yy does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo6(xx **int, yy *int) { // ERROR "xx does not escape" "leaking param: yy" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	*xx = yy | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foo7(xx **int, yy *int) { // ERROR "xx does not escape" "yy does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	**xx = *yy | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foo8(xx, yy *int) int { // ERROR "xx does not escape" "yy does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	xx = yy | 
					
						
							|  |  |  | 	return *xx | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo9(xx, yy *int) *int { // ERROR "leaking param: xx" "leaking param: yy" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	xx = yy | 
					
						
							|  |  |  | 	return xx | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foo10(xx, yy *int) { // ERROR "xx does not escape" "yy does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	*xx = *yy | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo11() int { | 
					
						
							|  |  |  | 	x, y := 0, 42 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	xx := &x  // ERROR "&x does not escape" | 
					
						
							|  |  |  | 	yy := &y  // ERROR "&y does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	*xx = *yy | 
					
						
							|  |  |  | 	return x | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var xxx **int | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo12(yyy **int) { // ERROR "leaking param: yyy" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	xxx = yyy | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foo13(yyy **int) { // ERROR "yyy does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	*xxx = *yyy | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foo14(yyy **int) { // ERROR "yyy does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	**xxx = **yyy | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo15(yy *int) { // ERROR "moved to heap: yy" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	xxx = &yy  // ERROR "&yy escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo16(yy *int) { // ERROR "leaking param: yy" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	*xxx = yy | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foo17(yy *int) { // ERROR "yy does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	**xxx = *yy | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo18(y int) { // ERROR "moved to heap: "y" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	*xxx = &y  // ERROR "&y escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo19(y int) { | 
					
						
							|  |  |  | 	**xxx = y | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type Bar struct { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	i  int | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	ii *int | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func NewBar() *Bar { | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | 	return &Bar{42, nil} // ERROR "&Bar literal escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func NewBarp(x *int) *Bar { // ERROR "leaking param: x" | 
					
						
							|  |  |  | 	return &Bar{42, x} // ERROR "&Bar literal escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func NewBarp2(x *int) *Bar { // ERROR "x does not escape" | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | 	return &Bar{*x, nil} // ERROR "&Bar literal escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func (b *Bar) NoLeak() int { // ERROR "b does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	return *(b.ii) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func (b *Bar) AlsoNoLeak() *int { // ERROR "b does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	return b.ii | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func goLeak(b *Bar) {  // ERROR "leaking param: b" | 
					
						
							| 
									
										
										
										
											2011-09-07 19:03:11 +02:00
										 |  |  | 	go b.NoLeak() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | type Bar2 struct { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	i  [12]int | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	ii []int | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func NewBar2() *Bar2 { | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | 	return &Bar2{[12]int{42}, nil} // ERROR "&Bar2 literal escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func (b *Bar2) NoLeak() int { // ERROR "b does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	return b.i[0] | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func (b *Bar2) Leak() []int { // ERROR "leaking param: b" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return b.i[:]  // ERROR "&b.i escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func (b *Bar2) AlsoNoLeak() []int { // ERROR "b does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	return b.ii[0:1] | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func (b *Bar2) LeakSelf() { // ERROR "leaking param: b" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	b.ii = b.i[0:4]  // ERROR "&b.i escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func (b *Bar2) LeakSelf2() { // ERROR "leaking param: b" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	var buf []int | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	buf = b.i[0:]  // ERROR "&b.i escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	b.ii = buf | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo21() func() int { | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | 	x := 42 // ERROR "moved to heap: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return func() int {  // ERROR "func literal escapes to heap" | 
					
						
							|  |  |  | 		return x  // ERROR "&x escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo22() int { | 
					
						
							|  |  |  | 	x := 42 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return func() int {  // ERROR "func literal does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 		return x | 
					
						
							|  |  |  | 	}() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo23(x int) func() int { // ERROR "moved to heap: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return func() int {  // ERROR "func literal escapes to heap" | 
					
						
							|  |  |  | 		return x  // ERROR "&x escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo23a(x int) func() int { // ERROR "moved to heap: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	f := func() int {  // ERROR "func literal escapes to heap" | 
					
						
							|  |  |  | 		return x  // ERROR "&x escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return f | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo23b(x int) *(func() int) { // ERROR "moved to heap: x" | 
					
						
							|  |  |  | 	f := func() int { return x } // ERROR "moved to heap: f" "func literal escapes to heap" "&x escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return &f  // ERROR "&f escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo24(x int) int { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return func() int {  // ERROR "func literal does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 		return x | 
					
						
							|  |  |  | 	}() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var x *int | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func fooleak(xx *int) int { // ERROR "leaking param: xx" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	x = xx | 
					
						
							|  |  |  | 	return *x | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foonoleak(xx *int) int { // ERROR "xx does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	return *x + *xx | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo31(x int) int { // ERROR "moved to heap: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return fooleak(&x)  // ERROR "&x escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo32(x int) int { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return foonoleak(&x)  // ERROR "&x does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type Foo struct { | 
					
						
							|  |  |  | 	xx *int | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	x  int | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var F Foo | 
					
						
							|  |  |  | var pf *Foo | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func (f *Foo) fooleak() { // ERROR "leaking param: f" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	pf = f | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func (f *Foo) foonoleak() { // ERROR "f does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	F.x = f.x | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func (f *Foo) Leak() { // ERROR "leaking param: f" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	f.fooleak() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func (f *Foo) NoLeak() { // ERROR "f does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	f.foonoleak() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo41(x int) { // ERROR "moved to heap: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	F.xx = &x  // ERROR "&x escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func (f *Foo) foo42(x int) { // ERROR "f does not escape" "moved to heap: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	f.xx = &x  // ERROR "&x escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo43(f *Foo, x int) { // ERROR "f does not escape" "moved to heap: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	f.xx = &x  // ERROR "&x escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo44(yy *int) { // ERROR "leaking param: yy" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	F.xx = yy | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func (f *Foo) foo45() { // ERROR "f does not escape" | 
					
						
							|  |  |  | 	F.x = f.x | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func (f *Foo) foo46() { // ERROR "f does not escape" | 
					
						
							|  |  |  | 	F.xx = f.xx | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func (f *Foo) foo47() { // ERROR "leaking param: f" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	f.xx = &f.x  // ERROR "&f.x escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var ptrSlice []*int | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo50(i *int) { // ERROR "leaking param: i" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	ptrSlice[0] = i | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var ptrMap map[*int]*int | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo51(i *int) { // ERROR "leaking param: i" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	ptrMap[i] = i | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func indaddr1(x int) *int { // ERROR "moved to heap: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return &x  // ERROR "&x escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func indaddr2(x *int) *int { // ERROR "leaking param: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return *&x  // ERROR "&x does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func indaddr3(x *int32) *int { // ERROR "leaking param: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return *(**int)(unsafe.Pointer(&x))  // ERROR "&x does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // From package math: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func Float32bits(f float32) uint32 { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return *(*uint32)(unsafe.Pointer(&f))  // ERROR "&f does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func Float32frombits(b uint32) float32 { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return *(*float32)(unsafe.Pointer(&b))  // ERROR "&b does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func Float64bits(f float64) uint64 { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return *(*uint64)(unsafe.Pointer(&f))  // ERROR "&f does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func Float64frombits(b uint64) float64 { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return *(*float64)(unsafe.Pointer(&b))  // ERROR "&b does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // contrast with | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func float64bitsptr(f float64) *uint64 { // ERROR "moved to heap: f" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return (*uint64)(unsafe.Pointer(&f))  // ERROR "&f escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func float64ptrbitsptr(f *float64) *uint64 { // ERROR "leaking param: f" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	return (*uint64)(unsafe.Pointer(f)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func typesw(i interface{}) *int { // ERROR "leaking param: i" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	switch val := i.(type) { | 
					
						
							|  |  |  | 	case *int: | 
					
						
							|  |  |  | 		return val | 
					
						
							|  |  |  | 	case *int8: | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | 		v := int(*val) // ERROR "moved to heap: v" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 		return &v  // ERROR "&v escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func exprsw(i *int) *int { // ERROR "leaking param: i" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	switch j := i; *j + 110 { | 
					
						
							|  |  |  | 	case 12: | 
					
						
							|  |  |  | 		return j | 
					
						
							|  |  |  | 	case 42: | 
					
						
							|  |  |  | 		return nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // assigning to an array element is like assigning to the array | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo60(i *int) *int { // ERROR "leaking param: i" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	var a [12]*int | 
					
						
							|  |  |  | 	a[0] = i | 
					
						
							|  |  |  | 	return a[1] | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foo60a(i *int) *int { // ERROR "i does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	var a [12]*int | 
					
						
							|  |  |  | 	a[0] = i | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // assigning to a struct field  is like assigning to the struct | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo61(i *int) *int { // ERROR "leaking param: i" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	type S struct { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 		a, b *int | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	var s S | 
					
						
							|  |  |  | 	s.a = i | 
					
						
							|  |  |  | 	return s.b | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foo61a(i *int) *int { // ERROR "i does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	type S struct { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 		a, b *int | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	var s S | 
					
						
							|  |  |  | 	s.a = i | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // assigning to a struct field is like assigning to the struct but | 
					
						
							|  |  |  | // here this subtlety is lost, since s.a counts as an assignment to a | 
					
						
							|  |  |  | // track-losing dereference. | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo62(i *int) *int { // ERROR "leaking param: i" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	type S struct { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 		a, b *int | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	s := new(S) // ERROR "new[(]S[)] does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	s.a = i | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return nil // s.b | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | type M interface { | 
					
						
							|  |  |  | 	M() | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foo63(m M) { // ERROR "m does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo64(m M) { // ERROR "leaking param: m" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	m.M() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo64b(m M) { // ERROR "leaking param: m" | 
					
						
							| 
									
										
										
										
											2011-09-07 19:03:11 +02:00
										 |  |  | 	defer m.M() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | type MV int | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | func (MV) M() {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo65() { | 
					
						
							|  |  |  | 	var mv MV | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	foo63(&mv)  // ERROR "&mv does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo66() { | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | 	var mv MV // ERROR "moved to heap: mv" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	foo64(&mv)  // ERROR "&mv escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo67() { | 
					
						
							|  |  |  | 	var mv MV | 
					
						
							|  |  |  | 	foo63(mv) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo68() { | 
					
						
							|  |  |  | 	var mv MV | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	foo64(mv) // escapes but it's an int so irrelevant | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo69(m M) { // ERROR "leaking param: m" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	foo64(m) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo70(mv1 *MV, m M) { // ERROR "leaking param: mv1" "leaking param: m" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	m = mv1 | 
					
						
							|  |  |  | 	foo64(m) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo71(x *int) []*int { // ERROR "leaking param: x" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	var y []*int | 
					
						
							|  |  |  | 	y = append(y, x) | 
					
						
							|  |  |  | 	return y | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo71a(x int) []*int { // ERROR "moved to heap: x" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	var y []*int | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	y = append(y, &x)  // ERROR "&x escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	return y | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo72() { | 
					
						
							|  |  |  | 	var x int | 
					
						
							|  |  |  | 	var y [1]*int | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	y[0] = &x  // ERROR "&x does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo72aa() [10]*int { | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | 	var x int // ERROR "moved to heap: x" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	var y [10]*int | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	y[0] = &x  // ERROR "&x escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	return y | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo72a() { | 
					
						
							|  |  |  | 	var y [10]*int | 
					
						
							|  |  |  | 	for i := 0; i < 10; i++ { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 		// escapes its scope | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | 		x := i // ERROR "moved to heap: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 		y[i] = &x // ERROR "&x escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo72b() [10]*int { | 
					
						
							|  |  |  | 	var y [10]*int | 
					
						
							|  |  |  | 	for i := 0; i < 10; i++ { | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | 		x := i // ERROR "moved to heap: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 		y[i] = &x  // ERROR "&x escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return y | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // issue 2145 | 
					
						
							|  |  |  | func foo73() { | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | 	s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	for _, v := range s { | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | 		vv := v        // ERROR "moved to heap: vv" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 		// actually just escapes its scope | 
					
						
							|  |  |  | 		defer func() { // ERROR "func literal escapes to heap" | 
					
						
							|  |  |  | 			println(vv)  // ERROR "&vv escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 		}() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo74() { | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | 	s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	for _, v := range s { | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | 		vv := v        // ERROR "moved to heap: vv" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 		// actually just escapes its scope | 
					
						
							|  |  |  | 		fn := func() { // ERROR "func literal escapes to heap" | 
					
						
							|  |  |  | 			println(vv)  // ERROR "&vv escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		defer fn() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func myprint(y *int, x ...interface{}) *int { // ERROR "x does not escape" "leaking param: y" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	return y | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func myprint1(y *int, x ...interface{}) *interface{} { // ERROR "y does not escape" "leaking param: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return &x[0]  // ERROR "&x.0. escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo75(z *int) { // ERROR "leaking param: z" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	myprint(z, 1, 2, 3) // ERROR "[.][.][.] argument does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foo75a(z *int) { // ERROR "z does not escape" | 
					
						
							|  |  |  | 	myprint1(z, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo76(z *int) { // ERROR "leaking param: z" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	myprint(nil, z) // ERROR "[.][.][.] argument does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo76a(z *int) { // ERROR "leaking param: z" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	myprint1(nil, z) // ERROR "[.][.][.] argument escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo76b() { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	myprint(nil, 1, 2, 3) // ERROR "[.][.][.] argument does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo76c() { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	myprint1(nil, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo76d() { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	defer myprint(nil, 1, 2, 3) // ERROR "[.][.][.] argument does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo76e() { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	defer myprint1(nil, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo76f() { | 
					
						
							|  |  |  | 	for { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 		// TODO: This one really only escapes its scope, but we don't distinguish yet. | 
					
						
							|  |  |  | 		defer myprint(nil, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo76g() { | 
					
						
							|  |  |  | 	for { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 		defer myprint1(nil, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foo77(z []interface{}) { // ERROR "z does not escape" | 
					
						
							|  |  |  | 	myprint(nil, z...) // z does not escape | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo77a(z []interface{}) { // ERROR "leaking param: z" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	myprint1(nil, z...) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo78(z int) *int { // ERROR "moved to heap: z" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return &z  // ERROR "&z escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo78a(z int) *int { // ERROR "moved to heap: z" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	y := &z  // ERROR "&z escapes to heap" | 
					
						
							|  |  |  | 	x := &y  // ERROR "&y does not escape" | 
					
						
							|  |  |  | 	return *x // really return y | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo79() *int { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return new(int) // ERROR "new[(]int[)] escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo80() *int { | 
					
						
							|  |  |  | 	var z *int | 
					
						
							|  |  |  | 	for { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 		// Really just escapes its scope but we don't distinguish | 
					
						
							|  |  |  | 		z = new(int) // ERROR "new[(]int[)] escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	_ = z | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo81() *int { | 
					
						
							|  |  |  | 	for { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 		z := new(int) // ERROR "new[(]int[)] does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | 		_ = z | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type Fooer interface { | 
					
						
							|  |  |  | 	Foo() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type LimitedFooer struct { | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	Fooer | 
					
						
							|  |  |  | 	N int64 | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func LimitFooer(r Fooer, n int64) Fooer { // ERROR "leaking param: r" | 
					
						
							|  |  |  | 	return &LimitedFooer{r, n} // ERROR "&LimitedFooer literal escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo90(x *int) map[*int]*int { // ERROR "leaking param: x" | 
					
						
							|  |  |  | 	return map[*int]*int{nil: x} // ERROR "map\[\*int\] \*int literal escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo91(x *int) map[*int]*int { // ERROR "leaking param: x" | 
					
						
							|  |  |  | 	return map[*int]*int{x: nil} // ERROR "map\[\*int\] \*int literal escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo92(x *int) [2]*int { // ERROR "leaking param: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return [2]*int{x, nil} | 
					
						
							| 
									
										
										
										
											2011-08-24 19:07:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-25 09:26:13 -04:00
										 |  |  | // does not leak c | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foo93(c chan *int) *int { // ERROR "c does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-25 09:26:13 -04:00
										 |  |  | 	for v := range c { | 
					
						
							|  |  |  | 		return v | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // does not leak m | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foo94(m map[*int]*int, b bool) *int { // ERROR "m does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-25 09:26:13 -04:00
										 |  |  | 	for k, v := range m { | 
					
						
							|  |  |  | 		if b { | 
					
						
							|  |  |  | 			return k | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return v | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // does leak x | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo95(m map[*int]*int, x *int) { // ERROR "m does not escape" "leaking param: x" | 
					
						
							| 
									
										
										
										
											2011-08-25 09:26:13 -04:00
										 |  |  | 	m[x] = x | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // does not leak m | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foo96(m []*int) *int { // ERROR "m does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-25 09:26:13 -04:00
										 |  |  | 	return m[0] | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // does leak m | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo97(m [1]*int) *int { // ERROR "leaking param: m" | 
					
						
							| 
									
										
										
										
											2011-08-25 09:26:13 -04:00
										 |  |  | 	return m[0] | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // does not leak m | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foo98(m map[int]*int) *int { // ERROR "m does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-25 09:26:13 -04:00
										 |  |  | 	return m[0] | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // does leak m | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo99(m *[1]*int) []*int { // ERROR "leaking param: m" | 
					
						
							| 
									
										
										
										
											2011-08-25 09:26:13 -04:00
										 |  |  | 	return m[:] | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // does not leak m | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foo100(m []*int) *int { // ERROR "m does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-25 09:26:13 -04:00
										 |  |  | 	for _, v := range m { | 
					
						
							|  |  |  | 		return v | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // does leak m | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo101(m [1]*int) *int { // ERROR "leaking param: m" | 
					
						
							| 
									
										
										
										
											2011-08-25 09:26:13 -04:00
										 |  |  | 	for _, v := range m { | 
					
						
							|  |  |  | 		return v | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | // does not leak m | 
					
						
							|  |  |  | func foo101a(m [1]*int) *int { // ERROR "m does not escape" | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | 	for i := range m { // ERROR "moved to heap: i" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 		return &i  // ERROR "&i escapes to heap" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-25 09:26:13 -04:00
										 |  |  | // does leak x | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo102(m []*int, x *int) { // ERROR "m does not escape" "leaking param: x" | 
					
						
							| 
									
										
										
										
											2011-08-25 09:26:13 -04:00
										 |  |  | 	m[0] = x | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // does not leak x | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foo103(m [1]*int, x *int) { // ERROR "m does not escape" "x does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-25 09:26:13 -04:00
										 |  |  | 	m[0] = x | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var y []*int | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // does not leak x | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foo104(x []*int) {  // ERROR "x does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-25 09:26:13 -04:00
										 |  |  | 	copy(y, x) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // does not leak x | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | func foo105(x []*int) {  // ERROR "x does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-25 09:26:13 -04:00
										 |  |  | 	_ = append(y, x...) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // does leak x | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo106(x *int) { // ERROR "leaking param: x" | 
					
						
							| 
									
										
										
										
											2011-08-25 09:26:13 -04:00
										 |  |  | 	_ = append(y, x) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo107(x *int) map[*int]*int { // ERROR "leaking param: x" | 
					
						
							|  |  |  | 	return map[*int]*int{x: nil} // ERROR "map.* literal escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo108(x *int) map[*int]*int { // ERROR "leaking param: x" | 
					
						
							|  |  |  | 	return map[*int]*int{nil: x} // ERROR "map.* literal escapes to heap" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo109(x *int) *int { // ERROR "leaking param: x" | 
					
						
							|  |  |  | 	m := map[*int]*int{x: nil}  // ERROR "map.* literal does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	for k, _ := range m { | 
					
						
							|  |  |  | 		return k | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo110(x *int) *int { // ERROR "leaking param: x" | 
					
						
							|  |  |  | 	m := map[*int]*int{nil: x}  // ERROR "map.* literal does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return m[nil] | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo111(x *int) *int { // ERROR "leaking param: x" | 
					
						
							|  |  |  | 	m := []*int{x}  // ERROR "\[\]\*int literal does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return m[0] | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo112(x *int) *int { // ERROR "leaking param: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	m := [1]*int{x} | 
					
						
							|  |  |  | 	return m[0] | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo113(x *int) *int { // ERROR "leaking param: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	m := Bar{ii: x} | 
					
						
							|  |  |  | 	return m.ii | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo114(x *int) *int { // ERROR "leaking param: x" | 
					
						
							|  |  |  | 	m := &Bar{ii: x}  // ERROR "&Bar literal does not escape" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return m.ii | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo115(x *int) *int { // ERROR "leaking param: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	return (*int)(unsafe.Pointer(uintptr(unsafe.Pointer(x)) + 1)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo116(b bool) *int { | 
					
						
							|  |  |  | 	if b { | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | 		x := 1  // ERROR "moved to heap: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 		return &x  // ERROR "&x escapes to heap" | 
					
						
							|  |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | 		y := 1  // ERROR "moved to heap: y" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 		return &y  // ERROR "&y escapes to heap" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo117(unknown func(interface{})) {  // ERROR "unknown does not escape" | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | 	x := 1 // ERROR "moved to heap: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	unknown(&x) // ERROR "&x escapes to heap" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func foo118(unknown func(*int)) {  // ERROR "unknown does not escape" | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | 	x := 1 // ERROR "moved to heap: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 12:05:00 -04:00
										 |  |  | 	unknown(&x) // ERROR "&x escapes to heap" | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-08-28 23:29:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | func external(*int) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-08 19:37:06 +02:00
										 |  |  | func foo119(x *int) {  // ERROR "leaking param: x" | 
					
						
							| 
									
										
										
										
											2011-08-28 23:29:34 -04:00
										 |  |  | 	external(x) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-09-01 13:44:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | func foo120() { | 
					
						
							|  |  |  | 	// formerly exponential time analysis | 
					
						
							|  |  |  | L1: | 
					
						
							|  |  |  | L2: | 
					
						
							|  |  |  | L3: | 
					
						
							|  |  |  | L4: | 
					
						
							|  |  |  | L5: | 
					
						
							|  |  |  | L6: | 
					
						
							|  |  |  | L7: | 
					
						
							|  |  |  | L8: | 
					
						
							|  |  |  | L9: | 
					
						
							|  |  |  | L10: | 
					
						
							|  |  |  | L11: | 
					
						
							|  |  |  | L12: | 
					
						
							|  |  |  | L13: | 
					
						
							|  |  |  | L14: | 
					
						
							|  |  |  | L15: | 
					
						
							|  |  |  | L16: | 
					
						
							|  |  |  | L17: | 
					
						
							|  |  |  | L18: | 
					
						
							|  |  |  | L19: | 
					
						
							|  |  |  | L20: | 
					
						
							|  |  |  | L21: | 
					
						
							|  |  |  | L22: | 
					
						
							|  |  |  | L23: | 
					
						
							|  |  |  | L24: | 
					
						
							|  |  |  | L25: | 
					
						
							|  |  |  | L26: | 
					
						
							|  |  |  | L27: | 
					
						
							|  |  |  | L28: | 
					
						
							|  |  |  | L29: | 
					
						
							|  |  |  | L30: | 
					
						
							|  |  |  | L31: | 
					
						
							|  |  |  | L32: | 
					
						
							|  |  |  | L33: | 
					
						
							|  |  |  | L34: | 
					
						
							|  |  |  | L35: | 
					
						
							|  |  |  | L36: | 
					
						
							|  |  |  | L37: | 
					
						
							|  |  |  | L38: | 
					
						
							|  |  |  | L39: | 
					
						
							|  |  |  | L40: | 
					
						
							|  |  |  | L41: | 
					
						
							|  |  |  | L42: | 
					
						
							|  |  |  | L43: | 
					
						
							|  |  |  | L44: | 
					
						
							|  |  |  | L45: | 
					
						
							|  |  |  | L46: | 
					
						
							|  |  |  | L47: | 
					
						
							|  |  |  | L48: | 
					
						
							|  |  |  | L49: | 
					
						
							|  |  |  | L50: | 
					
						
							|  |  |  | L51: | 
					
						
							|  |  |  | L52: | 
					
						
							|  |  |  | L53: | 
					
						
							|  |  |  | L54: | 
					
						
							|  |  |  | L55: | 
					
						
							|  |  |  | L56: | 
					
						
							|  |  |  | L57: | 
					
						
							|  |  |  | L58: | 
					
						
							|  |  |  | L59: | 
					
						
							|  |  |  | L60: | 
					
						
							|  |  |  | L61: | 
					
						
							|  |  |  | L62: | 
					
						
							|  |  |  | L63: | 
					
						
							|  |  |  | L64: | 
					
						
							|  |  |  | L65: | 
					
						
							|  |  |  | L66: | 
					
						
							|  |  |  | L67: | 
					
						
							|  |  |  | L68: | 
					
						
							|  |  |  | L69: | 
					
						
							|  |  |  | L70: | 
					
						
							|  |  |  | L71: | 
					
						
							|  |  |  | L72: | 
					
						
							|  |  |  | L73: | 
					
						
							|  |  |  | L74: | 
					
						
							|  |  |  | L75: | 
					
						
							|  |  |  | L76: | 
					
						
							|  |  |  | L77: | 
					
						
							|  |  |  | L78: | 
					
						
							|  |  |  | L79: | 
					
						
							|  |  |  | L80: | 
					
						
							|  |  |  | L81: | 
					
						
							|  |  |  | L82: | 
					
						
							|  |  |  | L83: | 
					
						
							|  |  |  | L84: | 
					
						
							|  |  |  | L85: | 
					
						
							|  |  |  | L86: | 
					
						
							|  |  |  | L87: | 
					
						
							|  |  |  | L88: | 
					
						
							|  |  |  | L89: | 
					
						
							|  |  |  | L90: | 
					
						
							|  |  |  | L91: | 
					
						
							|  |  |  | L92: | 
					
						
							|  |  |  | L93: | 
					
						
							|  |  |  | L94: | 
					
						
							|  |  |  | L95: | 
					
						
							|  |  |  | L96: | 
					
						
							|  |  |  | L97: | 
					
						
							|  |  |  | L98: | 
					
						
							|  |  |  | L99: | 
					
						
							|  |  |  | L100: | 
					
						
							|  |  |  | 	// use the labels to silence compiler errors | 
					
						
							|  |  |  | 	goto L1 | 
					
						
							|  |  |  | 	goto L2 | 
					
						
							|  |  |  | 	goto L3 | 
					
						
							|  |  |  | 	goto L4 | 
					
						
							|  |  |  | 	goto L5 | 
					
						
							|  |  |  | 	goto L6 | 
					
						
							|  |  |  | 	goto L7 | 
					
						
							|  |  |  | 	goto L8 | 
					
						
							|  |  |  | 	goto L9 | 
					
						
							|  |  |  | 	goto L10 | 
					
						
							|  |  |  | 	goto L11 | 
					
						
							|  |  |  | 	goto L12 | 
					
						
							|  |  |  | 	goto L13 | 
					
						
							|  |  |  | 	goto L14 | 
					
						
							|  |  |  | 	goto L15 | 
					
						
							|  |  |  | 	goto L16 | 
					
						
							|  |  |  | 	goto L17 | 
					
						
							|  |  |  | 	goto L18 | 
					
						
							|  |  |  | 	goto L19 | 
					
						
							|  |  |  | 	goto L20 | 
					
						
							|  |  |  | 	goto L21 | 
					
						
							|  |  |  | 	goto L22 | 
					
						
							|  |  |  | 	goto L23 | 
					
						
							|  |  |  | 	goto L24 | 
					
						
							|  |  |  | 	goto L25 | 
					
						
							|  |  |  | 	goto L26 | 
					
						
							|  |  |  | 	goto L27 | 
					
						
							|  |  |  | 	goto L28 | 
					
						
							|  |  |  | 	goto L29 | 
					
						
							|  |  |  | 	goto L30 | 
					
						
							|  |  |  | 	goto L31 | 
					
						
							|  |  |  | 	goto L32 | 
					
						
							|  |  |  | 	goto L33 | 
					
						
							|  |  |  | 	goto L34 | 
					
						
							|  |  |  | 	goto L35 | 
					
						
							|  |  |  | 	goto L36 | 
					
						
							|  |  |  | 	goto L37 | 
					
						
							|  |  |  | 	goto L38 | 
					
						
							|  |  |  | 	goto L39 | 
					
						
							|  |  |  | 	goto L40 | 
					
						
							|  |  |  | 	goto L41 | 
					
						
							|  |  |  | 	goto L42 | 
					
						
							|  |  |  | 	goto L43 | 
					
						
							|  |  |  | 	goto L44 | 
					
						
							|  |  |  | 	goto L45 | 
					
						
							|  |  |  | 	goto L46 | 
					
						
							|  |  |  | 	goto L47 | 
					
						
							|  |  |  | 	goto L48 | 
					
						
							|  |  |  | 	goto L49 | 
					
						
							|  |  |  | 	goto L50 | 
					
						
							|  |  |  | 	goto L51 | 
					
						
							|  |  |  | 	goto L52 | 
					
						
							|  |  |  | 	goto L53 | 
					
						
							|  |  |  | 	goto L54 | 
					
						
							|  |  |  | 	goto L55 | 
					
						
							|  |  |  | 	goto L56 | 
					
						
							|  |  |  | 	goto L57 | 
					
						
							|  |  |  | 	goto L58 | 
					
						
							|  |  |  | 	goto L59 | 
					
						
							|  |  |  | 	goto L60 | 
					
						
							|  |  |  | 	goto L61 | 
					
						
							|  |  |  | 	goto L62 | 
					
						
							|  |  |  | 	goto L63 | 
					
						
							|  |  |  | 	goto L64 | 
					
						
							|  |  |  | 	goto L65 | 
					
						
							|  |  |  | 	goto L66 | 
					
						
							|  |  |  | 	goto L67 | 
					
						
							|  |  |  | 	goto L68 | 
					
						
							|  |  |  | 	goto L69 | 
					
						
							|  |  |  | 	goto L70 | 
					
						
							|  |  |  | 	goto L71 | 
					
						
							|  |  |  | 	goto L72 | 
					
						
							|  |  |  | 	goto L73 | 
					
						
							|  |  |  | 	goto L74 | 
					
						
							|  |  |  | 	goto L75 | 
					
						
							|  |  |  | 	goto L76 | 
					
						
							|  |  |  | 	goto L77 | 
					
						
							|  |  |  | 	goto L78 | 
					
						
							|  |  |  | 	goto L79 | 
					
						
							|  |  |  | 	goto L80 | 
					
						
							|  |  |  | 	goto L81 | 
					
						
							|  |  |  | 	goto L82 | 
					
						
							|  |  |  | 	goto L83 | 
					
						
							|  |  |  | 	goto L84 | 
					
						
							|  |  |  | 	goto L85 | 
					
						
							|  |  |  | 	goto L86 | 
					
						
							|  |  |  | 	goto L87 | 
					
						
							|  |  |  | 	goto L88 | 
					
						
							|  |  |  | 	goto L89 | 
					
						
							|  |  |  | 	goto L90 | 
					
						
							|  |  |  | 	goto L91 | 
					
						
							|  |  |  | 	goto L92 | 
					
						
							|  |  |  | 	goto L93 | 
					
						
							|  |  |  | 	goto L94 | 
					
						
							|  |  |  | 	goto L95 | 
					
						
							|  |  |  | 	goto L96 | 
					
						
							|  |  |  | 	goto L97 | 
					
						
							|  |  |  | 	goto L98 | 
					
						
							|  |  |  | 	goto L99 | 
					
						
							|  |  |  | 	goto L100 | 
					
						
							|  |  |  | } |