diff options
| author | Cuong Manh Le <cuong.manhle.vn@gmail.com> | 2023-10-12 08:35:37 +0700 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2023-10-19 11:56:10 +0000 |
| commit | 1f25f964632b5a650323d638f2cc7d3f2917fe74 (patch) | |
| tree | e6e13ff59b60b21f7871291ef0f7ba32fb18c83d /src/cmd/compile/internal/noder | |
| parent | 40cdf69fc9279ab28f84a6e0f965de8382c578fe (diff) | |
| download | go-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.go | 38 |
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() |
