Commit 086df1dc authored by snyh's avatar snyh Committed by Shenghou Ma

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
parent ec5d7ba9
// 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()
}
...@@ -517,7 +517,7 @@ func (p *Package) writeOutputFunc(fgcc *os.File, n *Name) { ...@@ -517,7 +517,7 @@ func (p *Package) writeOutputFunc(fgcc *os.File, n *Name) {
return return
} }
ctype, _ := p.structType(n) ctype, offset := p.structType(n)
// Gcc wrapper unpacks the C argument struct // Gcc wrapper unpacks the C argument struct
// and calls the actual C function. // and calls the actual C function.
...@@ -530,7 +530,9 @@ func (p *Package) writeOutputFunc(fgcc *os.File, n *Name) { ...@@ -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. // 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 // Use packed attribute to force no padding in this struct in case
// gcc has different packing requirements. // gcc has different packing requirements.
if offset != 0 {
fmt.Fprintf(fgcc, "\t%s %v *a = v;\n", ctype, p.packedAttribute()) fmt.Fprintf(fgcc, "\t%s %v *a = v;\n", ctype, p.packedAttribute())
}
fmt.Fprintf(fgcc, "\t") fmt.Fprintf(fgcc, "\t")
if t := n.FuncType.Result; t != nil { if t := n.FuncType.Result; t != nil {
fmt.Fprintf(fgcc, "a->r = ") fmt.Fprintf(fgcc, "a->r = ")
......
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