summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2008-10-04 02:51:03 -0700
committerRuss Cox <rsc@golang.org>2008-10-04 02:51:03 -0700
commit024b59080c461df58e169abb6f83ad5a11786b2f (patch)
tree51b0ba85c6d69917ad6abdc0150806c3599a8221 /src
parentde2cca7f6ab0c894f6bef5be158ae51e07e8f0e9 (diff)
downloadgolang-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.c13
-rw-r--r--src/cmd/gc/go.y8
-rw-r--r--src/cmd/gc/walk.c17
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*