1// errorcheck -0 -m -l 2 3// Copyright 2015 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 indirection level computation in escape analysis. 8 9package escape 10 11var sink interface{} 12 13func level0() { 14 i := 0 // ERROR "moved to heap: i" 15 p0 := &i // ERROR "moved to heap: p0" 16 p1 := &p0 // ERROR "moved to heap: p1" 17 p2 := &p1 // ERROR "moved to heap: p2" 18 sink = &p2 19} 20 21func level1() { 22 i := 0 // ERROR "moved to heap: i" 23 p0 := &i // ERROR "moved to heap: p0" 24 p1 := &p0 // ERROR "moved to heap: p1" 25 p2 := &p1 26 sink = p2 27} 28 29func level2() { 30 i := 0 // ERROR "moved to heap: i" 31 p0 := &i // ERROR "moved to heap: p0" 32 p1 := &p0 33 p2 := &p1 34 sink = *p2 35} 36 37func level3() { 38 i := 0 // ERROR "moved to heap: i" 39 p0 := &i 40 p1 := &p0 41 p2 := &p1 42 sink = **p2 43} 44 45func level4() { 46 i := 0 // ERROR "moved to heap: i" 47 p0 := &i // ERROR "moved to heap: p0" 48 p1 := &p0 49 p2 := p1 // ERROR "moved to heap: p2" 50 sink = &p2 51} 52 53func level5() { 54 i := 0 // ERROR "moved to heap: i" 55 p0 := &i // ERROR "moved to heap: p0" 56 p1 := &p0 57 p2 := p1 58 sink = p2 59} 60 61func level6() { 62 i := 0 // ERROR "moved to heap: i" 63 p0 := &i 64 p1 := &p0 65 p2 := p1 66 sink = *p2 67} 68 69func level7() { 70 i := 0 // ERROR "moved to heap: i" 71 p0 := &i 72 p1 := &p0 73 // note *p1 == &i 74 p2 := *p1 // ERROR "moved to heap: p2" 75 sink = &p2 76} 77 78func level8() { 79 i := 0 // ERROR "moved to heap: i" 80 p0 := &i 81 p1 := &p0 82 p2 := *p1 83 sink = p2 84} 85 86func level9() { 87 i := 0 88 p0 := &i 89 p1 := &p0 90 p2 := *p1 91 sink = *p2 // ERROR "\*p2 escapes to heap" 92} 93 94func level10() { 95 i := 0 96 p0 := &i 97 p1 := *p0 98 p2 := &p1 99 sink = *p2 // ERROR "\*p2 escapes to heap" 100} 101 102func level11() { 103 i := 0 104 p0 := &i 105 p1 := &p0 106 p2 := **p1 // ERROR "moved to heap: p2" 107 sink = &p2 108} 109