This reverts commit CL 604935.
Reason for revert: The team has decided that this change will be added to a point release.
Change-Id: I1c1032b881c3a98312a4753b9767cb7c8eed9e09
Reviewed-on: https://go-review.googlesource.com/c/go/+/605096
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Michael Matloob <matloob@golang.org>
                {"", "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 != "" {
 
                                // 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
                                }
                        }
 
                {"", "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 != "" {
 
                                // 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
                                }
                        }
 
 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 */)
 
 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" */)
 
+++ /dev/null
-// -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
 
+++ /dev/null
-// -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
 
-// -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"
 
-// 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