diff options
author | Dan Willemsen <dwillemsen@google.com> | 2015-09-15 13:49:18 -0700 |
---|---|---|
committer | Dan Willemsen <dwillemsen@google.com> | 2015-09-15 13:51:48 -0700 |
commit | 6ff23253f8283d0c81c9db51c2d7803e086c93ad (patch) | |
tree | d70b53746897f5f6a71c19b7c062a079b4f54001 /test/escape_indir.go | |
parent | 1630e73131c3c8cc2a16baa2aefe3b9b82de658b (diff) | |
download | linux-x86-brillo-m7-mr-dev.tar.gz |
Update prebuilts to go 1.5.1android-n-preview-2android-n-preview-1brillo-m9-releasebrillo-m9-devbrillo-m8-releasebrillo-m8-devbrillo-m7-releasebrillo-m7-mr-devbrillo-m7-devbrillo-m10-releasebrillo-m10-dev
Change-Id: Ic39c72590cb0561132faefbca121c3782372b9bf
Diffstat (limited to 'test/escape_indir.go')
-rw-r--r-- | test/escape_indir.go | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/test/escape_indir.go b/test/escape_indir.go new file mode 100644 index 000000000..fe03c3fb1 --- /dev/null +++ b/test/escape_indir.go @@ -0,0 +1,160 @@ +// 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 escape analysis when assigning to indirections. + +package escape + +var sink interface{} + +type ConstPtr struct { + p *int + c ConstPtr2 + x **ConstPtr +} + +type ConstPtr2 struct { + p *int + i int +} + +func constptr0() { + i := 0 // ERROR "moved to heap: i" + x := &ConstPtr{} // ERROR "&ConstPtr literal does not escape" + // BAD: i should not escape here + x.p = &i // ERROR "&i escapes to heap" + _ = x +} + +func constptr01() *ConstPtr { + i := 0 // ERROR "moved to heap: i" + x := &ConstPtr{} // ERROR "&ConstPtr literal escapes to heap" + x.p = &i // ERROR "&i escapes to heap" + return x +} + +func constptr02() ConstPtr { + i := 0 // ERROR "moved to heap: i" + x := &ConstPtr{} // ERROR "&ConstPtr literal does not escape" + x.p = &i // ERROR "&i escapes to heap" + return *x +} + +func constptr03() **ConstPtr { + i := 0 // ERROR "moved to heap: i" + x := &ConstPtr{} // ERROR "&ConstPtr literal escapes to heap" "moved to heap: x" + x.p = &i // ERROR "&i escapes to heap" + return &x // ERROR "&x escapes to heap" +} + +func constptr1() { + i := 0 // ERROR "moved to heap: i" + x := &ConstPtr{} // ERROR "&ConstPtr literal escapes to heap" + x.p = &i // ERROR "&i escapes to heap" + sink = x // ERROR "x escapes to heap" +} + +func constptr2() { + i := 0 // ERROR "moved to heap: i" + x := &ConstPtr{} // ERROR "&ConstPtr literal does not escape" + x.p = &i // ERROR "&i escapes to heap" + sink = *x // ERROR "\*x escapes to heap" +} + +func constptr4() *ConstPtr { + p := new(ConstPtr) // ERROR "new\(ConstPtr\) escapes to heap" + *p = *&ConstPtr{} // ERROR "&ConstPtr literal does not escape" + return p +} + +func constptr5() *ConstPtr { + p := new(ConstPtr) // ERROR "new\(ConstPtr\) escapes to heap" + p1 := &ConstPtr{} // ERROR "&ConstPtr literal does not escape" + *p = *p1 + return p +} + +// BAD: p should not escape here +func constptr6(p *ConstPtr) { // ERROR "leaking param content: p" + p1 := &ConstPtr{} // ERROR "&ConstPtr literal does not escape" + *p1 = *p + _ = p1 +} + +func constptr7() **ConstPtr { + p := new(ConstPtr) // ERROR "new\(ConstPtr\) escapes to heap" "moved to heap: p" + var tmp ConstPtr2 + p1 := &tmp // ERROR "&tmp does not escape" + p.c = *p1 + return &p // ERROR "&p escapes to heap" +} + +func constptr8() *ConstPtr { + p := new(ConstPtr) // ERROR "new\(ConstPtr\) escapes to heap" + var tmp ConstPtr2 + p.c = *&tmp // ERROR "&tmp does not escape" + return p +} + +func constptr9() ConstPtr { + p := new(ConstPtr) // ERROR "new\(ConstPtr\) does not escape" + var p1 ConstPtr2 + i := 0 // ERROR "moved to heap: i" + p1.p = &i // ERROR "&i escapes to heap" + p.c = p1 + return *p +} + +func constptr10() ConstPtr { + x := &ConstPtr{} // ERROR "moved to heap: x" "&ConstPtr literal escapes to heap" + i := 0 // ERROR "moved to heap: i" + var p *ConstPtr + p = &ConstPtr{p: &i, x: &x} // ERROR "&i escapes to heap" "&x escapes to heap" "&ConstPtr literal does not escape" + var pp **ConstPtr + pp = &p // ERROR "&p does not escape" + return **pp +} + +func constptr11() *ConstPtr { + i := 0 // ERROR "moved to heap: i" + p := new(ConstPtr) // ERROR "new\(ConstPtr\) escapes to heap" + p1 := &ConstPtr{} // ERROR "&ConstPtr literal does not escape" + p1.p = &i // ERROR "&i escapes to heap" + *p = *p1 + return p +} + +func foo(p **int) { // ERROR "foo p does not escape" + i := 0 // ERROR "moved to heap: i" + y := p + *y = &i // ERROR "&i escapes to heap" +} + +func foo1(p *int) { // ERROR "p does not escape" + i := 0 // ERROR "moved to heap: i" + y := &p // ERROR "&p does not escape" + *y = &i // ERROR "&i escapes to heap" +} + +func foo2() { + type Z struct { + f **int + } + x := new(int) // ERROR "moved to heap: x" "new\(int\) escapes to heap" + sink = &x // ERROR "&x escapes to heap" + var z Z + z.f = &x // ERROR "&x does not escape" + p := z.f + i := 0 // ERROR "moved to heap: i" + *p = &i // ERROR "&i escapes to heap" +} + +var global *byte + +func f() { + var x byte // ERROR "moved to heap: x" + global = &*&x // ERROR "&\(\*\(&x\)\) escapes to heap" "&x escapes to heap" +} |