From 1a94431a78c4de5182dd43b438701cca80455746 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 13 Jan 2016 15:51:16 -0800 Subject: [PATCH] cmd/cgo: support multiple-value special form in VarDecl Fixes #13930. Change-Id: I124b7d31d1f2be05b7f23dafd1e52d9f3f02f3f0 Reviewed-on: https://go-review.googlesource.com/18623 Run-TryBot: Matthew Dempsky Reviewed-by: Ian Lance Taylor --- misc/cgo/test/issue13930.go | 13 +++++++++++++ src/cmd/cgo/ast.go | 6 +++++- src/cmd/cgo/doc.go | 3 ++- 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 misc/cgo/test/issue13930.go diff --git a/misc/cgo/test/issue13930.go b/misc/cgo/test/issue13930.go new file mode 100644 index 0000000000..3a22459e68 --- /dev/null +++ b/misc/cgo/test/issue13930.go @@ -0,0 +1,13 @@ +// 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. + +// Issue 13930. Test that cgo's multiple-value special form for +// C function calls works in variable declaration statements. + +package cgotest + +// #include +import "C" + +var _, _ = C.abs(0) diff --git a/src/cmd/cgo/ast.go b/src/cmd/cgo/ast.go index c3a24c2b76..4c5dc9a23d 100644 --- a/src/cmd/cgo/ast.go +++ b/src/cmd/cgo/ast.go @@ -447,7 +447,11 @@ func (f *File) walk(x interface{}, context string, visit func(*File, interface{} case *ast.ImportSpec: case *ast.ValueSpec: f.walk(&n.Type, "type", visit) - f.walk(n.Values, "expr", visit) + if len(n.Names) == 2 && len(n.Values) == 1 { + f.walk(&n.Values[0], "as2", visit) + } else { + f.walk(n.Values, "expr", visit) + } case *ast.TypeSpec: f.walk(&n.Type, "type", visit) diff --git a/src/cmd/cgo/doc.go b/src/cmd/cgo/doc.go index bd38a5c153..8b4e2bfd58 100644 --- a/src/cmd/cgo/doc.go +++ b/src/cmd/cgo/doc.go @@ -148,8 +148,9 @@ assignment context to retrieve both the return value (if any) and the C errno variable as an error (use _ to skip the result value if the function returns void). For example: - n, err := C.sqrt(-1) + n, err = C.sqrt(-1) _, err := C.voidFunc() + var n, err = C.sqrt(1) Calling C function pointers is currently not supported, however you can declare Go variables which hold C function pointers and pass them -- 2.48.1