From 086df1dc77710cb6fa06ca561e1fafd5a4c78d8e Mon Sep 17 00:00:00 2001 From: snyh Date: Fri, 18 Jul 2014 02:47:21 -0400 Subject: [PATCH] cmd/cgo: disable inappropriate warnings when the gcc struct is empty package main //#cgo CFLAGS: -Wall //void test() {} import "C" func main() { C.test() } This code will cause gcc issuing warnings about unused variable. This commit use offset of the second return value of Packages.structType to detect whether the gcc struct is empty, and if it's directly invoke the C function instead of writing an unused code. LGTM=dave, minux R=golang-codereviews, iant, minux, dave CC=golang-codereviews https://golang.org/cl/109640045 --- misc/cgo/test/empty.go | 18 ++++++++++++++++++ src/cmd/cgo/out.go | 6 ++++-- 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 misc/cgo/test/empty.go diff --git a/misc/cgo/test/empty.go b/misc/cgo/test/empty.go new file mode 100644 index 0000000000..daa7485492 --- /dev/null +++ b/misc/cgo/test/empty.go @@ -0,0 +1,18 @@ +// Copyright 2014 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. + +package cgotest + +/* +#cgo CFLAGS: -Werror=unused-variable +void funcWithoutAnyParams() {} +*/ +import "C" + +// Only test whether this can be compiled, unused +// variable (e.g. empty gcc strut) could cause +// warning/error under stricter CFLAGS. +func testEmptyGccStruct() { + C.funcWithoutAnyParams() +} diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go index c6c27c4dbf..a5fffd0568 100644 --- a/src/cmd/cgo/out.go +++ b/src/cmd/cgo/out.go @@ -517,7 +517,7 @@ func (p *Package) writeOutputFunc(fgcc *os.File, n *Name) { return } - ctype, _ := p.structType(n) + ctype, offset := p.structType(n) // Gcc wrapper unpacks the C argument struct // and calls the actual C function. @@ -530,7 +530,9 @@ func (p *Package) writeOutputFunc(fgcc *os.File, n *Name) { // We're trying to write a gcc struct that matches 6c/8c/5c's layout. // Use packed attribute to force no padding in this struct in case // gcc has different packing requirements. - fmt.Fprintf(fgcc, "\t%s %v *a = v;\n", ctype, p.packedAttribute()) + if offset != 0 { + fmt.Fprintf(fgcc, "\t%s %v *a = v;\n", ctype, p.packedAttribute()) + } fmt.Fprintf(fgcc, "\t") if t := n.FuncType.Result; t != nil { fmt.Fprintf(fgcc, "a->r = ") -- 2.48.1