aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2015-07-17 22:29:44 -0700
committerIan Lance Taylor <iant@golang.org>2015-07-18 17:33:53 +0000
commitdabb268170e38870968ebf7247bd7efcb70060f8 (patch)
tree916910ef043051df8044c34dbc6912618cde60bc
parentaadd84e0c4ac2476644d0f60b4873867c9549306 (diff)
downloadgo-dabb268170e38870968ebf7247bd7efcb70060f8.tar.xz
cmd/compile: ignore carriage return in magic comments
Update #11771. Change-Id: I3bb3262619765d3ca79652817e17e8f260f41907 Reviewed-on: https://go-review.googlesource.com/12379 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
-rw-r--r--src/cmd/compile/internal/gc/lex.go4
-rw-r--r--test/fixedbugs/issue11771.go64
2 files changed, 66 insertions, 2 deletions
diff --git a/src/cmd/compile/internal/gc/lex.go b/src/cmd/compile/internal/gc/lex.go
index b5106c6c3d..1d38fef1e0 100644
--- a/src/cmd/compile/internal/gc/lex.go
+++ b/src/cmd/compile/internal/gc/lex.go
@@ -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
index 0000000000..7691ca69a2
--- /dev/null
+++ b/test/fixedbugs/issue11771.go
@@ -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)
+ }
+}