Commit 689b28fd authored by Russ Cox's avatar Russ Cox

fix method function type compare bug (again)

R=ken
OCL=17819
CL=17819
parent c14c961a
...@@ -279,8 +279,10 @@ addmethod(Node *n, Type *t, int local) ...@@ -279,8 +279,10 @@ addmethod(Node *n, Type *t, int local)
d = f; d = f;
continue; continue;
} }
if(!eqtype(t, f->type, 0)) if(!eqtype(t, f->type, 0)) {
yyerror("method redeclared: %S of type %S", sf, st); yyerror("method redeclared: %S of type %S", sf, st);
print("\t%T\n\t%T\n", f->type, t);
}
return; return;
} }
...@@ -337,10 +339,13 @@ funchdr(Node *n) ...@@ -337,10 +339,13 @@ funchdr(Node *n)
// check for same types // check for same types
if(on != N) { if(on != N) {
if(eqtype(n->type, on->type, 0)) { if(eqtype(n->type, on->type, 0)) {
if(!eqargs(n->type, on->type)) if(!eqargs(n->type, on->type)) {
yyerror("forward declarations not the same: %S", s); yyerror("function arg names changed: %S", s);
print("\t%T\n\t%T\n", on->type, n->type);
}
} else { } else {
yyerror("redeclare of function: %S", s); yyerror("function redeclared: %S", s);
print("\t%T\n\t%T\n", on->type, n->type);
on = N; on = N;
} }
} }
...@@ -674,7 +679,7 @@ addvar(Node *n, Type *t, int ctxt) ...@@ -674,7 +679,7 @@ addvar(Node *n, Type *t, int ctxt)
if(s->vblock == block) { if(s->vblock == block) {
if(s->oname != N) { if(s->oname != N) {
yyerror("var %S redeclared in this block" yyerror("var %S redeclared in this block"
"\n previous declaration at %L", "\n\tprevious declaration at %L",
s, s->oname->lineno); s, s->oname->lineno);
} else } else
yyerror("var %S redeclared in this block", s); yyerror("var %S redeclared in this block", s);
......
...@@ -1763,9 +1763,11 @@ eqtype(Type *t1, Type *t2, int d) ...@@ -1763,9 +1763,11 @@ eqtype(Type *t1, Type *t2, int d)
return 1; return 1;
case TFUNC: case TFUNC:
// Loop over structs: receiver, in, out.
t1 = t1->type; t1 = t1->type;
t2 = t2->type; t2 = t2->type;
for(;;) { for(;;) {
Type *ta, *tb;
if(t1 == t2) if(t1 == t2)
break; break;
if(t1 == T || t2 == T) if(t1 == T || t2 == T)
...@@ -1773,8 +1775,19 @@ eqtype(Type *t1, Type *t2, int d) ...@@ -1773,8 +1775,19 @@ eqtype(Type *t1, Type *t2, int d)
if(t1->etype != TSTRUCT || t2->etype != TSTRUCT) if(t1->etype != TSTRUCT || t2->etype != TSTRUCT)
return 0; return 0;
if(!eqtype(t1->type, t2->type, 0)) // Loop over fields in structs, checking type only.
return 0; ta = t1->type;
tb = t2->type;
while(ta != tb) {
if(ta == T || tb == T)
return 0;
if(ta->etype != TFIELD || tb->etype != TFIELD)
return 0;
if(!eqtype(ta->type, tb->type, 0))
return 0;
ta = ta->down;
tb = tb->down;
}
t1 = t1->down; t1 = t1->down;
t2 = t2->down; t2 = t2->down;
......
...@@ -182,9 +182,9 @@ fixedbugs/bug029.go:6: syntax error near int ...@@ -182,9 +182,9 @@ fixedbugs/bug029.go:6: syntax error near int
=========== fixedbugs/bug035.go =========== fixedbugs/bug035.go
fixedbugs/bug035.go:6: var i redeclared in this block fixedbugs/bug035.go:6: var i redeclared in this block
previous declaration at fixedbugs/bug035.go:5 previous declaration at fixedbugs/bug035.go:5
fixedbugs/bug035.go:7: var f redeclared in this block fixedbugs/bug035.go:7: var f redeclared in this block
previous declaration at fixedbugs/bug035.go:5 previous declaration at fixedbugs/bug035.go:5
=========== fixedbugs/bug037.go =========== fixedbugs/bug037.go
fixedbugs/bug037.go:6: vlong: undefined fixedbugs/bug037.go:6: vlong: undefined
...@@ -193,7 +193,7 @@ fixedbugs/bug037.go:6: illegal types for operand: AS ...@@ -193,7 +193,7 @@ fixedbugs/bug037.go:6: illegal types for operand: AS
=========== fixedbugs/bug039.go =========== fixedbugs/bug039.go
fixedbugs/bug039.go:6: var x redeclared in this block fixedbugs/bug039.go:6: var x redeclared in this block
previous declaration at fixedbugs/bug039.go:5 previous declaration at fixedbugs/bug039.go:5
=========== fixedbugs/bug049.go =========== fixedbugs/bug049.go
fixedbugs/bug049.go:6: illegal conversion of nil to string fixedbugs/bug049.go:6: illegal conversion of nil to string
......
// errchk $G $D/$F.go
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
type T struct { }
func (t *T) M(int, string);
func (t *T) M(int, float) { } // ERROR "redeclared"
func f(int, string);
func f(int, float) { } // ERROR "redeclared"
func g(a int, b string);
func g(a int, c string); // ERROR "names changed"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment