]> Cypherpunks repositories - gostls13.git/commitdiff
cgo: print error instead of panic on undeclared enums/structs
authorRémy Oudompheng <oudomphe@phare.normalesup.org>
Wed, 9 Nov 2011 21:01:55 +0000 (16:01 -0500)
committerRuss Cox <rsc@golang.org>
Wed, 9 Nov 2011 21:01:55 +0000 (16:01 -0500)
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

index 67744dd0d9f987ed4092354557fee90b6c119e0d..fdc69f5a3e71876526568d4721a69942130c981c 100644 (file)
@@ -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
                        }