Commit 4b8e0307 authored by Ken Thompson's avatar Ken Thompson

bug 135

R=r
OCL=23646
CL=23646
parent 7fa5941f
...@@ -801,6 +801,7 @@ Node* chanop(Node*, int); ...@@ -801,6 +801,7 @@ Node* chanop(Node*, int);
Node* arrayop(Node*, int); Node* arrayop(Node*, int);
Node* ifaceop(Type*, Node*, int); Node* ifaceop(Type*, Node*, int);
int ifaceas(Type*, Type*); int ifaceas(Type*, Type*);
int ifaceas1(Type*, Type*);
void ifacecheck(Type*, Type*, int); void ifacecheck(Type*, Type*, int);
void runifacechecks(void); void runifacechecks(void);
Node* convas(Node*); Node* convas(Node*);
......
...@@ -17,6 +17,7 @@ enum ...@@ -17,6 +17,7 @@ enum
I2I, I2I,
I2I2, I2I2,
T2I, T2I,
I2Isame,
}; };
// can this code branch reach the end // can this code branch reach the end
...@@ -500,11 +501,12 @@ loop: ...@@ -500,11 +501,12 @@ loop:
walktype(r->left, Erv); walktype(r->left, Erv);
if(r->left == N) if(r->left == N)
break; break;
et = ifaceas(r->type, r->left->type); et = ifaceas1(r->type, r->left->type);
switch(et) { switch(et) {
case I2T: case I2T:
et = I2T2; et = I2T2;
break; break;
case I2Isame:
case I2I: case I2I:
et = I2I2; et = I2I2;
break; break;
...@@ -2772,7 +2774,7 @@ arrayop(Node *n, int top) ...@@ -2772,7 +2774,7 @@ arrayop(Node *n, int top)
* return op to use. * return op to use.
*/ */
int int
ifaceas(Type *dst, Type *src) ifaceas1(Type *dst, Type *src)
{ {
if(src == T || dst == T) if(src == T || dst == T)
return Inone; return Inone;
...@@ -2780,7 +2782,7 @@ ifaceas(Type *dst, Type *src) ...@@ -2780,7 +2782,7 @@ ifaceas(Type *dst, Type *src)
if(isinter(dst)) { if(isinter(dst)) {
if(isinter(src)) { if(isinter(src)) {
if(eqtype(dst, src, 0)) if(eqtype(dst, src, 0))
return Inone; return I2Isame;
return I2I; return I2I;
} }
if(isnilinter(dst)) if(isnilinter(dst))
...@@ -2797,13 +2799,28 @@ ifaceas(Type *dst, Type *src) ...@@ -2797,13 +2799,28 @@ ifaceas(Type *dst, Type *src)
return Inone; return Inone;
} }
/*
* treat convert T to T as noop
*/
int
ifaceas(Type *dst, Type *src)
{
int et;
et = ifaceas1(dst, src);
if(et == I2Isame)
et = Inone;
return et;
}
static char* static char*
ifacename[] = ifacename[] =
{ {
[I2T] = "ifaceI2T", [I2T] = "ifaceI2T",
[I2T2] = "ifaceI2T2", [I2T2] = "ifaceI2T2",
[I2I] = "ifaceI2I", [I2I] = "ifaceI2I",
[I2I2] = "ifaceI2I2", [I2I2] = "ifaceI2I2",
[I2Isame] = "ifaceI2Isame",
}; };
Node* Node*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment