aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2023-08-11 10:58:26 -0400
committerRuss Cox <rsc@golang.org>2023-08-11 17:11:34 +0000
commit201f8b40dceb7a821fd9958b2061c33d436d107b (patch)
tree4d4eba26dc55d729c75fd63b416bfca872993d3a
parentadb775e309dea43157e931835e920ac9e7769abe (diff)
downloadgo-201f8b40dceb7a821fd9958b2061c33d436d107b.tar.gz
go-201f8b40dceb7a821fd9958b2061c33d436d107b.zip
[release-branch.go1.20] cmd/go: refuse to build Go 1.22 code
With #60078 accepted, we expect Go 1.22 will have different for loop semantics than Go 1.20 did. Once Go 1.22 is released, Go 1.20 will be unsupported, but add a check anyway, just to help catch some mistakes and usage of old Go toolchains beyond their end-of-support. Note that Go 1.20 can keep being used indefinitely with pre-Go 1.22 code. This change only makes it refuse to build code that says it needs Go 1.22 semantics, because Go 1.20 does not provide those. For #60078. Change-Id: I75118d6fbd0cc08a6bc309aca54c389a255ba7dc Reviewed-on: https://go-review.googlesource.com/c/go/+/518675 Reviewed-by: Bryan Mills <bcmills@google.com> Run-TryBot: Russ Cox <rsc@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org>
-rw-r--r--src/cmd/go/internal/work/exec.go13
-rw-r--r--src/cmd/go/testdata/script/build_go122.txt24
-rw-r--r--src/cmd/go/testdata/script/mod_go_version.txt14
3 files changed, 44 insertions, 7 deletions
diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go
index 9cf3362fbf..67d11939af 100644
--- a/src/cmd/go/internal/work/exec.go
+++ b/src/cmd/go/internal/work/exec.go
@@ -531,6 +531,19 @@ func (b *Builder) build(ctx context.Context, a *Action) (err error) {
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
}
diff --git a/src/cmd/go/testdata/script/build_go122.txt b/src/cmd/go/testdata/script/build_go122.txt
new file mode 100644
index 0000000000..a17fc253d9
--- /dev/null
+++ b/src/cmd/go/testdata/script/build_go122.txt
@@ -0,0 +1,24 @@
+! go build
+stderr '^m: cannot compile Go 1.22 code$'
+
+cd dep
+! go build
+stderr '^m: cannot compile Go 1.22 code$'
+
+-- go.mod --
+module m
+go 1.22
+
+-- p.go --
+package p
+
+-- dep/go.mod --
+module dep
+go 1.19
+require m v1.0.0
+replace m v1.0.0 => ../
+
+-- dep/p.go --
+package p
+
+import "m"
diff --git a/src/cmd/go/testdata/script/mod_go_version.txt b/src/cmd/go/testdata/script/mod_go_version.txt
index 97d9975e68..7bee95b192 100644
--- a/src/cmd/go/testdata/script/mod_go_version.txt
+++ b/src/cmd/go/testdata/script/mod_go_version.txt
@@ -8,23 +8,23 @@ go build sub.1
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
@@ -51,14 +51,14 @@ package x
-- 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
@@ -73,7 +73,7 @@ package x
-- versioned2/go.mod --
module versioned
-go 1.99999
+go 1.21
-- versioned2/x.go --
package x