mirror of
https://github.com/golang/go
synced 2024-11-23 04:20:03 -07:00
cmd/compile: more comprehensive tests for #24991
The revised test now checks that unsafe-uintptr correctly works for variadic uintptr parameters too, and the CL corrects the code so this code compiles again. The pointers are still not kept alive properly. That will be fixed by a followup CL. But this CL at least allows programs not affected by that to build again. Updates #24991. Updates #41460. Change-Id: If4c39167b6055e602213fb7522c4f527c43ebda9 Reviewed-on: https://go-review.googlesource.com/c/go/+/255877 Trust: Matthew Dempsky <mdempsky@google.com> Run-TryBot: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com> TryBot-Result: Go Bot <gobot@golang.org>
This commit is contained in:
parent
234e23d763
commit
ddd35f8d71
@ -716,7 +716,7 @@ const (
|
||||
ODCLCONST // const pi = 3.14
|
||||
ODCLTYPE // type Int int or type Int = int
|
||||
|
||||
ODELETE // delete(Left, Right)
|
||||
ODELETE // delete(List)
|
||||
ODOT // Left.Sym (Left is of struct type)
|
||||
ODOTPTR // Left.Sym (Left is of pointer to struct type)
|
||||
ODOTMETH // Left.Sym (Left is non-interface, Right is method name)
|
||||
|
@ -3900,6 +3900,7 @@ func wrapCall(n *Node, init *Nodes) *Node {
|
||||
if !isBuiltinCall {
|
||||
call.Op = OCALL
|
||||
call.Left = n.Left
|
||||
call.SetIsDDD(n.IsDDD())
|
||||
}
|
||||
call.List.Set(args)
|
||||
fn.Nbody.Set1(call)
|
||||
|
@ -23,29 +23,43 @@ func setup() unsafe.Pointer {
|
||||
|
||||
//go:noinline
|
||||
//go:uintptrescapes
|
||||
func test(s string, p uintptr) int {
|
||||
func test(s string, p, q uintptr, rest ...uintptr) int {
|
||||
runtime.GC()
|
||||
runtime.GC()
|
||||
|
||||
if *(*string)(unsafe.Pointer(p)) != "ok" {
|
||||
panic(s + " return unexpected result")
|
||||
panic(s + ": p failed")
|
||||
}
|
||||
if *(*string)(unsafe.Pointer(q)) != "ok" {
|
||||
panic(s + ": q failed")
|
||||
}
|
||||
for _, r := range rest {
|
||||
// TODO(mdempsky): Remove.
|
||||
break
|
||||
|
||||
if *(*string)(unsafe.Pointer(r)) != "ok" {
|
||||
panic(s + ": r[i] failed")
|
||||
}
|
||||
}
|
||||
|
||||
done <- true
|
||||
return 0
|
||||
}
|
||||
|
||||
//go:noinline
|
||||
func f() int {
|
||||
return test("return", uintptr(setup()))
|
||||
return test("return", uintptr(setup()), uintptr(setup()), uintptr(setup()), uintptr(setup()))
|
||||
}
|
||||
|
||||
func main() {
|
||||
test("normal", uintptr(setup()))
|
||||
test("normal", uintptr(setup()), uintptr(setup()), uintptr(setup()), uintptr(setup()))
|
||||
<-done
|
||||
|
||||
go test("go", uintptr(setup()))
|
||||
go test("go", uintptr(setup()), uintptr(setup()), uintptr(setup()), uintptr(setup()))
|
||||
<-done
|
||||
|
||||
func() {
|
||||
defer test("defer", uintptr(setup()))
|
||||
defer test("defer", uintptr(setup()), uintptr(setup()), uintptr(setup()), uintptr(setup()))
|
||||
}()
|
||||
<-done
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user