env TESTGO_VERSION=go1.99 ! go list -f '{{.Module.GoVersion}}' stderr 'go: updates to go.mod needed' stderr 'go mod tidy' go mod tidy cat go.mod go list -f '{{.Module.GoVersion}}' stdout 1.22 # Adding a@v1.0.01 should upgrade to Go 1.23rc1. cp go.mod go.mod1 go get example.com/a@v1.0.1 stderr '^go: upgraded go 1.22 => 1.23rc1\ngo: upgraded example.com/a v1.0.0 => v1.0.1\ngo: upgraded example.com/b v1.0.0 => v1.0.1$' go list -f '{{.Module.GoVersion}}' stdout 1.23rc1 # Repeating the update with go@1.24.0 should use that Go version. cp go.mod1 go.mod go get example.com/a@v1.0.1 go@1.24.0 go list -f '{{.Module.GoVersion}}' stdout 1.24.0 # Go version-constrained updates should report the problems. cp go.mod1 go.mod ! go get example.com/a@v1.0.2 go@1.24.2 stderr '^go: example.com/a@v1.0.2 requires go@1.25, not go@1.24.2$' ! go get example.com/a@v1.0.2 go@1.26.3 stderr '^go: example.com/a@v1.0.2 indirectly requires go@1.27, not go@1.26.3$' go get example.com/a@v1.0.2 go@1.28rc1 go list -f '{{.Module.GoVersion}}' stdout 1.28rc1 go get go@1.24.2 stderr '^go: downgraded go 1.28rc1 => 1.24.2$' stderr '^go: downgraded example.com/a v1.0.2 => v1.0.1$' stderr '^go: downgraded example.com/b v1.0.2 => v1.0.1$' go list -f '{{.Module.GoVersion}}' stdout 1.24.2 -- go.mod -- module m go 1.21 require ( example.com/a v1.0.0 example.com/b v0.9.0 ) replace example.com/a v1.0.0 => ./a100 replace example.com/a v1.0.1 => ./a101 replace example.com/a v1.0.2 => ./a102 replace example.com/b v1.0.1 => ./b101 replace example.com/b v1.0.2 => ./b102 replace example.com/b v1.0.0 => ./b100 replace example.com/b v0.9.0 => ./b100 -- x.go -- package m import ( _ "example.com/a" _ "example.com/b" ) -- a100/go.mod -- module example.com/a go 1.22 require example.com/b v1.0.0 -- a100/a.go -- package a -- a101/go.mod -- // this module is technically invalid, since the dep example.com/b has a newer go line than this module, // but we should still be able to handle it. module example.com/a go 1.22 require example.com/b v1.0.1 -- a101/a.go -- package a -- a102/go.mod -- // this module is technically invalid, since the dep example.com/b has a newer go line than this module, // but we should still be able to handle it. module example.com/a go 1.25 require example.com/b v1.0.2 -- a102/a.go -- package a -- b100/go.mod -- module example.com/b go 1.22 -- b100/b.go -- package b -- b101/go.mod -- module example.com/b go 1.23rc1 -- b101/b.go -- package b -- b102/go.mod -- module example.com/b go 1.27 -- b102/b.go -- package b