// will only be executed in VetxOnly mode, for facts but not
// diagnostics.
for _, p := range pkgs {
+ // Don't apply fixes to vendored packages, including
+ // the GOROOT vendor packages that are part of std,
+ // or to packages from non-main modules (#76479).
+ if applyFixes {
+ if p.Standard && strings.HasPrefix(p.ImportPath, "vendor/") ||
+ p.Module != nil && !p.Module.Main {
+ continue
+ }
+ }
_, ptest, pxtest, perr := load.TestPackagesFor(moduleLoaderState, ctx, pkgOpts, p, nil)
if perr != nil {
base.Errorf("%v", perr.Error)
--- /dev/null
+# Test that go fix skips fixes to non-main and/or vendored packages.
+# (It uses the interface{} -> any modernizer.)
+
+# Create vendor tree programmatically to avoid
+# having to hardcode sums in this txtar archive.
+go mod vendor
+
+# Show fixes on two packages, one in the main module
+# and one in a vendored dependency.
+# Only the main one (a) is shown.
+go fix -diff example.com/a example.com/b
+stdout 'a[/\\]a.go'
+stdout '\-var _ interface\{\}'
+stdout '\+var _ any'
+! stdout 'b[/\\]b.go'
+
+# Apply fixes to the same two packages.
+# Only the main module was modified.
+go fix example.com/a example.com/b
+grep 'var _ any' a/a.go
+grep 'var _ interface{}' b/b.go
+grep 'var _ interface{}' vendor/example.com/b/b.go
+
+-- go.mod --
+module example.com
+go 1.26
+
+require "example.com/b" v0.0.0
+replace "example.com/b" => ./b
+
+-- a/a.go --
+package a
+
+import _ "example.com/b"
+
+var _ interface{}
+
+-- b/go.mod --
+module example.com/b
+
+-- b/b.go --
+package b
+
+var _ interface{}