]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: reject misplaced go:build comments
authorRuss Cox <rsc@golang.org>
Fri, 22 May 2020 19:22:52 +0000 (15:22 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 13 Oct 2020 01:16:45 +0000 (01:16 +0000)
We are converting from using error-prone ad-hoc syntax // +build lines
to less error-prone, standard boolean syntax //go:build lines.
The timeline is:

Go 1.16: prepare for transition
 - Builds still use // +build for file selection.
 - Source files may not contain //go:build without // +build.
 - Builds fail when a source file contains //go:build lines without // +build lines. <<<

Go 1.17: start transition
 - Builds prefer //go:build for file selection, falling back to // +build
   for files containing only // +build.
 - Source files may contain //go:build without // +build (but they won't build with Go 1.16).
 - Gofmt moves //go:build and // +build lines to proper file locations.
 - Gofmt introduces //go:build lines into files with only // +build lines.
 - Go vet rejects files with mismatched //go:build and // +build lines.

Go 1.18: complete transition
 - Go fix removes // +build lines, leaving behind equivalent // +build lines.

This CL provides part of the <<< marked line above in the Go 1.16 step:
rejecting files containing //go:build but not // +build.
The standard go command checks only consider the top of the file.
This compiler check, along with a separate go vet check for ignored files,
handles the remainder of the file.

For #41184.

Change-Id: I014006eebfc84ab5943de18bc90449e534f150a2
Reviewed-on: https://go-review.googlesource.com/c/go/+/240601
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/compile/internal/gc/lex.go
src/cmd/compile/internal/gc/noder.go
test/directive.go

index 25bc0399ce392c3516bc262c803f916d7962c524..7cce371408ae81f2e476da906e5197a454a0193f 100644 (file)
@@ -50,6 +50,9 @@ const (
 
        // Runtime and cgo type pragmas
        NotInHeap // values of this type must not be heap allocated
+
+       // Go command pragmas
+       GoBuildPragma
 )
 
 const (
@@ -71,6 +74,8 @@ const (
 
 func pragmaFlag(verb string) PragmaFlag {
        switch verb {
+       case "go:build":
+               return GoBuildPragma
        case "go:nointerface":
                if objabi.Fieldtrack_enabled != 0 {
                        return Nointerface
index 5dce533e4b7e791d08f0632c11d76113cbc9c33b..c63c80dd36cbcc8d75bcd69450f8bf4c00dc5c2d 100644 (file)
@@ -242,6 +242,7 @@ func (p *noder) node() {
        mkpackage(p.file.PkgName.Value)
 
        if pragma, ok := p.file.Pragma.(*Pragma); ok {
+               pragma.Flag &^= GoBuildPragma
                p.checkUnused(pragma)
        }
 
index 6167cd62796c6df2ce0f38d6e698730cbc5f9e86..37781c30d54e9d297159992be38ea6e8876a7c66 100644 (file)
@@ -6,11 +6,16 @@
 
 // Verify that misplaced directives are diagnosed.
 
+// ok
+//go:build !ignore
+
 //go:noinline // ERROR "misplaced compiler directive"
 
 //go:noinline // ERROR "misplaced compiler directive"
 package main
 
+//go:build bad // ERROR "misplaced compiler directive"
+
 //go:nosplit
 func f1() {}
 
@@ -93,3 +98,5 @@ type T6 = int
 
 // EOF
 //go:noinline // ERROR "misplaced compiler directive"
+
+//go:build bad // ERROR "misplaced compiler directive"