diff --git a/src/cmd/compile/internal/types2/api_test.go b/src/cmd/compile/internal/types2/api_test.go index 37b26556892..d9ba6208880 100644 --- a/src/cmd/compile/internal/types2/api_test.go +++ b/src/cmd/compile/internal/types2/api_test.go @@ -3036,21 +3036,17 @@ func TestFileVersions(t *testing.T) { {"", "go1.20", ""}, // file upgrade ignored {"go1.19", "go1.20", "go1.20"}, // file upgrade permitted {"go1.20", "go1.19", "go1.20"}, // file downgrade not permitted - {"go1.21", "go1.20", "go1.21"}, // file downgrade not permitted - {"go1.22", "go1.21", "go1.21"}, // file downgrade permitted (file and module version are >= go1.21) + {"go1.21", "go1.19", "go1.19"}, // file downgrade permitted (module version is >= go1.21) // versions containing release numbers // (file versions containing release numbers are considered invalid) {"go1.19.0", "", "go1.19.0"}, // no file version specified {"go1.20", "go1.20.1", "go1.20"}, // file upgrade ignored {"go1.20.1", "go1.20", "go1.20.1"}, // file upgrade ignored - {"go1.21.0", "go1.21.1", "go1.21.0"}, // file upgrade ignored - {"go1.21", "go1.21.1", "go1.21"}, // file upgrade ignored {"go1.20.1", "go1.21", "go1.21"}, // file upgrade permitted - {"go1.21.1", "go1.21", "go1.21.1"}, // file downgrade ignored {"go1.20.1", "go1.19", "go1.20.1"}, // file downgrade not permitted {"go1.21.1", "go1.19.1", "go1.21.1"}, // file downgrade not permitted (invalid file version) - {"go1.22.1", "go1.21", "go1.21"}, // file downgrade permitted (file and module version is >= go1.21) + {"go1.21.1", "go1.19", "go1.19"}, // file downgrade permitted (module version is >= go1.21) } { var src string if test.fileVersion != "" { diff --git a/src/cmd/compile/internal/types2/check.go b/src/cmd/compile/internal/types2/check.go index 5cee742063a..cd1b2d513c1 100644 --- a/src/cmd/compile/internal/types2/check.go +++ b/src/cmd/compile/internal/types2/check.go @@ -353,25 +353,12 @@ func (check *Checker) initFiles(files []*syntax.File) { // To work around this, downgrades are only allowed when the // module's Go version is Go 1.21 or later. // - // Downgrades are also only allowed to Go versions Go 1.21 or later. - // In GOPATH mode, there's no way to set a module version and the - // -lang is set to the local toolchain version to allow the use of - // new features in GOPATH mode. But //go:build lines added before go1.21 - // weren't intended to downgrade, so code with //go:build lines for - // go versions earlier than 1.21 may use language features added - // in later versions and compile. - // - // We should probably change the downgradeOk condition to capture this - // instead of adding an extra condition, but to make the change simpler, - // we've tried to limit it to one line. - // TODO(gri): simplify this code after 1.23 has shipped - // // If there is no valid check.version, then we don't really know what // Go version to apply. // Legacy tools may do this, and they historically have accepted everything. // Preserve that behavior by ignoring //go:build constraints entirely in that // case (!pkgVersionOk). - if cmp > 0 || cmp < 0 && downgradeOk && fileVersion.cmp(go1_21) >= 0 { + if cmp > 0 || cmp < 0 && downgradeOk { v = file.GoVersion } } diff --git a/src/go/types/api_test.go b/src/go/types/api_test.go index d2096c114af..f5bf49b4f8f 100644 --- a/src/go/types/api_test.go +++ b/src/go/types/api_test.go @@ -3040,21 +3040,17 @@ func TestFileVersions(t *testing.T) { {"", "go1.20", ""}, // file upgrade ignored {"go1.19", "go1.20", "go1.20"}, // file upgrade permitted {"go1.20", "go1.19", "go1.20"}, // file downgrade not permitted - {"go1.21", "go1.20", "go1.21"}, // file downgrade not permitted - {"go1.22", "go1.21", "go1.21"}, // file downgrade permitted (file and module version are >= go1.21) + {"go1.21", "go1.19", "go1.19"}, // file downgrade permitted (module version is >= go1.21) // versions containing release numbers // (file versions containing release numbers are considered invalid) {"go1.19.0", "", "go1.19.0"}, // no file version specified {"go1.20", "go1.20.1", "go1.20"}, // file upgrade ignored {"go1.20.1", "go1.20", "go1.20.1"}, // file upgrade ignored - {"go1.21.0", "go1.21.1", "go1.21.0"}, // file upgrade ignored - {"go1.21", "go1.21.1", "go1.21"}, // file upgrade ignored {"go1.20.1", "go1.21", "go1.21"}, // file upgrade permitted - {"go1.21.1", "go1.21", "go1.21.1"}, // file downgrade ignored {"go1.20.1", "go1.19", "go1.20.1"}, // file downgrade not permitted {"go1.21.1", "go1.19.1", "go1.21.1"}, // file downgrade not permitted (invalid file version) - {"go1.22.1", "go1.21", "go1.21"}, // file downgrade permitted (file and module version is >= go1.21) + {"go1.21.1", "go1.19", "go1.19"}, // file downgrade permitted (module version is >= go1.21) } { var src string if test.fileVersion != "" { diff --git a/src/go/types/check.go b/src/go/types/check.go index 7472c9c5cd4..2d56b0f75c5 100644 --- a/src/go/types/check.go +++ b/src/go/types/check.go @@ -374,25 +374,12 @@ func (check *Checker) initFiles(files []*ast.File) { // To work around this, downgrades are only allowed when the // module's Go version is Go 1.21 or later. // - // Downgrades are also only allowed to Go versions Go 1.21 or later. - // In GOPATH mode, there's no way to set a module version and the - // -lang is set to the local toolchain version to allow the use of - // new features in GOPATH mode. But //go:build lines added before go1.21 - // weren't intended to downgrade, so code with //go:build lines for - // go versions earlier than 1.21 may use language features added - // in later versions and compile. - // - // We should probably change the downgradeOk condition to capture this - // instead of adding an extra condition, but to make the change simpler, - // we've tried to limit it to one line. - // TODO(gri): simplify this code after 1.23 has shipped - // // If there is no valid check.version, then we don't really know what // Go version to apply. // Legacy tools may do this, and they historically have accepted everything. // Preserve that behavior by ignoring //go:build constraints entirely in that // case (!pkgVersionOk). - if cmp > 0 || cmp < 0 && downgradeOk && fileVersion.cmp(go1_21) >= 0 { + if cmp > 0 || cmp < 0 && downgradeOk { v = file.GoVersion } } diff --git a/src/internal/types/testdata/check/go1_20_19.go b/src/internal/types/testdata/check/go1_20_19.go index ba1c4543323..08365a7cfb5 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 downgrades below 1.21 are ignored */) +var p = (Array)(s /* ok because Go 1.20 ignored the //go:build go1.19 */) diff --git a/src/internal/types/testdata/check/go1_21_19.go b/src/internal/types/testdata/check/go1_21_19.go index 6c0900d0272..2acd25865d4 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 /* ok because downgrades below 1.21 are ignored */) +var p = (Array)(s /* ERROR "requires go1.20 or later" */) diff --git a/src/internal/types/testdata/check/go1_21_22.go b/src/internal/types/testdata/check/go1_21_22.go deleted file mode 100644 index 695503ace17..00000000000 --- a/src/internal/types/testdata/check/go1_21_22.go +++ /dev/null @@ -1,16 +0,0 @@ -// -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 { - } -} \ No newline at end of file diff --git a/src/internal/types/testdata/check/go1_22_21.go b/src/internal/types/testdata/check/go1_22_21.go deleted file mode 100644 index 79e21a7de82..00000000000 --- a/src/internal/types/testdata/check/go1_22_21.go +++ /dev/null @@ -1,16 +0,0 @@ -// -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" */ { - } -} \ No newline at end of file diff --git a/src/internal/types/testdata/fixedbugs/issue66285.go b/src/internal/types/testdata/fixedbugs/issue66285.go index 4af76f05da8..9811fec3f35 100644 --- a/src/internal/types/testdata/fixedbugs/issue66285.go +++ b/src/internal/types/testdata/fixedbugs/issue66285.go @@ -1,9 +1,14 @@ -// -lang=go1.13 +// -lang=go1.21 // 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" diff --git a/test/fixedbugs/issue63489a.go b/test/fixedbugs/issue63489a.go index 9b06d949bfa..b88120f2c04 100644 --- a/test/fixedbugs/issue63489a.go +++ b/test/fixedbugs/issue63489a.go @@ -1,20 +1,16 @@ -// errorcheck -lang=go1.22 +// errorcheck -lang=go1.21 // Copyright 2023 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. -// This file has been changed from its original version as -// //go:build language downgrades below go1.21 are no longer -// supported. The original tested a downgrade from go1.21 to -// go1.4 while this new version tests a downgrade from go1.22 -// to go1.21 - -//go:build go1.21 +//go:build go1.4 package p -func f() { - for _ = range 10 { // ERROR "file declares //go:build go1.21" - } -} +const c = 0o123 // ERROR "file declares //go:build go1.4" + +// ERROR "file declares //go:build go1.4" + +//line issue63489a.go:13:1 +const d = 0o124