int isnilinter(Type*);
Sym* globalsig(Type*);
Type* ismethod(Type*);
+Type* methtype(Type*);
+int needaddr(Type*);
Sym* signame(Type*, int);
int bytearraysz(Type*);
int eqtype(Type*, Type*, int);
return t;
}
+/*
+ * this is ismethod() without side effects
+ */
+Type*
+methtype(Type *t)
+{
+ Sym *s;
+
+ if(t == T)
+ return T;
+ if(t->etype == TINTER || (t->etype == tptr && t->type->etype == TINTER))
+ return T;
+ s = t->sym;
+ if(s != S)
+ return t;
+ if(!isptr[t->etype])
+ return T;
+ t = t->type;
+ if(t == T)
+ return T;
+ s = t->sym;
+ if(s != S)
+ return t;
+ return T;
+}
+
+/*
+ * this is another ismethod()
+ * returns 1 if t=T and method wants *T
+ */
+int
+needaddr(Type *t)
+{
+ Sym *s;
+
+ if(t == T)
+ return 0;
+ if(t->etype == TINTER || (t->etype == tptr && t->type->etype == TINTER))
+ return 0;
+ s = t->sym;
+ if(s != S && t->methptr == 2)
+ return 1;
+ return 0;
+}
+
int
iscomposite(Type *t)
{
lineno = lno;
}
-Type*
-methtype(Type *t)
-{
- Sym *s;
-
- // this is ismethod() without diagnostics
- if(t == T)
- return T;
- if(t->etype == TINTER || (t->etype == tptr && t->type->etype == TINTER))
- return T;
- s = t->sym;
- if(s != S && s->name[0] != '_')
- return t;
- if(!isptr[t->etype])
- return T;
- t = t->type;
- if(t == T)
- return T;
- s = t->sym;
- if(s != S && s->name[0] != '_')
- return t;
- return T;
-}
-
Type*
lookdot1(Node *n, Type *f)
{
}
if(f2 != T) {
+ if(needaddr(n->left->type)) {
+ n->left = nod(OADDR, n->left, N);
+ n->left->type = ptrto(n->left->left->type);
+ }
n->right = methodname(n->right, ismethod(n->left->type));
n->xoffset = f2->width;
n->type = f2->type;