aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/reflectdata/reflect.go
diff options
context:
space:
mode:
authorDan Scales <danscales@google.com>2021-05-16 14:48:05 -0700
committerDan Scales <danscales@google.com>2021-05-26 21:39:54 +0000
commit4ed6317e735af24093b96077d1e813cc8b7dee6a (patch)
treedeea54bccec604d434c1611bbb517706153ff197 /src/cmd/compile/internal/reflectdata/reflect.go
parentb7f7d1cd7b3d965ec25d365b3e5057ef3278c729 (diff)
downloadgo-4ed6317e735af24093b96077d1e813cc8b7dee6a.tar.gz
go-4ed6317e735af24093b96077d1e813cc8b7dee6a.zip
[dev.typeparams] cmd/compile: always generate (*T).M wrappers for instantiated methods
Always generate (*T).M wrappers for instantiated methods, even when the instantiated method is being generated for another package (its source package) Added new function t.IsInstantiated() to check for fully-instantiated types (generic type instantiated with concrete types, hence concrete themselves). This function helps hide the representation of instantiated types outside of the types package. Added new export/import test setsimp.go that needs this change. Change-Id: Ifb700db8c9494e1684c93735edb20f4709be5f7f Reviewed-on: https://go-review.googlesource.com/c/go/+/322193 Trust: Dan Scales <danscales@google.com> Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/reflectdata/reflect.go')
-rw-r--r--src/cmd/compile/internal/reflectdata/reflect.go8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/cmd/compile/internal/reflectdata/reflect.go b/src/cmd/compile/internal/reflectdata/reflect.go
index 3576a23db9..d452d4f194 100644
--- a/src/cmd/compile/internal/reflectdata/reflect.go
+++ b/src/cmd/compile/internal/reflectdata/reflect.go
@@ -956,7 +956,7 @@ func writeType(t *types.Type) *obj.LSym {
// in the local package, even if they may be marked as part of
// another package (the package of their base generic type).
if tbase.Sym() != nil && tbase.Sym().Pkg != types.LocalPkg &&
- len(tbase.RParams()) == 0 {
+ !tbase.IsInstantiated() {
if i := typecheck.BaseTypeIndex(t); i >= 0 {
lsym.Pkg = tbase.Sym().Pkg.Prefix
lsym.SymIdx = int32(i)
@@ -1777,9 +1777,11 @@ func methodWrapper(rcvr *types.Type, method *types.Field) *obj.LSym {
return lsym
}
- // Only generate (*T).M wrappers for T.M in T's own package.
+ // Only generate (*T).M wrappers for T.M in T's own package, except for
+ // instantiated methods.
if rcvr.IsPtr() && rcvr.Elem() == method.Type.Recv().Type &&
- rcvr.Elem().Sym() != nil && rcvr.Elem().Sym().Pkg != types.LocalPkg {
+ rcvr.Elem().Sym() != nil && rcvr.Elem().Sym().Pkg != types.LocalPkg &&
+ !rcvr.Elem().IsInstantiated() {
return lsym
}