]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.2] cmd/cgo: fix line number in an error message
authorAndrew Gerrand <adg@golang.org>
Fri, 1 Nov 2013 00:06:07 +0000 (11:06 +1100)
committerAndrew Gerrand <adg@golang.org>
Fri, 1 Nov 2013 00:06:07 +0000 (11:06 +1100)
««« CL 14870046 / b508daf6dae6
cmd/cgo: fix line number in an error message

Fixes #6563.

R=golang-dev, iant
CC=golang-dev
https://golang.org/cl/14870046
»»»

R=golang-dev
CC=golang-dev
https://golang.org/cl/20150045

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

index 78094c6b51a0b53878826cc8844129ad2f6f6f3e..8e674dce7dfaf388f8648b6c0c2b8a33523e3e50 100644 (file)
@@ -1,10 +1,14 @@
+// Copyright 2013 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
 
 /*
 #cgo LDFLAGS: -c
 
 void test() {
-       xxx;            // This is line 7.
+       xxx;            // ERROR HERE
 }
 */
 import "C"
diff --git a/misc/cgo/errors/err2.go b/misc/cgo/errors/err2.go
new file mode 100644 (file)
index 0000000..0c64ffe
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2013 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
+
+import "C"
+
+func main() {
+       s := ""
+       _ = s
+       C.malloc(s) // ERROR HERE
+}
index e9fa6d01958fa330a998fbf5f6ef83194ba9480f..697ae2fed20b55f4322b2322dd2807ee4c9df5c0 100755 (executable)
@@ -2,18 +2,30 @@
 # Use of this source code is governed by a BSD-style
 # license that can be found in the LICENSE file.
 
-if go tool cgo err1.go >errs 2>&1; then
-  echo 1>&2 misc/cgo/errors/test.bash: BUG: expected cgo to fail but it succeeded
-  exit 1
-fi
-if ! test -s errs; then
-  echo 1>&2 misc/cgo/errors/test.bash: BUG: expected error output but saw none
-  exit 1
-fi
-if ! fgrep err1.go:7 errs >/dev/null 2>&1; then
-  echo 1>&2 misc/cgo/errors/test.bash: BUG: expected error on line 7 but saw:
-  cat 1>&2 errs
-  exit 1
-fi
+check() {
+       file=$1
+       line=$(grep -n 'ERROR HERE' $file | sed 's/:.*//')
+       if [ "$line" = "" ]; then
+               echo 1>&2 misc/cgo/errors/test.bash: BUG: cannot find ERROR HERE in $file
+               exit 1
+       fi
+       if go build $file >errs 2>&1; then
+               echo 1>&2 misc/cgo/errors/test.bash: BUG: expected cgo to fail but it succeeded
+               exit 1
+       fi
+       if ! test -s errs; then
+               echo 1>&2 misc/cgo/errors/test.bash: BUG: expected error output but saw none
+               exit 1
+       fi
+       if ! fgrep $file:$line: errs >/dev/null 2>&1; then
+               echo 1>&2 misc/cgo/errors/test.bash: BUG: expected error on line $line but saw:
+               cat 1>&2 errs
+               exit 1
+       fi
+}
+
+check err1.go
+check err2.go
+
 rm -rf errs _obj
 exit 0
index 47531c7e2e649fe8cc4cddd98d4d6d7f4949d12e..7e9a55a0c996ada4848e0f0cc1bb8f9f0089355e 100644 (file)
@@ -654,7 +654,7 @@ func (p *Package) rewriteRef(f *File) {
                                // Okay - might be new(T)
                                expr = r.Name.Type.Go
                        } else if r.Name.Kind == "var" {
-                               expr = &ast.StarExpr{X: expr}
+                               expr = &ast.StarExpr{Star: (*r.Expr).Pos(), X: expr}
                        }
 
                case "type":
@@ -683,6 +683,16 @@ func (p *Package) rewriteRef(f *File) {
                                }
                        }
                }
+
+               // Copy position information from old expr into new expr,
+               // in case expression being replaced is first on line.
+               // See golang.org/issue/6563.
+               pos := (*r.Expr).Pos()
+               switch x := expr.(type) {
+               case *ast.Ident:
+                       expr = &ast.Ident{NamePos: pos, Name: x.Name}
+               }
+
                *r.Expr = expr
        }