aboutsummaryrefslogtreecommitdiff
path: root/src/internal
diff options
context:
space:
mode:
authorMichael Matloob <matloob@golang.org>2024-08-16 15:13:39 -0400
committerMichael Matloob <matloob@golang.org>2024-08-27 22:37:44 +0000
commitaeac0b6cbfb42bc9c9301913a191bb09454d316a (patch)
tree5ac32b7db7fff83686c1d53a039fb66c2e1c8e2a /src/internal
parent54fe0fd43fcf8609666c16ae6d15ed92873b1564 (diff)
downloadgo-aeac0b6cbfb42bc9c9301913a191bb09454d316a.tar.xz
go/types, types2: use max(fileVersion, go1.21) if fileVersion present
Change the rules for how //go:build "file versions" are applied: instead of considering whether a file version is an upgrade or downgrade from the -lang version, always use max(fileVersion, go1.21). This prevents file versions from downgrading the version below go1.21. Before Go 1.21 the //go:build version did not have the meaning of setting the file's langage version. This fixes an issue that was appearing in GOPATH builds: Go 1.23.0 started providing -lang versions to the compiler in GOPATH mode (among other places) which it wasn't doing before, and it set -lang to the toolchain version (1.23). Because the -lang version was greater than go1.21, language version used to compile the file would be set to the //go:build file version. //go:build file versions below 1.21 could cause files that could previously build to stop building. For example, take a Go file with a //go:build line specifying go1.10. If that file used a 1.18 feature, that use would compile fine with a Go 1.22 toolchain. But it would produce an error when compiling with the 1.23.0 toolchain because it set the language version to 1.10 and disallowed the 1.18 feature. This breaks backwards compatibility: when the build tag was added, it did not have the meaning of restricting the language version. For #68658 Change-Id: I6cedda81a55bcccffaa3501eef9e2be6541b6ece Reviewed-on: https://go-review.googlesource.com/c/go/+/607955 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Griesemer <gri@google.com>
Diffstat (limited to 'src/internal')
-rw-r--r--src/internal/types/testdata/check/go1_20_19.go2
-rw-r--r--src/internal/types/testdata/check/go1_21_19.go2
-rw-r--r--src/internal/types/testdata/check/go1_21_22.go16
-rw-r--r--src/internal/types/testdata/check/go1_22_21.go16
-rw-r--r--src/internal/types/testdata/fixedbugs/issue66285.go7
5 files changed, 35 insertions, 8 deletions
diff --git a/src/internal/types/testdata/check/go1_20_19.go b/src/internal/types/testdata/check/go1_20_19.go
index 08365a7cfb..e040d396c7 100644
--- a/src/internal/types/testdata/check/go1_20_19.go
+++ b/src/internal/types/testdata/check/go1_20_19.go
@@ -14,4 +14,4 @@ type Slice []byte
type Array [8]byte
var s Slice
-var p = (Array)(s /* ok because Go 1.20 ignored the //go:build go1.19 */)
+var p = (Array)(s /* ok because file versions below go1.21 set the langage version to go1.21 */)
diff --git a/src/internal/types/testdata/check/go1_21_19.go b/src/internal/types/testdata/check/go1_21_19.go
index 2acd25865d..5866033eaf 100644
--- a/src/internal/types/testdata/check/go1_21_19.go
+++ b/src/internal/types/testdata/check/go1_21_19.go
@@ -14,4 +14,4 @@ type Slice []byte
type Array [8]byte
var s Slice
-var p = (Array)(s /* ERROR "requires go1.20 or later" */)
+var p = (Array)(s /* ok because file versions below go1.21 set the langage version to go1.21 */)
diff --git a/src/internal/types/testdata/check/go1_21_22.go b/src/internal/types/testdata/check/go1_21_22.go
new file mode 100644
index 0000000000..3939b7b1d8
--- /dev/null
+++ b/src/internal/types/testdata/check/go1_21_22.go
@@ -0,0 +1,16 @@
+// -lang=go1.21
+
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Check Go language version-specific errors.
+
+//go:build go1.22
+
+package p
+
+func f() {
+ for _ = range /* ok because of upgrade to 1.22 */ 10 {
+ }
+}
diff --git a/src/internal/types/testdata/check/go1_22_21.go b/src/internal/types/testdata/check/go1_22_21.go
new file mode 100644
index 0000000000..f910ecb59c
--- /dev/null
+++ b/src/internal/types/testdata/check/go1_22_21.go
@@ -0,0 +1,16 @@
+// -lang=go1.22
+
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Check Go language version-specific errors.
+
+//go:build go1.21
+
+package p
+
+func f() {
+ for _ = range 10 /* ERROR "requires go1.22 or later" */ {
+ }
+}
diff --git a/src/internal/types/testdata/fixedbugs/issue66285.go b/src/internal/types/testdata/fixedbugs/issue66285.go
index 9811fec3f3..4af76f05da 100644
--- a/src/internal/types/testdata/fixedbugs/issue66285.go
+++ b/src/internal/types/testdata/fixedbugs/issue66285.go
@@ -1,14 +1,9 @@
-// -lang=go1.21
+// -lang=go1.13
// Copyright 2024 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// Note: Downgrading to go1.13 requires at least go1.21,
-// hence the need for -lang=go1.21 at the top.
-
-//go:build go1.13
-
package p
import "io"