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