]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: ignore carriage return in magic comments
authorIan Lance Taylor <iant@golang.org>
Sat, 18 Jul 2015 05:29:44 +0000 (22:29 -0700)
committerIan Lance Taylor <iant@golang.org>
Sat, 18 Jul 2015 17:33:53 +0000 (17:33 +0000)
Update #11771.

Change-Id: I3bb3262619765d3ca79652817e17e8f260f41907
Reviewed-on: https://go-review.googlesource.com/12379
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/cmd/compile/internal/gc/lex.go
test/fixedbugs/issue11771.go [new file with mode: 0644]

index b5106c6c3d64246e4798e7eab1bd3a804e5c4354..1d38fef1e001b5493ecac38e2ba05e7490ef6d2b 100644 (file)
@@ -1576,7 +1576,7 @@ func getlinepragma() int {
                }
                cp = nil
 
-               text := lexbuf.String()
+               text := strings.TrimSuffix(lexbuf.String(), "\r")
 
                if strings.HasPrefix(text, "go:cgo_") {
                        pragcgo(text)
@@ -1666,7 +1666,7 @@ func getlinepragma() int {
        if linep == 0 {
                return c
        }
-       text := lexbuf.String()
+       text := strings.TrimSuffix(lexbuf.String(), "\r")
        n := 0
        for _, c := range text[linep:] {
                if c < '0' || c > '9' {
diff --git a/test/fixedbugs/issue11771.go b/test/fixedbugs/issue11771.go
new file mode 100644 (file)
index 0000000..7691ca6
--- /dev/null
@@ -0,0 +1,64 @@
+// +build !nacl
+// run
+
+// Copyright 2015 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 11771: Magic comments should ignore carriage returns.
+
+package main
+
+import (
+       "bytes"
+       "fmt"
+       "io/ioutil"
+       "log"
+       "os"
+       "os/exec"
+       "path/filepath"
+       "runtime"
+)
+
+func main() {
+       if runtime.Compiler != "gc" {
+               return
+       }
+
+       dir, err := ioutil.TempDir("", "go-issue11771")
+       if err != nil {
+               log.Fatalf("creating temp dir: %v\n", err)
+       }
+       defer os.RemoveAll(dir)
+
+       // The go:nowritebarrier magic comment is only permitted in
+       // the runtime package.  So we confirm that the compilation
+       // fails.
+
+       var buf bytes.Buffer
+       fmt.Fprintln(&buf, `
+package main
+
+func main() {
+}
+`)
+       fmt.Fprintln(&buf, "//go:nowritebarrier\r")
+       fmt.Fprintln(&buf, `
+func x() {
+}
+`)
+
+       if err := ioutil.WriteFile(filepath.Join(dir, "x.go"), buf.Bytes(), 0666); err != nil {
+               log.Fatal(err)
+       }
+
+       cmd := exec.Command("go", "tool", "compile", "x.go")
+       cmd.Dir = dir
+       output, err := cmd.CombinedOutput()
+       if err == nil {
+               log.Fatal("compile succeeded unexpectedly")
+       }
+       if !bytes.Contains(output, []byte("only allowed in runtime")) {
+               log.Fatalf("wrong error message from compiler; got:\n%s\n", output)
+       }
+}