From c8d7c5fe0511569f19d4ebed29f11d96f50b3e07 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Sun, 14 Nov 2021 20:45:40 -0800 Subject: [PATCH] cmd/compile/internal/types2: remove unneccesary tests in implements and lookup Because the underlying type of a type parameter is an interface, the questions whether *P for a type parameter P has methods or not is settled: P is also an interface pointers to interfaces don't have methods. This allows us to eliminate the now unneccesary test in "implements" and also allows us to remove a special case for type parameters in "lookupFieldOrMethod". Change-Id: I8b218f81584a8e42e75884089a44293365b700df Reviewed-on: https://go-review.googlesource.com/c/go/+/363838 Trust: Robert Griesemer Run-TryBot: Robert Griesemer TryBot-Result: Go Bot Reviewed-by: Robert Findley --- src/cmd/compile/internal/types2/instantiate.go | 6 ------ src/cmd/compile/internal/types2/lookup.go | 6 +----- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/src/cmd/compile/internal/types2/instantiate.go b/src/cmd/compile/internal/types2/instantiate.go index a0f6885c51c..13f0661611f 100644 --- a/src/cmd/compile/internal/types2/instantiate.go +++ b/src/cmd/compile/internal/types2/instantiate.go @@ -191,12 +191,6 @@ func (check *Checker) implements(V, T Type, qf Qualifier) error { // V must implement T (methods) // - check only if we have methods if Ti.NumMethods() > 0 { - // If the type argument is a pointer to a type parameter, the type argument's - // method set is empty. - // TODO(gri) is this what we want? (spec question) - if base, isPtr := deref(V); isPtr && isTypeParam(base) { - return errorf("%s has no methods", V) - } if m, wrong := check.missingMethod(V, Ti, true); m != nil { // TODO(gri) needs to print updated name to avoid major confusion in error message! // (print warning for now) diff --git a/src/cmd/compile/internal/types2/lookup.go b/src/cmd/compile/internal/types2/lookup.go index b4035e16b3d..4f50ea54b14 100644 --- a/src/cmd/compile/internal/types2/lookup.go +++ b/src/cmd/compile/internal/types2/lookup.go @@ -80,12 +80,8 @@ func lookupFieldOrMethod(T Type, addressable, checkFold bool, pkg *Package, name typ, isPtr := deref(T) - // *typ where typ is an interface or type parameter has no methods. + // *typ where typ is an interface has no methods. if isPtr { - // don't look at under(typ) here - was bug (issue #47747) - if _, ok := typ.(*TypeParam); ok { - return - } if _, ok := under(typ).(*Interface); ok { return }