From: Eden Li Date: Tue, 24 Nov 2009 06:02:12 +0000 (-0800) Subject: cgo translates empty function arguments into void instead of dying with 'unexpected... X-Git-Tag: weekly.2009-12-07~147 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=a9d0da75f139c81a337b7fc912a100c3496bd0f1;p=gostls13.git cgo translates empty function arguments into void instead of dying with 'unexpected type: ...'. Fixes #162. R=rsc https://golang.org/cl/157147 --- diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index 7614f5a3b1..d2a7eeaddb 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -571,6 +571,15 @@ func (c *typeConv) FuncType(dtype *dwarf.FuncType) *FuncType { p := make([]*Type, len(dtype.ParamType)); gp := make([]*ast.Field, len(dtype.ParamType)); for i, f := range dtype.ParamType { + // gcc's DWARF generator outputs a single DotDotDotType parameter for + // function pointers that specify no parameters (e.g. void + // (*__cgo_0)()). Treat this special case as void. This case is + // invalid according to ISO C anyway (i.e. void (*__cgo_1)(...) is not + // legal). + if _, ok := f.(*dwarf.DotDotDotType); ok && i == 0 { + p, gp = nil, nil; + break; + } p[i] = c.FuncArg(f); gp[i] = &ast.Field{Type: p[i].Go}; }