mirror of
https://github.com/golang/go
synced 2024-11-26 17:07:09 -07:00
embedded types
auto & on methods R=r OCL=17682 CL=17682
This commit is contained in:
parent
ad48706a24
commit
7ed8fc611d
@ -584,6 +584,8 @@ int isinter(Type*);
|
||||
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);
|
||||
|
@ -1518,6 +1518,51 @@ out:
|
||||
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)
|
||||
{
|
||||
|
@ -1422,30 +1422,6 @@ walkselect(Node *sel)
|
||||
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)
|
||||
{
|
||||
@ -1495,6 +1471,10 @@ lookdot(Node *n, Type *t)
|
||||
}
|
||||
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user