mirror of
https://github.com/golang/go
synced 2024-09-04 23:44:16 +00:00
[dev.typeparams] go/types: use correct type parameter list in missingMethod
This is a port of CL 321232 to go/types, adjusted to add a missing comment and to remove optional support for method type params. Fixes #46275 Change-Id: I63fcbb669e7607876a888fca89b9064568805448 Reviewed-on: https://go-review.googlesource.com/c/go/+/324751 Trust: Robert Findley <rfindley@google.com> Run-TryBot: Robert Findley <rfindley@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
parent
62c40878e4
commit
090a17c998
|
@ -327,11 +327,15 @@ func (check *Checker) missingMethod(V Type, T *Interface, static bool) (method,
|
|||
return m, f
|
||||
}
|
||||
|
||||
// both methods must have the same number of type parameters
|
||||
ftyp := f.typ.(*Signature)
|
||||
mtyp := m.typ.(*Signature)
|
||||
if len(ftyp.tparams) != len(mtyp.tparams) {
|
||||
return m, f
|
||||
}
|
||||
if len(ftyp.tparams) > 0 {
|
||||
panic("internal error: method with type parameters")
|
||||
}
|
||||
|
||||
// If the methods have type parameters we don't care whether they
|
||||
// are the same or not, as long as they match up. Use unification
|
||||
|
@ -385,6 +389,9 @@ func (check *Checker) missingMethod(V Type, T *Interface, static bool) (method,
|
|||
if len(ftyp.tparams) != len(mtyp.tparams) {
|
||||
return m, f
|
||||
}
|
||||
if len(ftyp.tparams) > 0 {
|
||||
panic("internal error: method with type parameters")
|
||||
}
|
||||
|
||||
// If V is a (instantiated) generic type, its methods are still
|
||||
// parameterized using the original (declaration) receiver type
|
||||
|
@ -412,7 +419,7 @@ func (check *Checker) missingMethod(V Type, T *Interface, static bool) (method,
|
|||
// TODO(gri) is this always correct? what about type bounds?
|
||||
// (Alternative is to rename/subst type parameters and compare.)
|
||||
u := newUnifier(check, true)
|
||||
u.x.init(ftyp.tparams)
|
||||
u.x.init(ftyp.rparams)
|
||||
if !u.unify(ftyp, mtyp) {
|
||||
return m, f
|
||||
}
|
||||
|
|
27
src/go/types/testdata/fixedbugs/issue46275.go2
vendored
Normal file
27
src/go/types/testdata/fixedbugs/issue46275.go2
vendored
Normal file
|
@ -0,0 +1,27 @@
|
|||
// 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 issue46275
|
||||
|
||||
type N[T any] struct {
|
||||
*N[T]
|
||||
t T
|
||||
}
|
||||
|
||||
func (n *N[T]) Elem() T {
|
||||
return n.t
|
||||
}
|
||||
|
||||
type I interface {
|
||||
Elem() string
|
||||
}
|
||||
|
||||
func _() {
|
||||
var n1 *N[string]
|
||||
var _ I = n1
|
||||
type NS N[string]
|
||||
var n2 *NS
|
||||
var _ I = n2
|
||||
}
|
||||
|
Loading…
Reference in a new issue