]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: use function arg type for _cgoCheckPointerN function
authorIan Lance Taylor <iant@golang.org>
Thu, 2 Jun 2016 04:32:47 +0000 (21:32 -0700)
committerIan Lance Taylor <iant@golang.org>
Thu, 9 Jun 2016 16:02:03 +0000 (16:02 +0000)
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: Austin Clements <austin@google.com>
misc/cgo/errors/issue13830.go [new file with mode: 0644]
misc/cgo/errors/test.bash
src/cmd/cgo/out.go

diff --git a/misc/cgo/errors/issue13830.go b/misc/cgo/errors/issue13830.go
new file mode 100644 (file)
index 0000000..ac20c82
--- /dev/null
@@ -0,0 +1,26 @@
+// 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)
+}
index 643d03820502850015a3081aec4f7cc6db3e9433..429cec7627ef3a25a0426da5c322fa57209f6ba9 100755 (executable)
@@ -18,16 +18,16 @@ expect() {
        file=$1
        shift
        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
        fi
        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
        fi
        for error; do
                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
                        exit 1
                fi
@@ -44,6 +44,7 @@ check issue11097b.go
 expect issue13129.go C.ushort
 check issue13423.go
 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
        exit 1
index 13ee0c4ca70639da5667c7d8a425443bc4d92e34..294c27994e3af0ff87fb8c2b914a698940b18c00 100644 (file)
@@ -113,7 +113,7 @@ func (p *Package) writeDefs() {
 
        for i, t := range p.CgoChecks {
                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, "}\n")
        }