]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: check for compiler errors in the C preamble
authorMatthew Dempsky <mdempsky@google.com>
Thu, 14 Aug 2014 16:21:58 +0000 (09:21 -0700)
committerIan Lance Taylor <iant@golang.org>
Thu, 14 Aug 2014 16:21:58 +0000 (09:21 -0700)
E.g., here's the new "go build" output:

$ go build misc/cgo/errors/issue8442.go
# command-line-arguments
could not determine kind of name for C.issue8442foo

gcc errors for preamble:
misc/cgo/errors/issue8442.go:11:19: error: unknown type name 'UNDEF'

Fixes #8442.

LGTM=iant
R=iant, alex.brainman
CC=golang-codereviews
https://golang.org/cl/129160043

misc/cgo/errors/issue8442.go [new file with mode: 0644]
misc/cgo/errors/test.bash
src/cmd/cgo/gcc.go

diff --git a/misc/cgo/errors/issue8442.go b/misc/cgo/errors/issue8442.go
new file mode 100644 (file)
index 0000000..45daf8e
--- /dev/null
@@ -0,0 +1,17 @@
+// 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 main
+
+// Issue 8442.  Cgo output unhelpful error messages for
+// invalid C preambles.
+
+/*
+void issue8442foo(UNDEF*); // ERROR HERE
+*/
+import "C"
+
+func main() {
+       C.issue8442foo(nil)
+}
index e5bf47a0dd40af1553930e712f6047b67143c698..c96264389c8f4a6e3da1f3882b5141c44234f1bb 100755 (executable)
@@ -28,6 +28,7 @@ check err1.go
 check err2.go
 check err3.go
 check issue7757.go
+check issue8442.go
 
 rm -rf errs _obj
 exit 0
index 482b35197c033e0b2855d2ba814cc09c0c8e954e..d77d56c22abc8c3b4a1b59259e0dbc5ba59ec996 100644 (file)
@@ -332,6 +332,7 @@ func (p *Package) guessKinds(f *File) []*Name {
        const (
                notType = 1 << iota
                notConst
+               notDeclared
        )
        for _, line := range strings.Split(stderr, "\n") {
                if !strings.Contains(line, ": error:") {
@@ -366,7 +367,7 @@ func (p *Package) guessKinds(f *File) []*Name {
                        completed = true
 
                case "not-declared":
-                       error_(token.NoPos, "%s", strings.TrimSpace(line[c2+1:]))
+                       sniff[i] |= notDeclared
                case "not-type":
                        sniff[i] |= notType
                case "not-const":
@@ -375,12 +376,12 @@ func (p *Package) guessKinds(f *File) []*Name {
        }
 
        if !completed {
-               fatalf("%s did not produce error at completed:1\non input:\n%s", p.gccBaseCmd()[0], b.Bytes())
+               fatalf("%s did not produce error at completed:1\non input:\n%s\nfull error output:\n%s", p.gccBaseCmd()[0], b.Bytes(), stderr)
        }
 
        for i, n := range names {
                switch sniff[i] {
-               case 0:
+               default:
                        error_(token.NoPos, "could not determine kind of name for C.%s", fixGo(n.Go))
                case notType:
                        n.Kind = "const"
@@ -391,6 +392,14 @@ func (p *Package) guessKinds(f *File) []*Name {
                }
        }
        if nerrors > 0 {
+               // Check if compiling the preamble by itself causes any errors,
+               // because the messages we've printed out so far aren't helpful
+               // to users debugging preamble mistakes.  See issue 8442.
+               preambleErrors := p.gccErrors([]byte(f.Preamble))
+               if len(preambleErrors) > 0 {
+                       error_(token.NoPos, "\n%s errors for preamble:\n%s", p.gccBaseCmd()[0], preambleErrors)
+               }
+
                fatalf("unresolved names")
        }