return errors.New("binary-only packages are no longer supported")
}
+ // Go 1.22 is likely to change for loop semantics.
+ // If we try to build code written for Go 1.22,
+ // it may have aliasing bugs that it shouldn't have.
+ // See go.dev/issue/60078.
+ // When Go 1.22 is released, Go 1.20 will no longer
+ // be supported, so no one should ever run into this condition,
+ // but we are adding this check anyway,
+ // just to help catch some mistakes and usage of old
+ // Go toolchains beyond their end-of-support.
+ if p.Module != nil && !(allowedVersion(p.Module.GoVersion) || p.Module.GoVersion == "1.21") {
+ return errors.New("cannot compile Go " + p.Module.GoVersion + " code")
+ }
+
if err := b.Mkdir(a.Objdir); err != nil {
return err
}
go build subver.1
! stderr 'module requires'
! go build badsub.1
-stderr '^note: module requires Go 1.11111$'
+stderr '^note: module requires Go 1.21$'
go build versioned.1
go mod edit -require versioned.1@v1.1.0
! go build versioned.1
-stderr '^note: module requires Go 1.99999$'
+stderr '^note: module requires Go 1.21$'
[short] stop
# The message should be printed even if the compiler emits no output.
go build -o $WORK/nooutput.exe nooutput.go
! go build -toolexec=$WORK/nooutput.exe versioned.1
-stderr '^# versioned.1\nnote: module requires Go 1.99999$'
+stderr '^# versioned.1\nnote: module requires Go 1.21$'
-- go.mod --
module m
-go 1.999
+go 1.21
require (
sub.1 v1.0.0
subver.1 v1.0.0
-- subver/go.mod --
module m
-go 1.11111
+go 1.21
-- subver/x.go --
package x
-- badsub/go.mod --
module m
-go 1.11111
+go 1.21
-- badsub/x.go --
package x
-- versioned2/go.mod --
module versioned
-go 1.99999
+go 1.21
-- versioned2/x.go --
package x