Node* arrayop(Node*, int);
Node* ifaceop(Type*, Node*, int);
int ifaceas(Type*, Type*);
+int ifaceas1(Type*, Type*);
void ifacecheck(Type*, Type*, int);
void runifacechecks(void);
Node* convas(Node*);
I2I,
I2I2,
T2I,
+ I2Isame,
};
// can this code branch reach the end
walktype(r->left, Erv);
if(r->left == N)
break;
- et = ifaceas(r->type, r->left->type);
+ et = ifaceas1(r->type, r->left->type);
switch(et) {
case I2T:
et = I2T2;
break;
+ case I2Isame:
case I2I:
et = I2I2;
break;
* return op to use.
*/
int
-ifaceas(Type *dst, Type *src)
+ifaceas1(Type *dst, Type *src)
{
if(src == T || dst == T)
return Inone;
if(isinter(dst)) {
if(isinter(src)) {
if(eqtype(dst, src, 0))
- return Inone;
+ return I2Isame;
return I2I;
}
if(isnilinter(dst))
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*
ifacename[] =
{
- [I2T] = "ifaceI2T",
- [I2T2] = "ifaceI2T2",
- [I2I] = "ifaceI2I",
- [I2I2] = "ifaceI2I2",
+ [I2T] = "ifaceI2T",
+ [I2T2] = "ifaceI2T2",
+ [I2I] = "ifaceI2I",
+ [I2I2] = "ifaceI2I2",
+ [I2Isame] = "ifaceI2Isame",
};
Node*