]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: add #line directives to avoid printing bogus references to Go source files
authorRuss Cox <rsc@golang.org>
Wed, 2 Nov 2016 23:41:01 +0000 (19:41 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 3 Nov 2016 16:35:25 +0000 (16:35 +0000)
A bit contrived to come up with an example, but it happened in #15836, somehow.

$ cat /tmp/x.go
package main

/*
#include <stddef.h>

int foo(void);

int foo(void) {
return 2;
}

#define int asdf
*/
import "C"

func main() {
println(C.foo())
}

$ go run /tmp/x.go
# command-line-arguments
cgo-builtin-prolog:9:31: error: unknown type name 'asdf'   <<<<<
_GoString_ GoStringN(char *p, int l);
                              ^
/tmp/x.go:12:13: note: expanded from macro 'int'
#define int asdf
            ^
cgo-builtin-prolog:10:28: error: unknown type name 'asdf'  <<<<<
_GoBytes_ GoBytes(void *p, int n);
                           ^
/tmp/x.go:12:13: note: expanded from macro 'int'
#define int asdf
            ^
2 errors generated.

The two marked lines used to refer incorrectly to /tmp/x.go.

Fixes #15836.

Change-Id: I08ef60a53cfd148112fceb651eaf7b75d94a7a8d
Reviewed-on: https://go-review.googlesource.com/32613
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/cgo/ast.go
src/cmd/cgo/gcc.go
src/cmd/cgo/out.go

index 000ecd446855c47b2befdd94783c6e6e5b88099b..1d6354ad9d2b2be5f58a4f69878771cff82e4c0d 100644 (file)
@@ -87,6 +87,7 @@ func (f *File) ReadGo(name string) {
                        if cg != nil {
                                f.Preamble += fmt.Sprintf("#line %d %q\n", sourceLine(cg), name)
                                f.Preamble += commentText(cg) + "\n"
+                               f.Preamble += "#line 1 \"cgo-generated-wrapper\"\n"
                        }
                }
        }
index de87df0798b0f44daba8701fe7de3b9ee41e5f3c..8fd490ce95c8bd62fb3d16f9072b8ea655b59179 100644 (file)
@@ -429,6 +429,7 @@ func (p *Package) loadDWARF(f *File, names []*Name) {
        var b bytes.Buffer
        b.WriteString(f.Preamble)
        b.WriteString(builtinProlog)
+       b.WriteString("#line 1 \"cgo-dwarf-inference\"\n")
        for i, n := range names {
                fmt.Fprintf(&b, "__typeof__(%s) *__cgo__%d;\n", n.C, i)
                if n.Kind == "const" {
index 95f90920bf1edb5faf08e29423f56654c30ad17c..1940f9176c87e34cb2b72ac4a498fe2f949f8c73 100644 (file)
@@ -126,6 +126,13 @@ func (p *Package) writeDefs() {
                fmt.Fprint(fgo2, goProlog)
        }
 
+       if fc != nil {
+               fmt.Fprintf(fc, "#line 1 \"cgo-generated-wrappers\"\n")
+       }
+       if fm != nil {
+               fmt.Fprintf(fm, "#line 1 \"cgo-generated-wrappers\"\n")
+       }
+
        gccgoSymbolPrefix := p.gccgoSymbolPrefix()
 
        cVars := make(map[string]bool)
@@ -1301,6 +1308,7 @@ func (p *Package) cgoType(e ast.Expr) *Type {
 }
 
 const gccProlog = `
+#line 1 "cgo-gcc-prolog"
 /*
   If x and y are not equal, the type will be invalid
   (have a negative array count) and an inscrutable error will come
@@ -1334,6 +1342,7 @@ const noTsanProlog = `
 
 // This must match the TSAN code in runtime/cgo/libcgo.h.
 const yesTsanProlog = `
+#line 1 "cgo-tsan-prolog"
 #define CGO_NO_SANITIZE_THREAD __attribute__ ((no_sanitize_thread))
 
 long long _cgo_sync __attribute__ ((common));
@@ -1356,6 +1365,7 @@ static void _cgo_tsan_release() {
 var tsanProlog = noTsanProlog
 
 const builtinProlog = `
+#line 1 "cgo-builtin-prolog"
 #include <stddef.h> /* for ptrdiff_t and size_t below */
 
 /* Define intgo when compiling with GCC.  */
@@ -1508,6 +1518,7 @@ func (p *Package) cPrologGccgo() string {
 }
 
 const cPrologGccgo = `
+#line 1 "cgo-c-prolog-gccgo"
 #include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
@@ -1605,6 +1616,7 @@ func (p *Package) gccExportHeaderProlog() string {
 
 const gccExportHeaderProlog = `
 /* Start of boilerplate cgo prologue.  */
+#line 1 "cgo-gcc-export-header-prolog"
 
 #ifndef GO_CGO_PROLOGUE_H
 #define GO_CGO_PROLOGUE_H
@@ -1658,6 +1670,7 @@ const gccExportHeaderEpilog = `
 // We use weak declarations, and test the addresses, so that this code
 // works with older versions of gccgo.
 const gccgoExportFileProlog = `
+#line 1 "cgo-gccgo-export-file-prolog"
 extern _Bool runtime_iscgo __attribute__ ((weak));
 
 static void GoInit(void) __attribute__ ((constructor));