]> Cypherpunks repositories - gostls13.git/commitdiff
bug 135
authorKen Thompson <ken@golang.org>
Wed, 28 Jan 2009 02:21:03 +0000 (18:21 -0800)
committerKen Thompson <ken@golang.org>
Wed, 28 Jan 2009 02:21:03 +0000 (18:21 -0800)
R=r
OCL=23646
CL=23646

src/cmd/gc/go.h
src/cmd/gc/walk.c

index a5d518b8d1a92bb1c42938e6766a39a2f486f638..ba2672390d1442c63916e0bcb4350b842e3260e9 100644 (file)
@@ -801,6 +801,7 @@ Node*       chanop(Node*, int);
 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*);
index 1bab4b9cd04d4f4f02fc1c293b02ec61acfd3d21..780da143329ef3e4232732c532e6992ee4ac7783 100644 (file)
@@ -17,6 +17,7 @@ enum
        I2I,
        I2I2,
        T2I,
+       I2Isame,
 };
 
 // can this code branch reach the end
@@ -500,11 +501,12 @@ loop:
                                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;
@@ -2772,7 +2774,7 @@ arrayop(Node *n, int top)
  * return op to use.
  */
 int
-ifaceas(Type *dst, Type *src)
+ifaceas1(Type *dst, Type *src)
 {
        if(src == T || dst == T)
                return Inone;
@@ -2780,7 +2782,7 @@ ifaceas(Type *dst, Type *src)
        if(isinter(dst)) {
                if(isinter(src)) {
                        if(eqtype(dst, src, 0))
-                               return Inone;
+                               return I2Isame;
                        return I2I;
                }
                if(isnilinter(dst))
@@ -2797,13 +2799,28 @@ ifaceas(Type *dst, Type *src)
        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*