• Matthew Dempsky's avatar
    cmd/compile: ignore receiver parameters in Eqtype · b2b5e779
    Matthew Dempsky authored
    Receiver parameters generally aren't relevant to the function
    signature type. In particular:
    
      1. When checking whether a type's method implements an interface's
         method, we specifically want to ignore the receiver parameters,
         because they'll be different.
    
      2. When checking interface type equality, interface methods always
         use the same "fakethis" *struct{} type as their receiver.
    
      3. Finally, method expressions and method values degenerate into
         receiver-less function types.
    
    The only case where we care about receiver types matching is in
    addmethod, which is easily handled by adding an extra Eqtype check of
    the receiver parameters. Also, added a test for this, since
    (surprisingly) there weren't any.
    
    As precedence, go/types.Identical ignores receiver parameters when
    comparing go/types.Signature values.
    
    Notably, this allows us to slightly simplify the "implements"
    function, which is used for checking whether type/interface t
    implements interface iface. Currently, cmd/compile actually works
    around Eqtype's receiver parameter checking by creating new throwaway
    TFUNC Types without the receiver parameter.
    
    (Worse, the compiler currently only provides APIs to build TFUNC Types
    from Nod syntax trees, so building those throwaway types also involves
    first building throwaway syntax trees.)
    
    Passes toolstash -cmp.
    
    Change-Id: Ib07289c66feacee284e016bc312e8c5ff674714f
    Reviewed-on: https://go-review.googlesource.com/20602Reviewed-by: 's avatarRobert Griesemer <gri@golang.org>
    b2b5e779
Name
Last commit
Last update
..
addr2line Loading commit data...
api Loading commit data...
asm Loading commit data...
cgo Loading commit data...
compile Loading commit data...
cover Loading commit data...
dist Loading commit data...
doc Loading commit data...
fix Loading commit data...
go Loading commit data...
gofmt Loading commit data...
internal Loading commit data...
link Loading commit data...
nm Loading commit data...
objdump Loading commit data...
pack Loading commit data...
pprof Loading commit data...
trace Loading commit data...
vet Loading commit data...
yacc Loading commit data...