From: Rémy Oudompheng Date: Wed, 9 Nov 2011 21:01:55 +0000 (-0500) Subject: cgo: print error instead of panic on undeclared enums/structs X-Git-Tag: weekly.2011-11-18~130 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=23ffbe611d770e9f4e4d6af57eba3c9a4f72f383;p=gostls13.git cgo: print error instead of panic on undeclared enums/structs Types are left as nil if no DWARF information is found and checking in the rewriting pass so that appropriate errors with line numbers can be printed. Fixes #2408. R=rsc CC=golang-dev, remy https://golang.org/cl/5336041 --- diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index 67744dd0d9..fdc69f5a3e 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -577,6 +577,9 @@ func (p *Package) loadDWARF(f *File, names []*Name) { var conv typeConv conv.Init(p.PtrSize) for i, n := range names { + if types[i] == nil { + continue + } f, fok := types[i].(*dwarf.FuncType) if n.Kind != "type" && fok { n.Kind = "func" @@ -664,6 +667,10 @@ func (p *Package) rewriteRef(f *File) { case "type": if r.Name.Kind != "type" { error_(r.Pos(), "expression C.%s used as type", r.Name.Go) + } else if r.Name.Type == nil { + // Use of C.enum_x, C.struct_x or C.union_x without C definition. + // GCC won't raise an error when using pointers to such unknown types. + error_(r.Pos(), "type C.%s: undefined C type '%s'", r.Name.Go, r.Name.C) } else { expr = r.Name.Type.Go }