if msym.Name != f.Sym.Name {
continue
}
- if !Eqtype(t, f.Type) {
+ // Eqtype only checks that incoming and result parameters match,
+ // so explicitly check that the receiver parameters match too.
+ if !Eqtype(t, f.Type) || !Eqtype(t.Recvs(), f.Type.Recvs()) {
Yyerror("method redeclared: %v.%v\n\t%v\n\t%v", pa, msym, f.Type, t)
}
return
}
return false
- // Loop over structs: receiver, in, out.
case TFUNC:
- for _, f := range recvsParamsResults {
+ // Check parameters and result parameters for type equality.
+ // We intentionally ignore receiver parameters for type
+ // equality, because they're never relevant.
+ for _, f := range paramsResults {
// Loop over fields in structs, ignoring argument names.
ta, ia := IterFields(f(t1))
tb, ib := IterFields(f(t2))
if im.Broke {
continue
}
- imtype := methodfunc(im.Type, nil)
var followptr bool
tm := ifacelookdot(im.Sym, t, &followptr, false)
- if tm == nil || tm.Nointerface || !Eqtype(methodfunc(tm.Type, nil), imtype) {
+ if tm == nil || tm.Nointerface || !Eqtype(tm.Type, im.Type) {
if tm == nil {
tm = ifacelookdot(im.Sym, t, &followptr, true)
}
(*Type).Recvs, (*Type).Params, (*Type).Results,
}
+// paramsResults is like recvsParamsResults, but omits receiver parameters.
+var paramsResults = [2]func(*Type) *Type{
+ (*Type).Params, (*Type).Results,
+}
+
// Key returns the key type of map type t.
func (t *Type) Key() *Type {
t.wantEtype(TMAP)
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"