diff options
author | Russ Cox <rsc@golang.org> | 2008-10-04 02:51:03 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2008-10-04 02:51:03 -0700 |
commit | 024b59080c461df58e169abb6f83ad5a11786b2f (patch) | |
tree | 51b0ba85c6d69917ad6abdc0150806c3599a8221 /src | |
parent | de2cca7f6ab0c894f6bef5be158ae51e07e8f0e9 (diff) | |
download | golang-024b59080c461df58e169abb6f83ad5a11786b2f.tar.gz |
add method test & fix method name bugs
R=ken,r
DELTA=86 (72 added, 9 deleted, 5 changed)
OCL=16488
CL=16488
Diffstat (limited to 'src')
-rw-r--r-- | src/cmd/gc/dcl.c | 13 | ||||
-rw-r--r-- | src/cmd/gc/go.y | 8 | ||||
-rw-r--r-- | src/cmd/gc/walk.c | 17 |
3 files changed, 21 insertions, 17 deletions
diff --git a/src/cmd/gc/dcl.c b/src/cmd/gc/dcl.c index a96d58a33..6b04553f5 100644 --- a/src/cmd/gc/dcl.c +++ b/src/cmd/gc/dcl.c @@ -176,22 +176,15 @@ methodname(Node *n, Type *t) Sym *s; char buf[NSYMB]; + // caller has already called ismethod to obtain t if(t == T) goto bad; - - // method receiver must be typename or *typename - s = S; - if(t->sym != S) - s = t->sym; - if(isptr[t->etype]) - t = t->type; - if(t->sym != S) - s = t->sym; + s = t->sym; if(s == S) goto bad; snprint(buf, sizeof(buf), "%s_%s", s->name, n->sym->name); - return newname(pkglookup(buf, t->sym->opackage)); + return newname(pkglookup(buf, s->opackage)); bad: yyerror("illegal <this> type: %T", t); diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y index 2f9cd0aca..923107cc5 100644 --- a/src/cmd/gc/go.y +++ b/src/cmd/gc/go.y @@ -1113,9 +1113,15 @@ fndcl: } | '(' oarg_type_list ')' new_name '(' oarg_type_list ')' fnres { + Type *t; + b0stack = dclstack; // mark base for fn literals $$ = nod(ODCLFUNC, N, N); - $$->nname = methodname($4, $2->type); + t = ismethod($2->type); + if(t != T) + $$->nname = methodname($4, t); + else + $$->nname = $4; $$->type = functype($2, $6, $8); funchdr($$); diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index f3aafc4aa..87b5e6f36 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -1230,7 +1230,7 @@ recv: r = list(a, r); goto out; -recv2: +recv2: walktype(c->right, Erv); // chan t = fixchan(c->right->type); @@ -1399,6 +1399,7 @@ lookdot(Node *n, Type *f) for(; f!=T; f=f->down) { if(f->sym == S) continue; + // if(strcmp(f->sym->name, s->name) != 0) if(f->sym != s) continue; if(r != T) { @@ -1430,6 +1431,7 @@ walkdot(Node *n) if(t == T) return; + // as a structure field or pointer to structure field if(isptr[t->etype]) { t = t->type; if(t == T) @@ -1437,7 +1439,6 @@ walkdot(Node *n) n->op = ODOTPTR; } - // as a structure field if(t->etype == TSTRUCT || t->etype == TINTER) { f = lookdot(n->right, t->type); if(f != T) { @@ -1450,9 +1451,13 @@ walkdot(Node *n) } } - f = lookdot(n->right, t->method); + // as a method + f = T; + t = ismethod(n->left->type); + if(t != T) + f = lookdot(n->right, t->method); if(f == T) { - yyerror("undefined DOT %S", n->right->sym); + yyerror("undefined DOT %S on %T", n->right->sym, n->left->type); return; } @@ -1883,7 +1888,7 @@ fixchan(Type *tm) { Type *t; - if(tm == T) + if(tm == T) goto bad; t = tm->type; if(t == T) @@ -2298,7 +2303,7 @@ fixarray(Type *tm) bad: yyerror("not an array: %lT", tm); return T; - + } Node* |