]> Cypherpunks repositories - gostls13.git/commitdiff
fixed bugs in const/case
authorKen Thompson <ken@golang.org>
Tue, 12 Aug 2008 21:04:03 +0000 (14:04 -0700)
committerKen Thompson <ken@golang.org>
Tue, 12 Aug 2008 21:04:03 +0000 (14:04 -0700)
R=r
DELTA=138  (75 added, 12 deleted, 51 changed)
OCL=14129
CL=14131

src/cmd/6g/gen.c
src/cmd/gc/const.c
src/cmd/gc/go.h
src/cmd/gc/go.y
src/cmd/gc/lex.c
src/cmd/gc/mparith1.c
src/cmd/gc/subr.c
src/cmd/gc/walk.c
test/ken/rob2.go

index e15a9e20acd5814f928cc1315fcff16757733e56..babaebbba8cc351a4c1a80f35d2d2b0b9b0c0075 100644 (file)
@@ -455,10 +455,9 @@ swgen(Node *n)
                }
 
                // put in the break between cases
-               if(any) {
+               if(any)
                        patch(gbranch(AJMP, T), breakpc);
-                       any = 0;
-               }
+               any = 1;
 
                // over case expressions
                c2 = listfirst(&save2, &c1->left);
index 2188178a697cff5cb9854855e377f88c08de8adc..90eaff269e4cabb94a32396a53df2b06ef17b933 100644 (file)
@@ -63,12 +63,16 @@ convlit(Node *n, Type *t)
                        break;
                }
                if(isfloat[et]) {
+                       Mpint *xv;
+
                        // int to float
-                       if(mpcmpfltflt(n->val.u.fval, minfltval[et]) < 0)
+                       xv = n->val.u.xval;
+                       if(mpcmpfixflt(xv, minfltval[et]) < 0)
                                goto bad2;
-                       if(mpcmpfltflt(n->val.u.fval, maxfltval[et]) > 0)
+                       if(mpcmpfixflt(xv, maxfltval[et]) > 0)
                                goto bad2;
-                       mpmovefixflt(n->val.u.fval, n->val.u.xval);
+                       n->val.u.fval = mal(sizeof(*n->val.u.fval));
+                       mpmovefixflt(n->val.u.fval, xv);
                        n->val.ctype = CTFLT;
                        break;
                }
@@ -76,12 +80,16 @@ convlit(Node *n, Type *t)
 
        case Wlitfloat:
                if(isint[et]) {
+                       Mpflt *fv;
+
                        // float to int
-                       if(mpcmpfixfix(n->val.u.xval, minintval[et]) < 0)
+                       fv = n->val.u.fval;
+                       if(mpcmpfltfix(fv, minintval[et]) < 0)
                                goto bad2;
-                       if(mpcmpfixfix(n->val.u.xval, maxintval[et]) > 0)
+                       if(mpcmpfltfix(fv, maxintval[et]) > 0)
                                goto bad2;
-                       mpmovefltfix(n->val.u.xval, n->val.u.fval);
+                       n->val.u.xval = mal(sizeof(*n->val.u.xval));
+                       mpmovefltfix(n->val.u.xval, fv);
                        n->val.ctype = CTINT;
                        break;
                }
index 16efdc9cb9438e7dc9c7872fe29b3ff767bd0431..47f1f54f4143e82ca4cb04667320c6859d4194b0 100644 (file)
@@ -471,6 +471,8 @@ void        mkpackage(char*);
 /*
  *     mparith1.c
  */
+int    mpcmpfixflt(Mpint *a, Mpflt *b);
+int    mpcmpfltfix(Mpflt *a, Mpint *b);
 int    mpcmpfixfix(Mpint *a, Mpint *b);
 int    mpcmpfixc(Mpint *b, vlong c);
 int    mpcmpfltflt(Mpflt *a, Mpflt *b);
