// run //go:build !nacl && !js && !wasip1 && gc // 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", "-p=p", "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) } }