]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go/internal/load: clone pgo variant's PackagePublic.Imports in split
authorMichael Matloob <matloob@golang.org>
Fri, 24 May 2024 19:18:00 +0000 (15:18 -0400)
committerMichael Matloob <matloob@golang.org>
Tue, 28 May 2024 17:00:51 +0000 (17:00 +0000)
Before this change the pgo and non-pgo variants Imports slices pointed
to the same array, so modifying the pgo variant's Imports slice to add
the .ForMain suffix modified the non-pgo vairant's Imports slice too.
This change clones the imports slice to avoid that.

Fixes #66218

Change-Id: Ic936086f2c31f2056988d6546216142e4fce4d8d
Reviewed-on: https://go-review.googlesource.com/c/go/+/588275
Reviewed-by: Sam Thanawalla <samthanawalla@google.com>
Auto-Submit: Michael Matloob <matloob@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
src/cmd/go/internal/load/pkg.go
src/cmd/go/testdata/script/list_pgo_issue66218.txt [new file with mode: 0644]

index b5346b1be77b4f5c36c9ce01d4c3b43525678f9e..7c402b419ea0ca33c045c66eff89819f31eae0f8 100644 (file)
@@ -2943,8 +2943,10 @@ func setPGOProfilePath(pkgs []*Package) {
                                        }
                                        p1 := new(Package)
                                        *p1 = *p
-                                       // Unalias the Internal.Imports slice, which is we're going to
-                                       // modify. We don't copy other slices as we don't change them.
+                                       // Unalias the Imports and Internal.Imports slices,
+                                       // which we're going to modify. We don't copy other slices as
+                                       // we don't change them.
+                                       p1.Imports = slices.Clone(p.Imports)
                                        p1.Internal.Imports = slices.Clone(p.Internal.Imports)
                                        p1.Internal.ForMain = pmain.ImportPath
                                        visited[p] = p1
diff --git a/src/cmd/go/testdata/script/list_pgo_issue66218.txt b/src/cmd/go/testdata/script/list_pgo_issue66218.txt
new file mode 100644 (file)
index 0000000..9e9cd6c
--- /dev/null
@@ -0,0 +1,28 @@
+# Test that pgo properly splits off the Imports field so that list doesn't alias
+# the non-pgo variant's slice when it modifies the pgo variant's Imports field to
+# add the [.ForMain] suffix.
+
+go list -f 'ImportPath: "{{.ImportPath}}", Imports: "{{.Imports}}", ImportMap: "{{.ImportMap}}"' m/a m/b
+cmp stdout want
+
+-- want --
+ImportPath: "m/a", Imports: "[m/b [m/a]]", ImportMap: "map[m/b:m/b [m/a]]"
+ImportPath: "m/b", Imports: "[m/c]", ImportMap: "map[]"
+-- go.mod --
+module m
+
+go 1.23
+
+-- a/a.go --
+package main
+
+import _ "m/b"
+-- a/default.pgo --
+-- b/b.go --
+package a
+
+import _ "m/c"
+
+-- c/c.go --
+package c
+