mirror of
https://github.com/golang/go
synced 2024-11-08 05:56:12 -07:00
ddd35f8d71
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>
69 lines
1.3 KiB
Go
69 lines
1.3 KiB
Go
// run
|
|
|
|
// Copyright 2020 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.
|
|
|
|
// This test makes sure unsafe-uintptr arguments are handled correctly.
|
|
|
|
package main
|
|
|
|
import (
|
|
"runtime"
|
|
"unsafe"
|
|
)
|
|
|
|
var done = make(chan bool, 1)
|
|
|
|
func setup() unsafe.Pointer {
|
|
s := "ok"
|
|
runtime.SetFinalizer(&s, func(p *string) { *p = "FAIL" })
|
|
return unsafe.Pointer(&s)
|
|
}
|
|
|
|
//go:noinline
|
|
//go:uintptrescapes
|
|
func test(s string, p, q uintptr, rest ...uintptr) int {
|
|
runtime.GC()
|
|
runtime.GC()
|
|
|
|
if *(*string)(unsafe.Pointer(p)) != "ok" {
|
|
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()), uintptr(setup()), uintptr(setup()), uintptr(setup()))
|
|
}
|
|
|
|
func main() {
|
|
test("normal", uintptr(setup()), uintptr(setup()), uintptr(setup()), uintptr(setup()))
|
|
<-done
|
|
|
|
go test("go", uintptr(setup()), uintptr(setup()), uintptr(setup()), uintptr(setup()))
|
|
<-done
|
|
|
|
func() {
|
|
defer test("defer", uintptr(setup()), uintptr(setup()), uintptr(setup()), uintptr(setup()))
|
|
}()
|
|
<-done
|
|
|
|
f()
|
|
<-done
|
|
}
|