]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.19] cmd/go: refuse to build Go 1.22 code
authorRuss Cox <rsc@golang.org>
Fri, 11 Aug 2023 14:58:26 +0000 (10:58 -0400)
committerGopher Robot <gobot@golang.org>
Fri, 11 Aug 2023 18:34:00 +0000 (18:34 +0000)
With #60078 accepted, we expect Go 1.22 will have different
for loop semantics than Go 1.19 did.
Go 1.19 is already 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.19 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.19 does not provide those.

Cherry-pick of the change from the Go 1.20 branch.

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>
Reviewed-on: https://go-review.googlesource.com/c/go/+/518815
Auto-Submit: Russ Cox <rsc@golang.org>
TryBot-Bypass: Russ Cox <rsc@golang.org>

src/cmd/go/internal/work/exec.go
src/cmd/go/testdata/script/build_go122.txt [new file with mode: 0644]
src/cmd/go/testdata/script/mod_go_version.txt

index 4840568d679edfc5f03984caaffd0150b92314e2..6884ad9bccf857aeb2e3e4549b206aab21f55fb2 100644 (file)
@@ -546,6 +546,18 @@ 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.
+       // Go 1.19 is no longer supported,
+       // 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.20" || 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 (file)
index 0000000..67b57ef
--- /dev/null
@@ -0,0 +1,44 @@
+! go build
+stderr '^m: cannot compile Go 1.22 code$'
+
+cd dep
+! go build
+stderr '^m: cannot compile Go 1.22 code$'
+
+cd ../dep20
+go build
+
+cd ../dep21
+go build
+
+-- 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"
+
+-- dep20/go.mod --
+module dep
+go 1.20
+
+-- dep20/p.go --
+package p
+
+-- dep21/go.mod --
+module dep
+go 1.21
+
+-- dep21/p.go --
+package p
index 97d9975e6806060fa1f1a4d3f94454b37c06bedc..7bee95b192427614af9a217a75462f609acaa46d 100644 (file)
@@ -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