aboutsummaryrefslogtreecommitdiff
path: root/test/method1.go
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2016-03-11 14:38:16 -0800
committerMatthew Dempsky <mdempsky@google.com>2016-03-17 00:38:15 +0000
commitb2b5e779f51fa37cb241417887decf4be38240d6 (patch)
treefaa5bc4cd273fce89cc7a4a58e53ec4f4b871052 /test/method1.go
parentd33e37a7e3fd3e1d6dc697d7ec594068ff26d383 (diff)
downloadgo-b2b5e779f51fa37cb241417887decf4be38240d6.tar.gz
go-b2b5e779f51fa37cb241417887decf4be38240d6.zip
cmd/compile: ignore receiver parameters in Eqtype
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/20602 Reviewed-by: Robert Griesemer <gri@golang.org>
Diffstat (limited to 'test/method1.go')
-rw-r--r--test/method1.go18
1 files changed, 11 insertions, 7 deletions
diff --git a/test/method1.go b/test/method1.go
index 365b8ca553..bb8c81d746 100644
--- a/test/method1.go
+++ b/test/method1.go
@@ -9,12 +9,16 @@
package main
-type T struct { }
-func (t *T) M(int, string) // GCCGO_ERROR "previous"
-func (t *T) M(int, float64) { } // ERROR "redeclared|redefinition"
+type T struct{}
-func f(int, string) // GCCGO_ERROR "previous"
-func f(int, float64) { } // ERROR "redeclared|redefinition"
+func (t *T) M(int, string) // GCCGO_ERROR "previous"
+func (t *T) M(int, float64) {} // ERROR "redeclared|redefinition"
-func g(a int, b string) // GCCGO_ERROR "previous"
-func g(a int, c string) // ERROR "redeclared|redefinition"
+func (t T) H() // GCCGO_ERROR "previous"
+func (t *T) H() {} // ERROR "redeclared|redefinition"
+
+func f(int, string) // GCCGO_ERROR "previous"
+func f(int, float64) {} // ERROR "redeclared|redefinition"
+
+func g(a int, b string) // GCCGO_ERROR "previous"
+func g(a int, c string) // ERROR "redeclared|redefinition"