• 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
.github Loading commit data...
api Loading commit data...
doc Loading commit data...
lib/time Loading commit data...
misc Loading commit data...
src Loading commit data...
test Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
AUTHORS Loading commit data...
CONTRIBUTING.md Loading commit data...
CONTRIBUTORS Loading commit data...
LICENSE Loading commit data...
PATENTS Loading commit data...
README.md Loading commit data...
favicon.ico Loading commit data...
robots.txt Loading commit data...