Test of "too new" diagnostics from the stdversion analyzer.
This test references go1.21 and go1.22 symbols from std.
See also gopls/internal/test/marker/testdata/diagnostics/stdversion.txt
which runs the same test within the gopls analysis driver, to ensure
coverage of per-file Go version support.
-- go.work --
go 1.22
use .
use mod20
use mod21
use mod22
use old
-- go.mod --
module example.com
go 1.21
-- basic/basic.go --
// File version is 1.21.
package basic
import "go/types"
func _() {
// old package-level type
var _ types.Info // ok: defined by go1.0
// new field of older type
_ = new(types.Info).FileVersions // want `types.FileVersions requires go1.22 or later \(module is go1.21\)`
// new method of older type
new(types.Info).PkgNameOf // want `types.PkgNameOf requires go1.22 or later \(module is go1.21\)`
// new package-level type
var a types.Alias // want `types.Alias requires go1.22 or later \(module is go1.21\)`
// new method of new type
a.Underlying() // no diagnostic
}
-- despite/errors.go --
// File version is 1.21.
// Check that RunDespiteErrors is enabled.
package ignore
import "go/types"
func _() {
// report something before the syntax error.
_ = new(types.Info).FileVersions // want `types.FileVersions requires go1.22 or later \(module is go1.21\)`
}
invalid syntax // exercise RunDespiteErrors
-- mod20/go.mod --
module example.com/mod20
go 1.20
-- mod20/notag.go --
// The 1.20 module is before the forward compatibility regime:
// The file's build tag effects selection, but
// not language semantics, so stdversion is silent.
package mod20
import "go/types"
func _() {
var _ types.Alias
}
-- mod20/tag16.go --
// The 1.20 module is before the forward compatibility regime:
// The file's build tag effects selection, but
// not language semantics, so stdversion is silent.
//go:build go1.16
package mod20
import "bytes"
import "go/types"
var _ = bytes.Clone
var _ = types.Alias
-- mod20/tag22.go --
// The 1.20 module is before the forward compatibility regime:
// The file's build tag effects selection, but
// not language semantics, so stdversion is silent.
//go:build go1.22
package mod20
import "bytes"
import "go/types"
var _ = bytes.Clone
var _ = types.Alias
-- mod21/go.mod --
module example.com/mod21
go 1.21
-- mod21/notag.go --
// File version is 1.21.
package mod21
import "go/types"
func _() {
// old package-level type
var _ types.Info // ok: defined by go1.0
// new field of older type
_ = new(types.Info).FileVersions // want `types.FileVersions requires go1.22 or later \(module is go1.21\)`
// new method of older type
new(types.Info).PkgNameOf // want `types.PkgNameOf requires go1.22 or later \(module is go1.21\)`
// new package-level type
var a types.Alias // want `types.Alias requires go1.22 or later \(module is go1.21\)`
// new method of new type
a.Underlying() // no diagnostic
}
-- mod21/tag16.go --
// File version is 1.21.
//
// The module is within the forward compatibility regime so
// the build tag (1.16) can modify the file version, but it cannot
// go below the 1.21 "event horizon" (#68658).
//go:build go1.16
package mod21
import "bytes"
import "go/types"
var _ = bytes.Clone
var _ = types.Alias // want `types.Alias requires go1.22 or later \(module is go1.21\)`
-- mod21/tag22.go --
// File version is 1.22.
//
// The module is within the forward compatibility regime so
// the build tag (1.22) updates the file version to 1.22.
//go:build go1.22
package mod21
import "bytes"
import "go/types"
var _ = bytes.Clone
var _ = types.Alias
-- mod22/go.mod --
module example.com/mod22
go 1.22
-- mod22/notag.go --
// File version is 1.22.
package mod22
import "go/types"
func _() {
var _ = bytes.Clone
var _ = types.Alias
}
-- mod22/tag16.go --
// File version is 1.21.
//
// The module is within the forward compatibility regime so
// the build tag (1.16) can modify the file version, but it cannot
// go below the 1.21 "event horizon" (#68658).
//go:build go1.16
package mod22
import "bytes"
import "go/types"
var _ = bytes.Clone
var _ = types.Alias // want `types.Alias requires go1.22 or later \(file is go1.21\)`
-- old/go.mod --
module example.com/old
go 1.5
-- old/notag.go --
package old
import "go/types"
var _ types.Alias // no diagnostic: go.mod is too old for us to care
-- old/tag21.go --
// The build tag is ignored due to the module version.
//go:build go1.21
package old
import "go/types"
var _ = types.Alias // no diagnostic: go.mod is too old for us to care