index f3060e02f39c12b822175ee44737f2acf0dc8349..a997193d4581c24c5d4f857d9695232a5879cc04 100644 (file)
@@ -708,7 +708,7 @@ pexpr:
        {
                $$ = $2;
        }
-|      pexpr '.' sym1
+|      pexpr '.' sym2
        {
                $$ = nod(ODOT, $1, newname($3));
        }
@@ -812,13 +812,13 @@ name_name:
        }
 
 new_name:
-       sym2
+       sym1
        {
                $$ = newname($1);
        }
 
 new_type:
-       sym2
+       sym1
        {
                $$ = newtype($1);
        }
@@ -832,17 +832,36 @@ sym:
 sym1:
        sym
 |      key1
-|      key2
 
 sym2:
        sym
+|      key1
 |      key2
 
 /*
  * keywords that we can
+>>>> ORIGINAL go/src/cmd/gc/go.y#8
+==== THEIRS go/src/cmd/gc/go.y#9
  * use as field names
+==== YOURS go/src/cmd/gc/go.y
+ * use a variable/type names
+<<<<
  */
 key1:
+       LNIL
+|      LTRUE
+|      LFALSE
+|      LIOTA
+|      LLEN
+|      LPANIC
+|      LPRINT
+|      LNEW
+|      LBASETYPE
+
+/*
+ * keywords that we can
+ */
+key2:
        LPACKAGE
 |      LIMPORT
 |      LEXPORT
@@ -871,8 +890,21 @@ key1:
 |      LRANGE
 |      LIGNORE
 
-/*
- * keywords that we can
+>>>> ORIGINAL go/src/cmd/gc/go.y#8
+ * use a variable/type names
+ */
+key2:
+       LNIL
+|      LTRUE
+|      LFALSE
+|      LIOTA
+|      LLEN
+|      LPANIC
+|      LPRINT
+|      LNEW
+|      LBASETYPE
+
+==== THEIRS go/src/cmd/gc/go.y#9
  * use as variable/type names
  */
 key2:
@@ -886,6 +918,8 @@ key2:
 |      LNEW
 |      LBASETYPE
 
+==== YOURS src/cmd/gc/go.y
+<<<<
 name:
        lname
        {
@@ -1394,7 +1428,7 @@ export:
        {
                exportsym($1);
        }
-|      sym '.' sym1
+|      sym '.' sym2
        {
                exportsym(pkglookup($3->name, $1->name));
        }
@@ -1578,7 +1612,7 @@ hidden_import:
        }
 
 isym:
-       sym '.' sym1
+       sym '.' sym2
        {
                $$ = nod(OIMPORT, N, N);
                $$->osym = $1;
@@ -1586,7 +1620,7 @@ isym:
                $$->sym = $3;
                renamepkg($$);
        }
-|      '(' sym ')' sym '.' sym1
+|      '(' sym ')' sym '.' sym2
        {
                $$ = nod(OIMPORT, N, N);
                $$->osym = $2;
index 200960dff9a6ee632b68b5825afe7c56f5f67b92..2087ed5eabd7693aebe145736d81929b91055cad 100644 (file)
@@ -1022,8 +1022,8 @@ void
 lexinit(void)
 {
        int i, etype, lex;
-       Sym *s;
        Type *t;
+       Sym *s;
 
        besetptr();
 
index 189e43af6fb4be2962d1a961a1eda344f33ad955..a787f7d8954f9b5e25328cb10ae0019c40b34ce1 100644 (file)
@@ -6,6 +6,28 @@
 
 /// uses arihmetic
 
+int
+mpcmpfixflt(Mpint *a, Mpflt *b)
+{
+       char buf[500];
+       Mpflt c;
+
+       sprint(buf, "%B", a);
+       mpatoflt(&c, buf);
+       return mpcmpfltflt(&c, b);
+}
+
+int
+mpcmpfltfix(Mpflt *a, Mpint *b)
+{
+       char buf[500];
+       Mpflt c;
+
+       sprint(buf, "%B", b);
+       mpatoflt(&c, buf);
+       return mpcmpfltflt(a, &c);
+}
+
 int
 mpcmpfixfix(Mpint *a, Mpint *b)
 {
index 11cb870f9a42c902769b9560717ddd229b9b9ba2..0234700fc329e17ef0df4e3a9e56f93e1a1a58fd 100644 (file)
@@ -1064,7 +1064,7 @@ Nconv(Fmt *fp)
                        snprint(buf1, sizeof(buf1), "S\"%Z\"", n->val.u.sval);
                        break;
                case CTBOOL:
-                       snprint(buf1, sizeof(buf1), "B%lld", n->val.u.bval);
+                       snprint(buf1, sizeof(buf1), "B%d", n->val.u.bval);
                        break;
                case CTNIL:
                        snprint(buf1, sizeof(buf1), "N");
index ad96e2e2b14a0220afa2953bd67d8ef2d2247343..36021ec0c921f895256792fe746af0c334bca33f 100644 (file)
@@ -1399,11 +1399,11 @@ Node*
 prcompat(Node *n)
 {
        Node *l, *r;
+       Node *on;
        Type *t;
        Iter save;
        int w;
        char *name;
-       Node *on;
 
        r = N;
        l = listfirst(&save, &n);
index b18435dfcaa1281afdba358c44071c0b49466c81..f7bec7bb78d240c7dae203b6205c1c772b9439da 100644 (file)
@@ -162,35 +162,34 @@ func NextToken()
                c = Get();
        }
        switch c {
-               case EOF:
-                       token = EOF;
-               case '(':
-               case ')':
-                       token = c;
-                       break;
-               default:
-                       for i = 0; i < 100 - 1; {       // sizeof tokenbuf - 1
-                               tokenbuf[i] = convert(byte, c);
-                               i = i + 1;
-                               c = Get();
-                               if c == EOF {
-                                       break;
-                               }
-                               if WhiteSpace(c) || c == ')' {
-                                       peekc = c;
-                                       break;
-                               }
-                       }
-                       if i >= 100 - 1 {       // sizeof tokenbuf - 1
-                               panic("atom too long\n");
+       case EOF:
+               token = EOF;
+       case '(', ')':
+               token = c;
+               break;
+       default:
+               for i = 0; i < 100 - 1; {       // sizeof tokenbuf - 1
+                       tokenbuf[i] = convert(byte, c);
+                       i = i + 1;
+                       c = Get();
+                       if c == EOF {
+                               break;
                        }
-                       tokenlen = i;
-                       tokenbuf[i] = nilchar;
-                       if '0' <= tokenbuf[0] && tokenbuf[0] <= '9' {
-                               token = '0';
-                       } else {
-                               token = 'A';
+                       if WhiteSpace(c) || c == ')' {
+                               peekc = c;
+                               break;
                        }
+               }
+               if i >= 100 - 1 {       // sizeof tokenbuf - 1
+                       panic("atom too long\n");
+               }
+               tokenlen = i;
+               tokenbuf[i] = nilchar;
+               if '0' <= tokenbuf[0] && tokenbuf[0] <= '9' {
+                       token = '0';
+               } else {
+                       token = 'A';
+               }
        }
 }
 
@@ -267,16 +266,15 @@ func Parse() *Slist
        } else {
                // Atom
                switch token {
-                       case EOF:
-                               return nil;
-                       case '0':
-                               slist = atom(atoi());
-                       case '"':
-                       case 'A':
-                               slist = atom(0);
-                       default:
-                               slist = nil;
-                               print("unknown token"); // token, tokenbuf);
+               case EOF:
+                       return nil;
+               case '0':
+                       slist = atom(atoi());
+               case '"', 'A':
+                       slist = atom(0);
+               default:
+                       slist = nil;
+                       print("unknown token: ", token, "\n");
                }
                NextToken();
                return slist;