• 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
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
vendor Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
bootstrap.bash Loading commit data...
buildall.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...