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
