mirror of
https://github.com/golang/go
synced 2024-11-22 18:54:44 -07:00
7afe17bbdb
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
Fixes #69094
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>
(cherry picked from commit aeac0b6cbf
)
Reviewed-on: https://go-review.googlesource.com/c/go/+/608935
21 lines
596 B
Go
21 lines
596 B
Go
// 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 file versions below 1.21 set the language version to 1.21.
|
|
// The original tested a -lang version of 1.4 with a file version of
|
|
// go1.4 while this new version tests a -lang version of go1.1
|
|
// with a file version of go1.21.
|
|
|
|
//go:build go1.21
|
|
|
|
package p
|
|
|
|
func f() {
|
|
for _ = range 10 { // ERROR "file declares //go:build go1.21"
|
|
}
|
|
}
|