aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDan Scales <danscales@google.com>2021-09-29 17:47:19 -0700
committerDan Scales <danscales@google.com>2021-10-05 20:57:56 +0000
commit55e7f7e12d46292e130a3b48c86bac2a6e5a1739 (patch)
tree3252e508f37c93996d02fb9ce962b42758380f00 /src
parent695a59b5139ca8791e19b84259dc85622eea47e8 (diff)
downloadgo-55e7f7e12d46292e130a3b48c86bac2a6e5a1739.tar.xz
cmd/compile: fix problem with methods of instantiated types which are nointerface
In the case of a nointerface method on an instantiated type, we still have to call methodWrapper, because methodWrapper generates the actual generic method on the type as well. Currently, we don't call methodWrapper, so the method on the instantiated type never gets filled in. Adjusted the code to still call methodWrapper, but not use the result, in the case of a nointerface method on an instantiated type. Change-Id: I34bca58de2861aa772be04eb8dd7695c5b7f3a77 Reviewed-on: https://go-review.googlesource.com/c/go/+/353369 Run-TryBot: Dan Scales <danscales@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org> Trust: Dan Scales <danscales@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/compile/internal/reflectdata/reflect.go11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/cmd/compile/internal/reflectdata/reflect.go b/src/cmd/compile/internal/reflectdata/reflect.go
index 8503dee60d..a8d911f003 100644
--- a/src/cmd/compile/internal/reflectdata/reflect.go
+++ b/src/cmd/compile/internal/reflectdata/reflect.go
@@ -329,7 +329,11 @@ func methods(t *types.Type) []*typeSig {
if f.Type.Recv() == nil {
base.Fatalf("receiver with no type on %v method %v %v", mt, f.Sym, f)
}
- if f.Nointerface() {
+ if f.Nointerface() && !t.IsFullyInstantiated() {
+ // Skip creating method wrappers if f is nointerface. But, if
+ // t is an instantiated type, we still have to call
+ // methodWrapper, because methodWrapper generates the actual
+ // generic method on the type as well.
continue
}
@@ -348,6 +352,11 @@ func methods(t *types.Type) []*typeSig {
type_: typecheck.NewMethodType(f.Type, t),
mtype: typecheck.NewMethodType(f.Type, nil),
}
+ if f.Nointerface() {
+ // In the case of a nointerface method on an instantiated
+ // type, don't actually apppend the typeSig.
+ continue
+ }
ms = append(ms, sig)
}