Initial commit: Go 1.23 release state
This commit is contained in:
44
test/fixedbugs/issue15747.go
Normal file
44
test/fixedbugs/issue15747.go
Normal file
@@ -0,0 +1,44 @@
|
||||
// errorcheck -0 -live
|
||||
|
||||
//go:build !goexperiment.cgocheck2
|
||||
|
||||
// Copyright 2016 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.
|
||||
|
||||
// Issue 15747: liveness analysis was marking heap-escaped params live too much,
|
||||
// and worse was using the wrong bitmap bits to do so.
|
||||
|
||||
package p
|
||||
|
||||
var global *[]byte
|
||||
|
||||
type Q struct{}
|
||||
|
||||
type T struct{ M string }
|
||||
|
||||
var b bool
|
||||
|
||||
func f1(q *Q, xx []byte) interface{} { // ERROR "live at call to newobject: xx$" "live at entry to f1: xx$"
|
||||
// xx was copied from the stack to the heap on the previous line:
|
||||
// xx was live for the first two prints but then it switched to &xx
|
||||
// being live. We should not see plain xx again.
|
||||
if b {
|
||||
global = &xx
|
||||
}
|
||||
xx, _, err := f2(xx, 5) // ERROR "live at call to f2: &xx$"
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
//go:noinline
|
||||
func f2(d []byte, n int) (odata, res []byte, e interface{}) { // ERROR "live at entry to f2: d$"
|
||||
if n > len(d) {
|
||||
return d, nil, &T{M: "hello"} // ERROR "live at call to newobject: d"
|
||||
}
|
||||
res = d[:n]
|
||||
odata = d[n:]
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user