]> Cypherpunks.ru repositories - gostls13.git/blob - test/fixedbugs/issue15747.go
7825958066118e57fdd5d8e0303b31ca39298642
[gostls13.git] / test / fixedbugs / issue15747.go
1 // errorcheck -0 -live
2
3 //go:build !goexperiment.cgocheck2
4 // +build !goexperiment.cgocheck2
5
6 // Copyright 2016 The Go Authors.  All rights reserved.
7 // Use of this source code is governed by a BSD-style
8 // license that can be found in the LICENSE file.
9
10 // Issue 15747: liveness analysis was marking heap-escaped params live too much,
11 // and worse was using the wrong bitmap bits to do so.
12
13 package p
14
15 var global *[]byte
16
17 type Q struct{}
18
19 type T struct{ M string }
20
21 var b bool
22
23 func f1(q *Q, xx []byte) interface{} { // ERROR "live at call to newobject: xx$" "live at entry to f1: xx$"
24         // xx was copied from the stack to the heap on the previous line:
25         // xx was live for the first two prints but then it switched to &xx
26         // being live. We should not see plain xx again.
27         if b {
28                 global = &xx
29         }
30         xx, _, err := f2(xx, 5) // ERROR "live at call to f2: &xx$"
31         if err != nil {
32                 return err
33         }
34         return nil
35 }
36
37 //go:noinline
38 func f2(d []byte, n int) (odata, res []byte, e interface{}) { // ERROR "live at entry to f2: d$"
39         if n > len(d) {
40                 return d, nil, &T{M: "hello"} // ERROR "live at call to newobject: d"
41         }
42         res = d[:n]
43         odata = d[n:]
44         return
45 }