cmd/go: set GoVersion for files on the command line with vet

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>
This commit is contained in:
Sam Thanawalla 2024-06-17 19:19:56 +00:00 committed by Gopher Robot
parent 22cf1e7f7e
commit 144c96fac3
4 changed files with 58 additions and 1 deletions

View 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 == "" {

View 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")
}

10
src/cmd/go/testdata/script/run_vers.txt vendored Normal file
View file

@ -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

View file

@ -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