From 23ffbe611d770e9f4e4d6af57eba3c9a4f72f383 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Oudompheng?= Date: Wed, 9 Nov 2011 16:01:55 -0500 Subject: [PATCH] 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 --- src/cmd/cgo/gcc.go | 7 +++++++ 1 file changed, 7 insertions(+) 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 }