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;
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:
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:
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
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?