]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: omit file:pos for non-existent errors
authorEmmanuel T Odeke <emmanuel@orijtech.com>
Thu, 30 Apr 2020 03:55:22 +0000 (20:55 -0700)
committerRobert Griesemer <gri@golang.org>
Fri, 8 May 2020 20:28:57 +0000 (20:28 +0000)
Omits printing the file:line:column when trying to
open non-existent files

Given:
    go tool compile x.go

* Before:
    x.go:0: open x.go: no such file or directory

* After:
    open x.go: no such file or directory

Reverts the revert in CL 231043 by only fixing the case
of non-existent errors which is what the original bug
was about. The fix for "permission errors" will come later
on when I have bandwidth to investigate the differences
between running with root and why os.Open works for some
builders and not others.

Fixes #36437

Change-Id: I9c8a0981ad708b504bb43990a4105b42266fa41f
Reviewed-on: https://go-review.googlesource.com/c/go/+/230941
Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/cmd/compile/internal/gc/noder.go
src/cmd/compile/internal/gc/subr.go
test/fixedbugs/issue36437.go [new file with mode: 0644]

index 31fe46ad62a19f386f6a5e5e0cafb66cc73aeb6d..802aab226847d56ebb389cfa7eb49a6b47fbc057 100644 (file)
@@ -44,7 +44,7 @@ func parseFiles(filenames []string) uint {
 
                        f, err := os.Open(filename)
                        if err != nil {
-                               p.error(syntax.Error{Pos: syntax.MakePos(base, 0, 0), Msg: err.Error()})
+                               p.error(syntax.Error{Msg: err.Error()})
                                return
                        }
                        defer f.Close()
index 2bbc5e4ae15d1a623cb386addfac1365d21abd36..9362c7428865a6f7d10b1e75fb8071d799c462d7 100644 (file)
@@ -60,9 +60,15 @@ func adderrorname(n *Node) {
 }
 
 func adderr(pos src.XPos, format string, args ...interface{}) {
+       msg := fmt.Sprintf(format, args...)
+       // Only add the position if know the position.
+       // See issue golang.org/issue/11361.
+       if pos.IsKnown() {
+               msg = fmt.Sprintf("%v: %s", linestr(pos), msg)
+       }
        errors = append(errors, Error{
                pos: pos,
-               msg: fmt.Sprintf("%v: %s\n", linestr(pos), fmt.Sprintf(format, args...)),
+               msg: msg + "\n",
        })
 }
 
diff --git a/test/fixedbugs/issue36437.go b/test/fixedbugs/issue36437.go
new file mode 100644 (file)
index 0000000..f96544b
--- /dev/null
@@ -0,0 +1,49 @@
+// run
+
+// +build !nacl,!js
+
+// Copyright 2020 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.
+
+// Tests that when non-existent files are passed to the
+// compiler, such as in:
+//    go tool compile foo
+// we don't print the beginning position:
+//    foo:0: open foo: no such file or directory
+// but instead omit it and print out:
+//    open foo: no such file or directory
+
+package main
+
+import (
+       "fmt"
+       "io/ioutil"
+       "os"
+       "os/exec"
+       "regexp"
+)
+
+func main() {
+       tmpDir, err := ioutil.TempDir("", "issue36437")
+       if err != nil {
+               panic(err)
+       }
+       defer os.RemoveAll(tmpDir)
+
+       msgOrErr := func(msg []byte, err error) string {
+               if len(msg) == 0 && err != nil {
+                       return err.Error()
+               }
+               return string(msg)
+       }
+
+       filename := "non-existent.go"
+       output, err := exec.Command("go", "tool", "compile", filename).CombinedOutput()
+       got := msgOrErr(output, err)
+
+       regFilenamePos := regexp.MustCompile(filename + ":\\d+")
+       if regFilenamePos.MatchString(got) {
+               fmt.Printf("Error message must not contain filename:pos, but got:\n%q\n", got)
+       }
+}