From fe3bb31a49ee09f091715e36e8b27bc956ba8def Mon Sep 17 00:00:00 2001 From: Akihiro Suda Date: Tue, 14 Apr 2026 19:03:57 +0900 Subject: [PATCH 1/2] all: update to x/tools@55fb96f This brings in CL 765402 etc. For #73878 --- src/cmd/go.mod | 6 +-- src/cmd/go.sum | 12 ++--- .../passes/httpresponse/httpresponse.go | 7 +-- .../go/analysis/passes/modernize/modernize.go | 6 +++ .../go/analysis/passes/modernize/rangeint.go | 53 +++++++++++-------- .../analysis/passes/modernize/unsafefuncs.go | 5 -- .../go/analysis/unitchecker/unitchecker.go | 17 +++--- .../x/tools/internal/bisect/bisect.go | 2 + .../tools/internal/refactor/inline/inline.go | 3 +- .../x/tools/internal/typeparams/coretype.go | 8 +-- src/cmd/vendor/modules.txt | 6 +-- 11 files changed, 73 insertions(+), 52 deletions(-) diff --git a/src/cmd/go.mod b/src/cmd/go.mod index 342c56240b0058..4d96507cc3aa35 100644 --- a/src/cmd/go.mod +++ b/src/cmd/go.mod @@ -6,12 +6,12 @@ require ( github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83 golang.org/x/arch v0.23.1-0.20260109160903-657d90bd6695 golang.org/x/build v0.0.0-20260122183339-3ba88df37c64 - golang.org/x/mod v0.34.0 + golang.org/x/mod v0.35.0 golang.org/x/sync v0.20.0 golang.org/x/sys v0.43.0 - golang.org/x/telemetry v0.0.0-20260311193753-579e4da9a98c + golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa golang.org/x/term v0.39.0 - golang.org/x/tools v0.43.1-0.20260407202037-f6476fbaabd3 + golang.org/x/tools v0.44.1-0.20260414062052-55fb96ff894f ) require ( diff --git a/src/cmd/go.sum b/src/cmd/go.sum index 9d2e85a6e011bb..3ec3d536af3da9 100644 --- a/src/cmd/go.sum +++ b/src/cmd/go.sum @@ -10,19 +10,19 @@ golang.org/x/arch v0.23.1-0.20260109160903-657d90bd6695 h1:q45HsUyFzBjBk4mHGgUew golang.org/x/arch v0.23.1-0.20260109160903-657d90bd6695/go.mod h1:dNHoOeKiyja7GTvF9NJS1l3Z2yntpQNzgrjh1cU103A= golang.org/x/build v0.0.0-20260122183339-3ba88df37c64 h1:BNhBATNmH/VtzGolB+ksQPPvn6ZyffiR8TmKenqNo+A= golang.org/x/build v0.0.0-20260122183339-3ba88df37c64/go.mod h1:3QmSbNil8ZWqC94m80Glej1v8b92gYzPIQPTtSa0c+4= -golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI= -golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= +golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= +golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/telemetry v0.0.0-20260311193753-579e4da9a98c h1:6a8FdnNk6bTXBjR4AGKFgUKuo+7GnR3FX5L7CbveeZc= -golang.org/x/telemetry v0.0.0-20260311193753-579e4da9a98c/go.mod h1:TpUTTEp9frx7rTdLpC9gFG9kdI7zVLFTFFlqaH2Cncw= +golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa h1:efT73AJZfAAUV7SOip6pWGkwJDzIGiKBZGVzHYa+ve4= +golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa/go.mod h1:kHjTxDEnAu6/Nl9lDkzjWpR+bmKfxeiRuSDlsMb70gE= golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY= golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww= golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= -golang.org/x/tools v0.43.1-0.20260407202037-f6476fbaabd3 h1:kKxxg32Xl95dav6werhfwQpDWpSGWR4G43Dj1bkDqlQ= -golang.org/x/tools v0.43.1-0.20260407202037-f6476fbaabd3/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= +golang.org/x/tools v0.44.1-0.20260414062052-55fb96ff894f h1:OsDhJTPRMdqueEUhZ6K1sdC07K6rj9i4RYTQGF6zSHA= +golang.org/x/tools v0.44.1-0.20260414062052-55fb96ff894f/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= rsc.io/markdown v0.0.0-20240306144322-0bf8f97ee8ef h1:mqLYrXCXYEZOop9/Dbo6RPX11539nwiCNBb1icVPmw8= rsc.io/markdown v0.0.0-20240306144322-0bf8f97ee8ef/go.mod h1:8xcPgWmwlZONN1D9bjxtHEjrUtSEa3fakVF8iaewYKQ= diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/httpresponse/httpresponse.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/httpresponse/httpresponse.go index 37ecb6523bd1ca..22539dea980de7 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/httpresponse/httpresponse.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/httpresponse/httpresponse.go @@ -9,6 +9,7 @@ package httpresponse import ( "go/ast" "go/types" + "slices" "golang.org/x/tools/go/analysis" "golang.org/x/tools/go/analysis/passes/inspect" @@ -144,8 +145,8 @@ func isHTTPFuncOrMethodOnClient(info *types.Info, expr *ast.CallExpr) bool { // node, along with the number of call expressions encountered. func restOfBlock(stack []ast.Node) ([]ast.Stmt, int) { var ncalls int - for i := len(stack) - 1; i >= 0; i-- { - if b, ok := stack[i].(*ast.BlockStmt); ok { + for i, n := range slices.Backward(stack) { + if b, ok := n.(*ast.BlockStmt); ok { for j, v := range b.List { if v == stack[i+1] { return b.List[j:], ncalls @@ -154,7 +155,7 @@ func restOfBlock(stack []ast.Node) ([]ast.Stmt, int) { break } - if _, ok := stack[i].(*ast.CallExpr); ok { + if _, ok := n.(*ast.CallExpr); ok { ncalls++ } } diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/modernize.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/modernize.go index aa59e7e4ee4920..db3b86fbf4c8a8 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/modernize.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/modernize.go @@ -85,6 +85,12 @@ func isIntLiteral(info *types.Info, e ast.Expr, n int64) bool { return info.Types[e].Value == constant.MakeInt64(n) } +// isInteger reports whether t is an integer type. +func isInteger(t types.Type) bool { + basic, ok := t.Underlying().(*types.Basic) + return ok && basic.Info()&types.IsInteger != 0 +} + // filesUsingGoVersion returns a cursor for each *ast.File in the inspector // that uses at least the specified version of Go (e.g. "go1.24"). // diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/rangeint.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/rangeint.go index 03c7fd4f3f9b6e..7c529c97da97d8 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/rangeint.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/rangeint.go @@ -9,6 +9,7 @@ import ( "go/ast" "go/token" "go/types" + "log" "golang.org/x/tools/go/analysis" "golang.org/x/tools/go/analysis/passes/inspect" @@ -18,6 +19,7 @@ import ( "golang.org/x/tools/internal/analysis/analyzerutil" typeindexanalyzer "golang.org/x/tools/internal/analysis/typeindex" "golang.org/x/tools/internal/astutil" + "golang.org/x/tools/internal/typeparams" "golang.org/x/tools/internal/typesinternal" "golang.org/x/tools/internal/typesinternal/typeindex" "golang.org/x/tools/internal/versions" @@ -214,6 +216,36 @@ func rangeint(pass *analysis.Pass) (any, error) { } } + // The loop index (v) must not be a type parameter constrained by + // multiple distinct integer types, or a type parameter constrained + // by non-integer types. Transforming such instances to a range loop + // would result in a compiler error. + // See golang/go#78571. + terms, err := typeparams.NormalTerms(v.Type()) // NormalTerms works for any type + if err != nil { + log.Fatalf("internal error: cannot compute type set of loop var %v: %v", v, err) + } + if len(terms) != 0 { + // From the spec (https://go.dev/ref/spec#For_range): + // "If the type of the range expression is a type parameter, all + // types in its type set must have the same underlying type and the + // range expression must be valid for that type." + // + // Check if all terms have the same underlying type by comparing + // them to the first term. + u := terms[0].Type().Underlying() + // If the constraint has any non-integer terms, skip. (Range over + // float is not allowed.) + if !isInteger(u) { + continue nextLoop + } + for _, term := range terms[1:] { + if !types.Identical(u, term.Type().Underlying()) { + continue nextLoop + } + } + } + // If limit is len(slice), // simplify "range len(slice)" to "range slice". if call, ok := limit.(*ast.CallExpr); ok && @@ -357,24 +389,3 @@ func isScalarLvalue(info *types.Info, curId inspector.Cursor) bool { } return false } - -// enclosingSignature returns the signature of the innermost -// function enclosing the syntax node denoted by cur -// or nil if the node is not within a function. -// -// TODO(adonovan): factor with gopls/internal/util/typesutil.EnclosingSignature. -func enclosingSignature(cur inspector.Cursor, info *types.Info) *types.Signature { - if c, ok := enclosingFunc(cur); ok { - switch n := c.Node().(type) { - case *ast.FuncDecl: - if f, ok := info.Defs[n.Name]; ok { - return f.Type().(*types.Signature) - } - case *ast.FuncLit: - if f, ok := info.Types[n]; ok { - return f.Type.(*types.Signature) - } - } - } - return nil -} diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/unsafefuncs.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/unsafefuncs.go index 191eba95c946f3..91c2f378ea89b7 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/unsafefuncs.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/modernize/unsafefuncs.go @@ -203,8 +203,3 @@ func deleteConv(cur inspector.Cursor) []analysis.TextEdit { }, } } - -func isInteger(t types.Type) bool { - basic, ok := t.Underlying().(*types.Basic) - return ok && basic.Info()&types.IsInteger != 0 -} diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker.go index cc6725242619fc..f6f3cd5ecf1bf2 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker.go @@ -66,8 +66,9 @@ type Config struct { GoFiles []string NonGoFiles []string IgnoredFiles []string - ModulePath string // module path - ModuleVersion string // module version + ModulePath string // Deprecated: redundant w.r.t. Module.Path in go1.27; remove after go1.28. + ModuleVersion string // Deprecated: redundant w.r.t. Module.Version in go1.27; remove after go1.28. + Module *analysis.Module // module information, if any ImportMap map[string]string // maps import path to package path PackageFile map[string]string // maps package path to file of type information Standard map[string]bool // package belongs to standard library @@ -446,10 +447,14 @@ func run(fset *token.FileSet, cfg *Config, analyzers []*analysis.Analyzer) ([]re factFilter[reflect.TypeOf(f)] = true } - module := &analysis.Module{ - Path: cfg.ModulePath, - Version: cfg.ModuleVersion, - GoVersion: cfg.GoVersion, + module := cfg.Module + // cmd/go vet prior to go1.27 did not populate cfg.Module. Do our best. + if module == nil && cfg.ModulePath != "" { + module = &analysis.Module{ + Path: cfg.ModulePath, + Version: cfg.ModuleVersion, + GoVersion: cfg.GoVersion, + } } pass := &analysis.Pass{ diff --git a/src/cmd/vendor/golang.org/x/tools/internal/bisect/bisect.go b/src/cmd/vendor/golang.org/x/tools/internal/bisect/bisect.go index 7b1d112a7cd51b..04da97e13e1011 100644 --- a/src/cmd/vendor/golang.org/x/tools/internal/bisect/bisect.go +++ b/src/cmd/vendor/golang.org/x/tools/internal/bisect/bisect.go @@ -285,6 +285,7 @@ func (m *Matcher) ShouldEnable(id uint64) bool { if m == nil { return true } + // Don't use slices.Backward here (no imports). for i := len(m.list) - 1; i >= 0; i-- { c := &m.list[i] if id&c.mask == c.bits { @@ -299,6 +300,7 @@ func (m *Matcher) ShouldReport(id uint64) bool { if m == nil { return false } + // Don't use slices.Backward here (no imports). for i := len(m.list) - 1; i >= 0; i-- { c := &m.list[i] if id&c.mask == c.bits { diff --git a/src/cmd/vendor/golang.org/x/tools/internal/refactor/inline/inline.go b/src/cmd/vendor/golang.org/x/tools/internal/refactor/inline/inline.go index 6a31d3bdd71127..cbcf7b3ff2934b 100644 --- a/src/cmd/vendor/golang.org/x/tools/internal/refactor/inline/inline.go +++ b/src/cmd/vendor/golang.org/x/tools/internal/refactor/inline/inline.go @@ -2022,8 +2022,7 @@ func resolveEffects(logf logger, args []*argument, effects []int, sg substGraph) return string("RW"[btoi(effects)]) + i } removed := false - for i := len(args) - 1; i >= 0; i-- { - argi := args[i] + for i, argi := range slices.Backward(args) { if sg.has(argi) && !argi.pure { // i is not bound: check whether it must be bound due to hazards. idx := slices.Index(effects, i) diff --git a/src/cmd/vendor/golang.org/x/tools/internal/typeparams/coretype.go b/src/cmd/vendor/golang.org/x/tools/internal/typeparams/coretype.go index 27a2b179299681..2e05de4649a43a 100644 --- a/src/cmd/vendor/golang.org/x/tools/internal/typeparams/coretype.go +++ b/src/cmd/vendor/golang.org/x/tools/internal/typeparams/coretype.go @@ -11,7 +11,9 @@ import ( // CoreType returns the core type of T or nil if T does not have a core type. // -// See https://go.dev/ref/spec#Core_types for the definition of a core type. +// As of Go1.25, the notion of a core type has been removed from the language spec. +// See https://go.dev/blog/coretypes for more details. +// TODO(mkalil): We should eventually consider removing all uses of CoreType. func CoreType(T types.Type) types.Type { U := T.Underlying() if _, ok := U.(*types.Interface); !ok { @@ -34,7 +36,7 @@ func CoreType(T types.Type) types.Type { } if identical == len(terms) { - // https://go.dev/ref/spec#Core_types + // From the deprecated core types spec: // "There is a single type U which is the underlying type of all types in the type set of T" return U } @@ -42,7 +44,7 @@ func CoreType(T types.Type) types.Type { if !ok { return nil // no core type as identical < len(terms) and U is not a channel. } - // https://go.dev/ref/spec#Core_types + // From the deprecated core types spec: // "the type chan E if T contains only bidirectional channels, or the type chan<- E or // <-chan E depending on the direction of the directional channels present." for chans := identical; chans < len(terms); chans++ { diff --git a/src/cmd/vendor/modules.txt b/src/cmd/vendor/modules.txt index c99018cdcb2b7d..e7f2b95af8de8f 100644 --- a/src/cmd/vendor/modules.txt +++ b/src/cmd/vendor/modules.txt @@ -28,7 +28,7 @@ golang.org/x/arch/x86/x86asm # golang.org/x/build v0.0.0-20260122183339-3ba88df37c64 ## explicit; go 1.24.9 golang.org/x/build/relnote -# golang.org/x/mod v0.34.0 +# golang.org/x/mod v0.35.0 ## explicit; go 1.25.0 golang.org/x/mod/internal/lazyregexp golang.org/x/mod/modfile @@ -48,7 +48,7 @@ golang.org/x/sync/semaphore golang.org/x/sys/plan9 golang.org/x/sys/unix golang.org/x/sys/windows -# golang.org/x/telemetry v0.0.0-20260311193753-579e4da9a98c +# golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa ## explicit; go 1.25.0 golang.org/x/telemetry golang.org/x/telemetry/counter @@ -73,7 +73,7 @@ golang.org/x/text/internal/tag golang.org/x/text/language golang.org/x/text/transform golang.org/x/text/unicode/norm -# golang.org/x/tools v0.43.1-0.20260407202037-f6476fbaabd3 +# golang.org/x/tools v0.44.1-0.20260414062052-55fb96ff894f ## explicit; go 1.25.0 golang.org/x/tools/cmd/bisect golang.org/x/tools/cover From a7bdfeae793f16ae983405d96423afade34f4ec7 Mon Sep 17 00:00:00 2001 From: Akihiro Suda Date: Tue, 14 Apr 2026 19:35:12 +0900 Subject: [PATCH 2/2] cmd/go: use unitchecker.Config.Module in vetConfig unitchecker.Config was updated in CL 765402 to contain a full Module struct. This commit updates vetConfig accordingly. Follow-up to https://go-review.googlesource.com/c/tools/+/676455/comments/34707247_5e471a91 > The next step is to make the corresponding change to unitchecker, used by go vet/fix. > You'll need to add fields to x/tools/go/analysis/unitchecker.Config first, > then to cmd/go/internal/work.vetConfig to populate the data. Updates #73878 --- src/cmd/go/internal/work/exec.go | 52 ++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index 38d19c574358f1..90328fe394dd1b 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -39,12 +39,15 @@ import ( "cmd/go/internal/fsys" "cmd/go/internal/gover" "cmd/go/internal/load" + "cmd/go/internal/modinfo" "cmd/go/internal/modload" "cmd/go/internal/str" "cmd/go/internal/trace" "cmd/internal/buildid" "cmd/internal/quoted" "cmd/internal/sys" + + "golang.org/x/tools/go/analysis" ) const DefaultCFlags = "-O2 -g" @@ -1190,21 +1193,42 @@ type vetConfig struct { NonGoFiles []string // absolute paths to package non-Go files IgnoredFiles []string // absolute paths to ignored source files - ModulePath string // module path (may be "" on module error) - ModuleVersion string // module version (may be "" on main module or module error) - ImportMap map[string]string // map import path in source code to package path - PackageFile map[string]string // map package path to .a file with export data - Standard map[string]bool // map package path to whether it's in the standard library - PackageVetx map[string]string // map package path to vetx data from earlier vet run - VetxOnly bool // only compute vetx data; don't report detected problems - VetxOutput string // write vetx data to this output file - Stdout string // write stdout (JSON, unified diff) to this output file - GoVersion string // Go version for package - FixArchive string // write fixed files to this zip archive, if non-empty + Module *analysis.Module // module information, if any + ImportMap map[string]string // map import path in source code to package path + PackageFile map[string]string // map package path to .a file with export data + Standard map[string]bool // map package path to whether it's in the standard library + PackageVetx map[string]string // map package path to vetx data from earlier vet run + VetxOnly bool // only compute vetx data; don't report detected problems + VetxOutput string // write vetx data to this output file + Stdout string // write stdout (JSON, unified diff) to this output file + GoVersion string // Go version for package + FixArchive string // write fixed files to this zip archive, if non-empty SucceedOnTypecheckFailure bool // awful hack; see #18395 and below } +// analysisModuleFromModulePublic converts a modinfo.ModulePublic to a analysis.Module. +func analysisModuleFromModulePublic(m *modinfo.ModulePublic) *analysis.Module { + if m == nil { + return nil + } + vm := &analysis.Module{ + Path: m.Path, + Version: m.Version, + Replace: analysisModuleFromModulePublic(m.Replace), + Time: m.Time, + Main: m.Main, + Indirect: m.Indirect, + Dir: m.Dir, + GoMod: m.GoMod, + GoVersion: m.GoVersion, + } + if m.Error != nil { + vm.Error = &analysis.ModuleError{Err: m.Error.Err} + } + return vm +} + func buildVetConfig(a *Action, srcfiles []string, vetDeps []*Action) { // Classify files based on .go extension. // srcfiles does not include raw cgo files. @@ -1242,11 +1266,7 @@ func buildVetConfig(a *Action, srcfiles []string, vetDeps []*Action) { v = gover.DefaultGoModVersion } vcfg.GoVersion = "go" + v - - if a.Package.Module.Error == nil { - vcfg.ModulePath = a.Package.Module.Path - vcfg.ModuleVersion = a.Package.Module.Version - } + vcfg.Module = analysisModuleFromModulePublic(a.Package.Module) } a.vetCfg = vcfg for i, raw := range a.Package.Internal.RawImports {