1
0
mirror of https://github.com/golang/go synced 2024-11-27 02:51:24 -07:00
go/test/fixedbugs/issue24491a.go
Matthew Dempsky ddd35f8d71 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>
2020-09-18 05:12:59 +00:00

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
}