aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/noder
diff options
context:
space:
mode:
authorCuong Manh Le <cuong.manhle.vn@gmail.com>2023-10-12 08:35:37 +0700
committerGopher Robot <gobot@golang.org>2023-10-19 11:56:10 +0000
commit1f25f964632b5a650323d638f2cc7d3f2917fe74 (patch)
treee6e13ff59b60b21f7871291ef0f7ba32fb18c83d /src/cmd/compile/internal/noder
parent40cdf69fc9279ab28f84a6e0f965de8382c578fe (diff)
downloadgo-1f25f964632b5a650323d638f2cc7d3f2917fe74.tar.xz
cmd/compile: report mismatched version set by //go:build
Fixes #63489 Change-Id: I5e02dc5165ada7f5c292d56203dc670e96eaf2c1 Reviewed-on: https://go-review.googlesource.com/c/go/+/534755 Auto-Submit: Cuong Manh Le <cuong.manhle.vn@gmail.com> Reviewed-by: Than McIntosh <thanm@google.com> Reviewed-by: Matthew Dempsky <mdempsky@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src/cmd/compile/internal/noder')
-rw-r--r--src/cmd/compile/internal/noder/irgen.go38
1 files changed, 27 insertions, 11 deletions
diff --git a/src/cmd/compile/internal/noder/irgen.go b/src/cmd/compile/internal/noder/irgen.go
index c09a79d4f5..e77119695b 100644
--- a/src/cmd/compile/internal/noder/irgen.go
+++ b/src/cmd/compile/internal/noder/irgen.go
@@ -29,8 +29,12 @@ func checkFiles(m posMap, noders []*noder) (*types2.Package, *types2.Info) {
// setup and syntax error reporting
files := make([]*syntax.File, len(noders))
+ // posBaseMap maps all file pos bases back to *syntax.File
+ // for checking Go version mismatched.
+ posBaseMap := make(map[*syntax.PosBase]*syntax.File)
for i, p := range noders {
files[i] = p.file
+ posBaseMap[p.file.Pos().Base()] = p.file
}
// typechecking
@@ -43,17 +47,8 @@ func checkFiles(m posMap, noders []*noder) (*types2.Package, *types2.Info) {
Context: ctxt,
GoVersion: base.Flag.Lang,
IgnoreBranchErrors: true, // parser already checked via syntax.CheckBranches mode
- Error: func(err error) {
- terr := err.(types2.Error)
- msg := terr.Msg
- // if we have a version error, hint at the -lang setting
- if versionErrorRx.MatchString(msg) {
- msg = fmt.Sprintf("%s (-lang was set to %s; check go.mod)", msg, base.Flag.Lang)
- }
- base.ErrorfAt(m.makeXPos(terr.Pos), terr.Code, "%s", msg)
- },
- Importer: &importer,
- Sizes: types2.SizesFor("gc", buildcfg.GOARCH),
+ Importer: &importer,
+ Sizes: types2.SizesFor("gc", buildcfg.GOARCH),
}
if base.Flag.ErrorURL {
conf.ErrorURL = " [go.dev/e/%s]"
@@ -69,6 +64,27 @@ func checkFiles(m posMap, noders []*noder) (*types2.Package, *types2.Info) {
FileVersions: make(map[*syntax.PosBase]types2.Version),
// expand as needed
}
+ conf.Error = func(err error) {
+ terr := err.(types2.Error)
+ msg := terr.Msg
+ if versionErrorRx.MatchString(msg) {
+ posBase := terr.Pos.Base()
+ for !posBase.IsFileBase() { // line directive base
+ posBase = posBase.Pos().Base()
+ }
+ v := info.FileVersions[posBase]
+ fileVersion := fmt.Sprintf("go%d.%d", v.Major, v.Minor)
+ file := posBaseMap[posBase]
+ if file.GoVersion == fileVersion {
+ // If we have a version error caused by //go:build, report it.
+ msg = fmt.Sprintf("%s (file declares //go:build %s)", msg, fileVersion)
+ } else {
+ // Otherwise, hint at the -lang setting.
+ msg = fmt.Sprintf("%s (-lang was set to %s; check go.mod)", msg, base.Flag.Lang)
+ }
+ }
+ base.ErrorfAt(m.makeXPos(terr.Pos), terr.Code, "%s", msg)
+ }
pkg, err := conf.Check(base.Ctxt.Pkgpath, files, info)
base.ExitIfErrors()