mirror of https://github.com/golang/go.git
fix method function type compare bug (again)
R=ken OCL=17819 CL=17819
This commit is contained in:
parent
c14c961ae4
commit
689b28fd96
|
|
@ -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)
|
||||||
// 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)
|
||||||
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)
|
||||||
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)
|
||||||
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
|
||||||
|
|
||||||
=========== 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
|
||||||
|
|
||||||
=========== 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
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
// 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"
|
||||||
|
|
||||||
Loading…
Reference in New Issue