]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.typeparams] cmd/compile: create .dict Param in the package of the instantiated...
authorDan Scales <danscales@google.com>
Sat, 5 Jun 2021 01:17:49 +0000 (18:17 -0700)
committerDan Scales <danscales@google.com>
Mon, 7 Jun 2021 19:34:39 +0000 (19:34 +0000)
The instantiated functions are created in the source package of the
generic function, so all lookups of symbols should be relative to that
package, so all symbols are consistently in the source package.

Fixes #46575

Change-Id: Iba67b2ba8014a630c5d4e032c0f2f2fbaaedce65
Reviewed-on: https://go-review.googlesource.com/c/go/+/325529
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/noder/stencil.go
test/typeparam/mutualimp.dir/a.go [new file with mode: 0644]
test/typeparam/mutualimp.dir/b.go [new file with mode: 0644]
test/typeparam/mutualimp.go [new file with mode: 0644]

index 25a4bf775f1b52fa0519364803da2c9a4438d53b..8b5a91f6d11d2d3438a82159245d4193469aa5f0 100644 (file)
@@ -558,7 +558,7 @@ func (g *irgen) genericSubst(newsym *types.Sym, nameNode *ir.Name, targs []*type
        oldt := nameNode.Type()
        // We also transform a generic method type to the corresponding
        // instantiated function type where the dictionary is the first parameter.
-       dictionarySym := types.LocalPkg.Lookup(".dict")
+       dictionarySym := newsym.Pkg.Lookup(".dict")
        dictionaryType := types.Types[types.TUINTPTR]
        dictionaryName := ir.NewNameAt(gf.Pos(), dictionarySym)
        typed(dictionaryType, dictionaryName)
diff --git a/test/typeparam/mutualimp.dir/a.go b/test/typeparam/mutualimp.dir/a.go
new file mode 100644 (file)
index 0000000..56ca57c
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package a
+
+type X int
+func (x X) M() X { return x }
+
+func F[T interface{ M() U }, U interface{ M() T }]() {}
+func G() { F[X, X]() }
diff --git a/test/typeparam/mutualimp.dir/b.go b/test/typeparam/mutualimp.dir/b.go
new file mode 100644 (file)
index 0000000..83cc3af
--- /dev/null
@@ -0,0 +1,12 @@
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package b
+
+import "./a"
+
+func H() {
+       a.F[a.X, a.X]()
+       a.G()
+}
diff --git a/test/typeparam/mutualimp.go b/test/typeparam/mutualimp.go
new file mode 100644 (file)
index 0000000..87b4ff4
--- /dev/null
@@ -0,0 +1,7 @@
+// compiledir -G=3
+
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ignored