func Test8756(t *testing.T) { test8756(t) }
func Test17065(t *testing.T) { test17065(t) }
func TestThreadLock(t *testing.T) { testThreadLockFunc(t) }
+func TestCheckConst(t *testing.T) { testCheckConst(t) }
func BenchmarkCgoCall(b *testing.B) { benchCgoCall(b) }
--- /dev/null
+// 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.
+
+// Test a constant in conjunction with pointer checking.
+
+package cgotest
+
+/*
+#include <stdlib.h>
+
+#define CheckConstVal 0
+
+typedef struct {
+ int *p;
+} CheckConstStruct;
+
+static void CheckConstFunc(CheckConstStruct *p, int e) {
+}
+*/
+import "C"
+
+import (
+ "testing"
+ "unsafe"
+)
+
+func testCheckConst(t *testing.T) {
+ // The test is that this compiles successfully.
+ p := C.malloc(C.size_t(unsafe.Sizeof(C.int(0))))
+ defer C.free(p)
+ C.CheckConstFunc(&C.CheckConstStruct{(*C.int)(p)}, C.CheckConstVal)
+}
// deferred.
needsUnsafe := false
params := make([]*ast.Field, len(name.FuncType.Params))
- args := make([]ast.Expr, len(name.FuncType.Params))
+ nargs := make([]ast.Expr, len(name.FuncType.Params))
var stmts []ast.Stmt
for i, param := range name.FuncType.Params {
// params is going to become the parameters of the
// function literal.
- // args is going to become the list of arguments to the
- // function literal.
+ // nargs is going to become the list of arguments made
+ // by the call within the function literal.
// nparam is the parameter of the function literal that
// corresponds to param.
origArg := call.Call.Args[i]
- args[i] = origArg
nparam := ast.NewIdent(fmt.Sprintf("_cgo%d", i))
+ nargs[i] = nparam
// The Go version of the C type might use unsafe.Pointer,
// but the file might not import unsafe.
Type: ptype,
}
- call.Call.Args[i] = nparam
-
if !p.needsPointerCheck(f, param.Go, origArg) {
continue
}
fcall := &ast.CallExpr{
Fun: call.Call.Fun,
- Args: call.Call.Args,
+ Args: nargs,
}
ftype := &ast.FuncType{
Params: &ast.FieldList{
List: append(stmts, fbody),
},
}
- call.Call.Args = args
call.Call.Lparen = token.NoPos
call.Call.Rparen = token.NoPos