]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: show pos info in undefined name errors
authorAlberto Donizetti <alb.donizetti@gmail.com>
Thu, 5 Jan 2017 16:27:34 +0000 (17:27 +0100)
committerAlberto Donizetti <alb.donizetti@gmail.com>
Sat, 3 Jun 2017 16:08:49 +0000 (16:08 +0000)
For test.go:

package main

import (
   "C"
   "fmt"
)

func main() {
 fmt.Println("Hello, world!")
 C.no_such_f()
}

Before:

could not determine kind of name for C.no_such_f

After:

./test.go:10:2: could not determine kind of name for C.no_such_f

Fixes #18452

Change-Id: I49c136b7fa60fab25d2d5b905d440fe4d106e565
Reviewed-on: https://go-review.googlesource.com/34783
Run-TryBot: Alberto Donizetti <alb.donizetti@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
misc/cgo/errors/issue18452.go [new file with mode: 0644]
misc/cgo/errors/test.bash
src/cmd/cgo/gcc.go

diff --git a/misc/cgo/errors/issue18452.go b/misc/cgo/errors/issue18452.go
new file mode 100644 (file)
index 0000000..36ef7f5
--- /dev/null
@@ -0,0 +1,18 @@
+// Copyright 2017 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.
+
+// Issue 18452: show pos info in undefined name errors
+
+package p
+
+import (
+       "C"
+       "fmt"
+)
+
+func a() {
+       fmt.Println("Hello, world!")
+       C.function_that_does_not_exist() // line 16
+       C.pi                             // line 17
+}
index e9e36ce2cf09efd160641f324cc0d3b003a4d4ff..ed0b0946925b4b7dfedc9752879776a443ab7125 100755 (executable)
@@ -48,6 +48,7 @@ check issue13830.go
 check issue16116.go
 check issue16591.go
 check issue18889.go
+expect issue18452.go issue18452.go:16 issue18452.go:17
 
 if ! go build issue14669.go; then
        exit 1
index 50e6dfae0788074de7ea56b7a93bbe174b191e8d..0850bdc92f00b91ad0cb054798479041acc08829 100644 (file)
@@ -421,7 +421,14 @@ func (p *Package) guessKinds(f *File) []*Name {
        for i, n := range names {
                switch sniff[i] &^ notSignedIntConst {
                default:
-                       error_(token.NoPos, "could not determine kind of name for C.%s", fixGo(n.Go))
+                       var tpos token.Pos
+                       for _, ref := range f.Ref {
+                               if ref.Name == n {
+                                       tpos = ref.Pos()
+                                       break
+                               }
+                       }
+                       error_(tpos, "could not determine kind of name for C.%s", fixGo(n.Go))
                case notStrLiteral | notType:
                        if sniff[i]&notSignedIntConst != 0 {
                                n.Kind = "uconst"