Commit f2c1c7ac authored by Robert Griesemer's avatar Robert Griesemer

go/types: fix recvPtr helper (follow-up on https://golang.org/cl/139422)

The prior CL prepared go/types for the situation where methods might
not have a type-checked signature when being looked up. The respective
adjustments to recvPtr were not correct (but because so far method
signatures are type-checked in time, the bug didn't manifest itself).

Updates #23203.
Updates #26854.

Change-Id: I796691d11e6aac84396bdef802ad30715755fcc6
Reviewed-on: https://go-review.googlesource.com/c/139721Reviewed-by: 's avatarAlan Donovan <adonovan@google.com>
parent 28fa1da9
...@@ -256,9 +256,12 @@ func (s methodSet) add(list []*Func, index []int, indirect bool, multiples bool) ...@@ -256,9 +256,12 @@ func (s methodSet) add(list []*Func, index []int, indirect bool, multiples bool)
// ptrRecv reports whether the receiver is of the form *T. // ptrRecv reports whether the receiver is of the form *T.
func ptrRecv(f *Func) bool { func ptrRecv(f *Func) bool {
// If a method's type is set, use that as the source of truth for the receiver. // If a method's receiver type is set, use that as the source of truth for the receiver.
if f.typ != nil { // Caution: Checker.funcDecl (decl.go) marks a function by setting its type to an empty
_, isPtr := deref(f.typ.(*Signature).recv.typ) // signature. We may reach here before the signature is fully set up: we must explicitly
// check if the receiver is set (we cannot just look for non-nil f.typ).
if sig, _ := f.typ.(*Signature); sig != nil && sig.recv != nil {
_, isPtr := deref(sig.recv.typ)
return isPtr return isPtr
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment