]> Cypherpunks repositories - gostls13.git/commitdiff
^ type(const) now inverts "enough" bits
authorKen Thompson <ken@golang.org>
Tue, 24 Mar 2009 23:40:38 +0000 (16:40 -0700)
committerKen Thompson <ken@golang.org>
Tue, 24 Mar 2009 23:40:38 +0000 (16:40 -0700)
^ signed(const) becomes illegal
^ unsigned(const) becomes legal

R=r
OCL=26697
CL=26697

src/cmd/gc/const.c
test/const1.go
test/fixedbugs/bug115.go [moved from test/bugs/bug115.go with 100% similarity]

index 8b02de9b2db3aba9f01e3f48a7a4a2f81a968703..fbb4fa30393af12f2accde207c53026611b1f74a 100644 (file)
@@ -282,8 +282,9 @@ evconst(Node *n)
        Node *nl, *nr;
        int32 len;
        String *str;
-       int wl, wr, lno;
+       int wl, wr, lno, et;
        Val v;
+       Mpint b;
 
        nl = n->left;
        if(nl == N || nl->type == T)
@@ -541,7 +542,34 @@ unary:
                mpnegfix(v.u.xval);
                break;
        case TUP(OCOM, CTINT):
-               mpcomfix(v.u.xval);
+               et = Txxx;
+               if(nl->type != T)
+                       et = nl->type->etype;
+
+               // calculate the mask in b
+               // result will be (a ^ mask)
+               switch(et) {
+               default:
+                       mpmovecfix(&b, -1);
+                       break;
+
+               case TINT8:
+               case TINT16:
+               case TINT32:
+               case TINT64:
+               case TINT:
+                       et++;           // convert to unsigned
+                                       // fallthrough
+               case TUINT8:
+               case TUINT16:
+               case TUINT32:
+               case TUINT64:
+               case TUINT:
+               case TUINTPTR:
+                       mpmovefixfix(&b, maxintval[et]);
+                       break;
+               }
+               mpxorfixfix(v.u.xval, &b);
                break;
 
        case TUP(OPLUS, CTFLT):
index d51e5823a6e436f24eade1ecfa1cb2eb1f846d73..0d48ada5e2dce69003e87558aef434e13ca3b9ec 100644 (file)
@@ -39,7 +39,7 @@ var (
        b3 = Uint8 - Uint8;     // OK
        b4 = Uint8 - Uint8 - Uint8;     // ERROR "overflow"
        b5 = uint8(^0); // ERROR "overflow"
-       b6 = ^uint8(0); // ERROR "overflow"
+       b6 = ^uint8(0); // OK
        b7 = uint8(Minus1);     // ERROR "overflow"
        b8 = uint8(int8(-1));   // ERROR "overflow"
        b8a = uint8(-1);        // ERROR "overflow"
similarity index 100%
rename from test/bugs/bug115.go
rename to test/fixedbugs/bug115.go