Commit 837984f3 authored by Ian Lance Taylor's avatar Ian Lance Taylor

cmd/cgo: use function arg type for _cgoCheckPointerN function

When cgo writes a _cgoCheckPointerN function to handle unsafe.Pointer,
use the function's argument type rather than interface{}. This permits
type errors to be detected at build time rather than run time.

Fixes #13830.

Change-Id: Ic7090905e16b977e2379670e0f83640dc192b565
Reviewed-on: https://go-review.googlesource.com/23675
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarAustin Clements <austin@google.com>
parent 894803c1
// 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.
// cgo converts C void* to Go unsafe.Pointer, so despite appearances C
// void** is Go *unsafe.Pointer. This test verifies that we detect the
// problem at build time.
package main
// typedef void v;
// void F(v** p) {}
import "C"
import "unsafe"
type v [0]byte
func f(p **v) {
C.F((**C.v)(unsafe.Pointer(p))) // ERROR HERE
}
func main() {
var p *v
f(&p)
}
...@@ -18,16 +18,16 @@ expect() { ...@@ -18,16 +18,16 @@ expect() {
file=$1 file=$1
shift shift
if go build $file >errs 2>&1; then if go build $file >errs 2>&1; then
echo 1>&2 misc/cgo/errors/test.bash: BUG: expected cgo to fail but it succeeded echo 1>&2 misc/cgo/errors/test.bash: BUG: expected cgo to fail on $file but it succeeded
exit 1 exit 1
fi fi
if ! test -s errs; then if ! test -s errs; then
echo 1>&2 misc/cgo/errors/test.bash: BUG: expected error output but saw none echo 1>&2 misc/cgo/errors/test.bash: BUG: expected error output for $file but saw none
exit 1 exit 1
fi fi
for error; do for error; do
if ! fgrep $error errs >/dev/null 2>&1; then if ! fgrep $error errs >/dev/null 2>&1; then
echo 1>&2 misc/cgo/errors/test.bash: BUG: expected error output to contain \"$error\" but saw: echo 1>&2 misc/cgo/errors/test.bash: BUG: expected error output for $file to contain \"$error\" but saw:
cat 1>&2 errs cat 1>&2 errs
exit 1 exit 1
fi fi
...@@ -44,6 +44,7 @@ check issue11097b.go ...@@ -44,6 +44,7 @@ check issue11097b.go
expect issue13129.go C.ushort expect issue13129.go C.ushort
check issue13423.go check issue13423.go
expect issue13635.go C.uchar C.schar C.ushort C.uint C.ulong C.longlong C.ulonglong C.complexfloat C.complexdouble expect issue13635.go C.uchar C.schar C.ushort C.uint C.ulong C.longlong C.ulonglong C.complexfloat C.complexdouble
check issue13830.go
if ! go build issue14669.go; then if ! go build issue14669.go; then
exit 1 exit 1
......
...@@ -113,7 +113,7 @@ func (p *Package) writeDefs() { ...@@ -113,7 +113,7 @@ func (p *Package) writeDefs() {
for i, t := range p.CgoChecks { for i, t := range p.CgoChecks {
n := p.unsafeCheckPointerNameIndex(i) n := p.unsafeCheckPointerNameIndex(i)
fmt.Fprintf(fgo2, "\nfunc %s(p interface{}, args ...interface{}) %s {\n", n, t) fmt.Fprintf(fgo2, "\nfunc %s(p %s, args ...interface{}) %s {\n", n, t, t)
fmt.Fprintf(fgo2, "\treturn _cgoCheckPointer(p, args...).(%s)\n", t) fmt.Fprintf(fgo2, "\treturn _cgoCheckPointer(p, args...).(%s)\n", t)
fmt.Fprintf(fgo2, "}\n") fmt.Fprintf(fgo2, "}\n")
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment