|  | // errorcheck -0 -m -l | 
|  |  | 
|  | // Copyright 2015 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. | 
|  |  | 
|  | // Test indirection level computation in escape analysis. | 
|  |  | 
|  | package escape | 
|  |  | 
|  | var sink interface{} | 
|  |  | 
|  | func level0() { | 
|  | i := 0     // ERROR "moved to heap: i" | 
|  | p0 := &i   // ERROR "moved to heap: p0" | 
|  | p1 := &p0  // ERROR "moved to heap: p1" | 
|  | p2 := &p1  // ERROR "moved to heap: p2" | 
|  | sink = &p2 | 
|  | } | 
|  |  | 
|  | func level1() { | 
|  | i := 0    // ERROR "moved to heap: i" | 
|  | p0 := &i  // ERROR "moved to heap: p0" | 
|  | p1 := &p0 // ERROR "moved to heap: p1" | 
|  | p2 := &p1 | 
|  | sink = p2 | 
|  | } | 
|  |  | 
|  | func level2() { | 
|  | i := 0     // ERROR "moved to heap: i" | 
|  | p0 := &i   // ERROR "moved to heap: p0" | 
|  | p1 := &p0 | 
|  | p2 := &p1 | 
|  | sink = *p2 | 
|  | } | 
|  |  | 
|  | func level3() { | 
|  | i := 0      // ERROR "moved to heap: i" | 
|  | p0 := &i | 
|  | p1 := &p0 | 
|  | p2 := &p1 | 
|  | sink = **p2 | 
|  | } | 
|  |  | 
|  | func level4() { | 
|  | i := 0     // ERROR "moved to heap: i" | 
|  | p0 := &i   // ERROR "moved to heap: p0" | 
|  | p1 := &p0 | 
|  | p2 := p1   // ERROR "moved to heap: p2" | 
|  | sink = &p2 | 
|  | } | 
|  |  | 
|  | func level5() { | 
|  | i := 0    // ERROR "moved to heap: i" | 
|  | p0 := &i  // ERROR "moved to heap: p0" | 
|  | p1 := &p0 | 
|  | p2 := p1 | 
|  | sink = p2 | 
|  | } | 
|  |  | 
|  | func level6() { | 
|  | i := 0    // ERROR "moved to heap: i" | 
|  | p0 := &i | 
|  | p1 := &p0 | 
|  | p2 := p1 | 
|  | sink = *p2 | 
|  | } | 
|  |  | 
|  | func level7() { | 
|  | i := 0    // ERROR "moved to heap: i" | 
|  | p0 := &i | 
|  | p1 := &p0 | 
|  | // note *p1 == &i | 
|  | p2 := *p1  // ERROR "moved to heap: p2" | 
|  | sink = &p2 | 
|  | } | 
|  |  | 
|  | func level8() { | 
|  | i := 0    // ERROR "moved to heap: i" | 
|  | p0 := &i | 
|  | p1 := &p0 | 
|  | p2 := *p1 | 
|  | sink = p2 | 
|  | } | 
|  |  | 
|  | func level9() { | 
|  | i := 0 | 
|  | p0 := &i | 
|  | p1 := &p0 | 
|  | p2 := *p1 | 
|  | sink = *p2 // ERROR "\*p2 escapes to heap" | 
|  | } | 
|  |  | 
|  | func level10() { | 
|  | i := 0 | 
|  | p0 := &i | 
|  | p1 := *p0 | 
|  | p2 := &p1 | 
|  | sink = *p2 // ERROR "\*p2 escapes to heap" | 
|  | } | 
|  |  | 
|  | func level11() { | 
|  | i := 0 | 
|  | p0 := &i | 
|  | p1 := &p0 | 
|  | p2 := **p1 // ERROR "moved to heap: p2" | 
|  | sink = &p2 | 
|  | } |