summaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2010-10-07 04:42:44 -0400
committerRuss Cox <rsc@golang.org>2010-10-07 04:42:44 -0400
commitd9dac6cf43693cb74ffef06d31098455bd1d41d6 (patch)
tree983cb9251ae2ac53810587386bfcb4d9f5ed69cd /src/cmd
parent9ba0bfc17c1c812a86fe912e19d005baa9eed9a3 (diff)
downloadgo-d9dac6cf43693cb74ffef06d31098455bd1d41d6.tar.gz
gc: better error for method non-call
was x.go:7: must call (&b).*Buffer?Write now x.go:7: method b.Write is not an expression, must be called Fixes issue 1171. R=ken2 CC=golang-dev http://codereview.appspot.com/2384042
Diffstat (limited to 'src/cmd')
-rw-r--r--src/cmd/gc/go.h3
-rw-r--r--src/cmd/gc/print.c17
-rw-r--r--src/cmd/gc/typecheck.c4
3 files changed, 20 insertions, 4 deletions
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index 490710b7e..ec1ada74e 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -210,8 +210,9 @@ struct Node
uchar dodata; // compile literal assignment as data statement
uchar used;
uchar isddd;
- uchar pun; // dont registerize variable ONAME
+ uchar pun; // don't registerize variable ONAME
uchar readonly;
+ uchar implicit; // don't show in printout
// most nodes
Node* left;
diff --git a/src/cmd/gc/print.c b/src/cmd/gc/print.c
index ca013fabb..32e8b7de5 100644
--- a/src/cmd/gc/print.c
+++ b/src/cmd/gc/print.c
@@ -23,12 +23,18 @@ void
exprfmt(Fmt *f, Node *n, int prec)
{
int nprec;
+ char *p;
nprec = 0;
if(n == nil) {
fmtprint(f, "<nil>");
return;
}
+
+ if(n->implicit) {
+ exprfmt(f, n->left, prec);
+ return;
+ }
switch(n->op) {
case ONAME:
@@ -298,8 +304,15 @@ exprfmt(Fmt *f, Node *n, int prec)
exprfmt(f, n->left, 7);
if(n->right == N || n->right->sym == S)
fmtprint(f, ".<nil>");
- else
- fmtprint(f, ".%s", n->right->sym->name);
+ else {
+ // skip leading type· in method name
+ p = utfrrune(n->right->sym->name, 0xb7);
+ if(p)
+ p+=2;
+ else
+ p = n->right->sym->name;
+ fmtprint(f, ".%s", p);
+ }
break;
case ODOTTYPE:
diff --git a/src/cmd/gc/typecheck.c b/src/cmd/gc/typecheck.c
index f139ee821..28382f1fd 100644
--- a/src/cmd/gc/typecheck.c
+++ b/src/cmd/gc/typecheck.c
@@ -1254,7 +1254,7 @@ ret:
goto error;
}
if((ok & Ecall) && !(top & Ecall)) {
- yyerror("must call %#N", n);
+ yyerror("method %#N is not an expression, must be called", n);
goto error;
}
// TODO(rsc): simplify
@@ -1483,9 +1483,11 @@ lookdot(Node *n, Type *t, int dostrcmp)
checklvalue(n->left, "call pointer method on");
addrescapes(n->left);
n->left = nod(OADDR, n->left, N);
+ n->left->implicit = 1;
typecheck(&n->left, Etype|Erv);
} else if(tt->etype == tptr && eqtype(tt->type, rcvr)) {
n->left = nod(OIND, n->left, N);
+ n->left->implicit = 1;
typecheck(&n->left, Etype|Erv);
} else {
// method is attached to wrong type?