d = f;
continue;
}
- if(!eqtype(t, f->type, 0))
+ if(!eqtype(t, f->type, 0)) {
yyerror("method redeclared: %S of type %S", sf, st);
+ print("\t%T\n\t%T\n", f->type, t);
+ }
return;
}
// check for same types
if(on != N) {
if(eqtype(n->type, on->type, 0)) {
- if(!eqargs(n->type, on->type))
- yyerror("forward declarations not the same: %S", s);
+ if(!eqargs(n->type, on->type)) {
+ yyerror("function arg names changed: %S", s);
+ print("\t%T\n\t%T\n", on->type, n->type);
+ }
} 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;
}
}
if(s->vblock == block) {
if(s->oname != N) {
yyerror("var %S redeclared in this block"
- "\n previous declaration at %L",
+ "\n\tprevious declaration at %L",
s, s->oname->lineno);
} else
yyerror("var %S redeclared in this block", s);
return 1;
case TFUNC:
+ // Loop over structs: receiver, in, out.
t1 = t1->type;
t2 = t2->type;
for(;;) {
+ Type *ta, *tb;
if(t1 == t2)
break;
if(t1 == T || t2 == T)
if(t1->etype != TSTRUCT || t2->etype != TSTRUCT)
return 0;
- if(!eqtype(t1->type, t2->type, 0))
- return 0;
+ // Loop over fields in structs, checking type only.
+ 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;
t2 = t2->down;
=========== fixedbugs/bug035.go
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
- previous declaration at fixedbugs/bug035.go:5
+ previous declaration at fixedbugs/bug035.go:5
=========== fixedbugs/bug037.go
fixedbugs/bug037.go:6: vlong: undefined
=========== fixedbugs/bug039.go
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:6: illegal conversion of nil to string
--- /dev/null
+// 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"
+