Home | History | Annotate | Download | only in test
      1 // errorcheck -0 -m
      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 enabled.
      9 
     10 package foo
     11 
     12 var p *int
     13 
     14 func alloc(x int) *int { // ERROR "can inline alloc" "moved to heap: x"
     15 	return &x // ERROR "&x escapes to heap"
     16 }
     17 
     18 var f func()
     19 
     20 func f1() {
     21 	p = alloc(2) // ERROR "inlining call to alloc" "&x escapes to heap" "moved to heap: x"
     22 
     23 	// Escape analysis used to miss inlined code in closures.
     24 
     25 	func() { // ERROR "can inline f1.func1"
     26 		p = alloc(3) // ERROR "inlining call to alloc"
     27 	}() // ERROR "inlining call to f1.func1" "inlining call to alloc" "&x escapes to heap" "moved to heap: x"
     28 
     29 	f = func() { // ERROR "func literal escapes to heap" "can inline f1.func2"
     30 		p = alloc(3) // ERROR "inlining call to alloc" "&x escapes to heap" "moved to heap: x"
     31 	}
     32 	f()
     33 }
     34 
     35 func f2() {} // ERROR "can inline f2"
     36 
     37 // No inline for panic, recover.
     38 func f3() { panic(1) }
     39 func f4() { recover() }
     40 
     41 func f5() *byte {
     42 	type T struct {
     43 		x [1]byte
     44 	}
     45 	t := new(T)    // ERROR "new.T. escapes to heap"
     46 	return &t.x[0] // ERROR "&t.x.0. escapes to heap"
     47 }
     48 
     49 func f6() *byte {
     50 	type T struct {
     51 		x struct {
     52 			y byte
     53 		}
     54 	}
     55 	t := new(T)   // ERROR "new.T. escapes to heap"
     56 	return &t.x.y // ERROR "&t.x.y escapes to heap"
     57 }
     58