]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: set GoVersion for files on the command line with vet
authorSam Thanawalla <samthanawalla@google.com>
Mon, 17 Jun 2024 19:19:56 +0000 (19:19 +0000)
committerGopher Robot <gobot@golang.org>
Mon, 17 Jun 2024 21:04:41 +0000 (21:04 +0000)
For: #65612
Fixes: #66092
For now, we will align the behavior such that vet and the compiler agree
that gover.Local() will be used for command-line-files.

We expect to change this to set the goversion as the containing module's go
version.

Change-Id: If7f2ea3a82e8e876716f18dacc021026de175a93
Reviewed-on: https://go-review.googlesource.com/c/go/+/593156
Reviewed-by: Michael Matloob <matloob@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Sam Thanawalla <samthanawalla@google.com>

src/cmd/go/internal/work/exec.go
src/cmd/go/internal/work/gc.go
src/cmd/go/testdata/script/run_vers.txt [new file with mode: 0644]
src/cmd/go/testdata/script/vet_commandline.txt [new file with mode: 0644]

index 8dd9802f4f01a82dcdc7063f89e0d023536289a2..c4852d82aeb818cec01f1eb7d2527e6fe619e7dd 100644 (file)
@@ -1180,6 +1180,7 @@ func buildVetConfig(a *Action, srcfiles []string) {
                PackageFile:  make(map[string]string),
                Standard:     make(map[string]bool),
        }
+       vcfg.GoVersion = "go" + gover.Local()
        if a.Package.Module != nil {
                v := a.Package.Module.GoVersion
                if v == "" {
index c6041aa22a599bb7dfcf3d79d000fa0df66ed2d1..99bcaf9266028d950615c524f93a4b75969ce761 100644 (file)
@@ -66,15 +66,18 @@ func (gcToolchain) gc(b *Builder, a *Action, archive string, importcfg, embedcfg
 
        pkgpath := pkgPath(a)
        defaultGcFlags := []string{"-p", pkgpath}
+       vers := gover.Local()
        if p.Module != nil {
                v := p.Module.GoVersion
                if v == "" {
                        v = gover.DefaultGoModVersion
                }
+               // TODO(samthanawalla): Investigate when allowedVersion is not true.
                if allowedVersion(v) {
-                       defaultGcFlags = append(defaultGcFlags, "-lang=go"+gover.Lang(v))
+                       vers = v
                }
        }
+       defaultGcFlags = append(defaultGcFlags, "-lang=go"+gover.Lang(vers))
        if p.Standard {
                defaultGcFlags = append(defaultGcFlags, "-std")
        }
diff --git a/src/cmd/go/testdata/script/run_vers.txt b/src/cmd/go/testdata/script/run_vers.txt
new file mode 100644 (file)
index 0000000..770481a
--- /dev/null
@@ -0,0 +1,10 @@
+# go.dev/issue/66092
+# This test ensures that files listed on the commandline will pass
+# the language version to the compiler.
+# All compilations should specify some -lang.
+
+go build -n x.go
+stderr '-lang=go1\.[0-9]+'
+
+-- x.go --
+package main
\ No newline at end of file
diff --git a/src/cmd/go/testdata/script/vet_commandline.txt b/src/cmd/go/testdata/script/vet_commandline.txt
new file mode 100644 (file)
index 0000000..51e65bb
--- /dev/null
@@ -0,0 +1,43 @@
+# go.dev/issue/65612
+# go vet should set the GoVersion for command line files.
+
+env TESTGO_VERSION=go1.22.1
+env TESTGO_VERSION_SWITCH=switch
+
+go vet -n -json example.com/m
+stderr '"GoVersion": "go1.22.0"'
+
+# A command line file should use the local go version.
+go vet -n -json main.go
+stderr '"GoVersion": "go1.22.1"'
+
+# In workspace mode, the command line file version should use go.work version.
+cp go.work.orig go.work
+go vet -n -json example.com/m
+stderr '"GoVersion": "go1.22.0'
+
+go vet -n -json main.go
+stderr '"GoVersion": "go1.22.2'
+
+# Without go.mod or go.work, the command line file version should use local go version .
+env TESTGO_VERSION=go1.22.3
+rm go.mod
+rm go.work
+
+! go vet -n -json example.com/m
+
+go vet -n -json main.go
+stderr '"GoVersion": "go1.22.3"'
+
+-- go.mod --
+module example.com/m
+
+go 1.22.0
+
+-- go.work.orig --
+go 1.22.2
+
+use .
+
+-- main.go --
+package main