]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/api: explicit tagKey with GOOS and GOARCH
authorMeng Zhuo <mengzhuo1203@gmail.com>
Thu, 4 Oct 2018 08:46:22 +0000 (16:46 +0800)
committerRobert Griesemer <gri@golang.org>
Fri, 5 Oct 2018 17:53:43 +0000 (17:53 +0000)
The origin tagKey is just dirname if no tags input which will cause
pkgCache missmatch if other imported pkg explicit on GOARCH or GOOS

This CL will add GOOS and GOARCH to tagKey

Fixes #8425
Fixes #21181

Change-Id: Ifc189cf6746d753ad7c7e5bb60621297fc0a4e35
Reviewed-on: https://go-review.googlesource.com/c/138315
Reviewed-by: Robert Griesemer <gri@golang.org>
api/except.txt
src/cmd/api/goapi.go
src/cmd/api/goapi_test.go
src/cmd/api/testdata/src/issue21181/dep/p.go [new file with mode: 0644]
src/cmd/api/testdata/src/issue21181/dep/p_amd64.go [new file with mode: 0644]
src/cmd/api/testdata/src/issue21181/indirect/p.go [new file with mode: 0644]
src/cmd/api/testdata/src/issue21181/p/p.go [new file with mode: 0644]
src/cmd/api/testdata/src/issue21181/p/p_amd64.go [new file with mode: 0644]
src/cmd/api/testdata/src/issue21181/p/p_generic.go [new file with mode: 0644]

index 9f7f3fe934ad4580bcb35d5d6bb70d2ebc8db5eb..90b79f1592300aa2fcdf90bf071644f88352dd96 100644 (file)
@@ -6,6 +6,8 @@ pkg os, const ModeType = 2399141888
 pkg os, const ModeType = 2399666176
 pkg os (linux-arm), const O_SYNC = 4096
 pkg os (linux-arm-cgo), const O_SYNC = 4096
+pkg os (linux-arm), const O_SYNC = 1052672
+pkg os (linux-arm-cgo), const O_SYNC = 1052672
 pkg syscall (darwin-386), const ImplementsGetwd = false
 pkg syscall (darwin-386), func Fchflags(string, int) error
 pkg syscall (darwin-386-cgo), const ImplementsGetwd = false
index 8cc78c01ed46ac18edaddecdfc09e66faa47a762..9698f25b512b7444784739e1c6f8c9c41262ebda 100644 (file)
@@ -385,9 +385,7 @@ func (w *Walker) parseFile(dir, file string) (*ast.File, error) {
        return f, nil
 }
 
-// The package cache doesn't operate correctly in rare (so far artificial)
-// circumstances (issue 8425). Disable before debugging non-obvious errors
-// from the type-checker.
+// Disable before debugging non-obvious errors from the type-checker.
 const usePkgCache = true
 
 var (
@@ -398,7 +396,7 @@ var (
 // tagKey returns the tag-based key to use in the pkgCache.
 // It is a comma-separated string; the first part is dir, the rest tags.
 // The satisfied tags are derived from context but only those that
-// matter (the ones listed in the tags argument) are used.
+// matter (the ones listed in the tags argument plus GOOS and GOARCH) are used.
 // The tags list, which came from go/build's Package.AllTags,
 // is known to be sorted.
 func tagKey(dir string, context *build.Context, tags []string) string {
@@ -414,9 +412,17 @@ func tagKey(dir string, context *build.Context, tags []string) string {
        }
        // TODO: ReleaseTags (need to load default)
        key := dir
+
+       // explicit on GOOS and GOARCH as global cache will use "all" cached packages for
+       // an indirect imported package. See https://github.com/golang/go/issues/21181
+       // for more detail.
+       tags = append(tags, context.GOOS, context.GOARCH)
+       sort.Strings(tags)
+
        for _, tag := range tags {
                if ctags[tag] {
                        key += "," + tag
+                       ctags[tag] = false
                }
        }
        return key
index 3c4e50a21a305b5b79300dde8211760a90d65fd2..1c8e2a345b6201699e5bfe6e4a3a20ea3dff6a58 100644 (file)
@@ -188,3 +188,18 @@ func BenchmarkAll(b *testing.B) {
                }
        }
 }
+
+func TestIssue21181(t *testing.T) {
+       for _, c := range contexts {
+               c.Compiler = build.Default.Compiler
+       }
+       for _, context := range contexts {
+               w := NewWalker(context, "testdata/src/issue21181")
+               pkg, err := w.Import("p")
+               if err != nil {
+                       t.Fatalf("%s: (%s-%s) %s %v", err, context.GOOS, context.GOARCH,
+                               pkg.Name(), w.imported)
+               }
+               w.export(pkg)
+       }
+}
diff --git a/src/cmd/api/testdata/src/issue21181/dep/p.go b/src/cmd/api/testdata/src/issue21181/dep/p.go
new file mode 100644 (file)
index 0000000..2d8e0c4
--- /dev/null
@@ -0,0 +1,5 @@
+package dep
+
+type Interface interface {
+       N([]byte)
+}
diff --git a/src/cmd/api/testdata/src/issue21181/dep/p_amd64.go b/src/cmd/api/testdata/src/issue21181/dep/p_amd64.go
new file mode 100644 (file)
index 0000000..8a2343a
--- /dev/null
@@ -0,0 +1 @@
+package dep
diff --git a/src/cmd/api/testdata/src/issue21181/indirect/p.go b/src/cmd/api/testdata/src/issue21181/indirect/p.go
new file mode 100644 (file)
index 0000000..e37cf3f
--- /dev/null
@@ -0,0 +1,5 @@
+package indirect
+
+import "dep"
+
+func F(dep.Interface) {}
diff --git a/src/cmd/api/testdata/src/issue21181/p/p.go b/src/cmd/api/testdata/src/issue21181/p/p.go
new file mode 100644 (file)
index 0000000..a704160
--- /dev/null
@@ -0,0 +1,9 @@
+package p
+
+import (
+       "dep"
+)
+
+type algo struct {
+       indrt func(dep.Interface)
+}
diff --git a/src/cmd/api/testdata/src/issue21181/p/p_amd64.go b/src/cmd/api/testdata/src/issue21181/p/p_amd64.go
new file mode 100644 (file)
index 0000000..02b4cbf
--- /dev/null
@@ -0,0 +1,7 @@
+package p
+
+import "indirect"
+
+var in = []algo{
+       {indirect.F},
+}
diff --git a/src/cmd/api/testdata/src/issue21181/p/p_generic.go b/src/cmd/api/testdata/src/issue21181/p/p_generic.go
new file mode 100644 (file)
index 0000000..4d75809
--- /dev/null
@@ -0,0 +1,11 @@
+// +build !amd64
+
+package p
+
+import (
+       "indirect"
+)
+
+var in = []algo{
+       {indirect.F},
+}