blob: 490f615f73ac0a872ff7be428422f530ce528ba2 [file] [log] [blame]
Dmitry Vyukov6d9fd7e2015-02-19 15:44:08 +03001// errorcheck -0 -m -l
2
Emmanuel Odeke53fd5222016-04-10 14:32:26 -07003// Copyright 2015 The Go Authors. All rights reserved.
Dmitry Vyukov6d9fd7e2015-02-19 15:44:08 +03004// 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" "&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
21func 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 Vyukovedcc0622015-02-19 16:27:32 +030026 sink = p2 // ERROR "p2 escapes to heap"
Dmitry Vyukov6d9fd7e2015-02-19 15:44:08 +030027}
28
29func level2() {
David Chase7fbb1b32015-03-26 16:36:15 -040030 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 Vyukovedcc0622015-02-19 16:27:32 +030034 sink = *p2 // ERROR "\*p2 escapes to heap"
Dmitry Vyukov6d9fd7e2015-02-19 15:44:08 +030035}
36
37func level3() {
David Chase7fbb1b32015-03-26 16:36:15 -040038 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 Vyukovedcc0622015-02-19 16:27:32 +030042 sink = **p2 // ERROR "\* \(\*p2\) escapes to heap"
Dmitry Vyukov6d9fd7e2015-02-19 15:44:08 +030043}
44
45func 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
53func 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 Vyukovedcc0622015-02-19 16:27:32 +030058 sink = p2 // ERROR "p2 escapes to heap"
Dmitry Vyukov6d9fd7e2015-02-19 15:44:08 +030059}
60
61func 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 Vyukovedcc0622015-02-19 16:27:32 +030066 sink = *p2 // ERROR "\*p2 escapes to heap"
Dmitry Vyukov6d9fd7e2015-02-19 15:44:08 +030067}
68
69func level7() {
David Chase7fbb1b32015-03-26 16:36:15 -040070 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 Vyukov6d9fd7e2015-02-19 15:44:08 +030074 p2 := *p1 // ERROR "moved to heap: p2"
75 sink = &p2 // ERROR "&p2 escapes to heap"
76}
77
78func 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 Vyukovedcc0622015-02-19 16:27:32 +030083 sink = p2 // ERROR "p2 escapes to heap"
Dmitry Vyukov6d9fd7e2015-02-19 15:44:08 +030084}
85
86func level9() {
87 i := 0
88 p0 := &i // ERROR "&i does not escape"
89 p1 := &p0 // ERROR "&p0 does not escape"
90 p2 := *p1
Dmitry Vyukovedcc0622015-02-19 16:27:32 +030091 sink = *p2 // ERROR "\*p2 escapes to heap"
Dmitry Vyukov6d9fd7e2015-02-19 15:44:08 +030092}
93
94func level10() {
95 i := 0
96 p0 := &i // ERROR "&i does not escape"
97 p1 := *p0
David Chase7fbb1b32015-03-26 16:36:15 -040098 p2 := &p1 // ERROR "&p1 does not escape"
Dmitry Vyukovedcc0622015-02-19 16:27:32 +030099 sink = *p2 // ERROR "\*p2 escapes to heap"
Dmitry Vyukov6d9fd7e2015-02-19 15:44:08 +0300100}
101
102func 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}