]> Cypherpunks repositories - gostls13.git/commitdiff
gc: bug247, reported by rob
authorRuss Cox <rsc@golang.org>
Mon, 25 Jan 2010 06:42:18 +0000 (22:42 -0800)
committerRuss Cox <rsc@golang.org>
Mon, 25 Jan 2010 06:42:18 +0000 (22:42 -0800)
R=ken2
CC=golang-dev
https://golang.org/cl/194051

src/cmd/gc/const.c
test/fixedbugs/bug247.go [new file with mode: 0644]

index 895f264313be43a8a10fa6ce17b93f3b39ea853e..d7d6e3503773fc46993715b5847b8ff9ce00b76e 100644 (file)
@@ -330,7 +330,7 @@ evconst(Node *n)
        int32 len;
        Strlit *str;
        int wl, wr, lno, et;
-       Val v;
+       Val v, rv;
        Mpint b;
 
        // pick off just the opcodes that can be
@@ -424,13 +424,15 @@ evconst(Node *n)
        if(wl == TIDEAL)
                v = copyval(v);
 
+       rv = nr->val;
+
        // since wl == wr,
        // the only way v.ctype != nr->val.ctype
        // is when one is CTINT and the other CTFLT.
        // make both CTFLT.
        if(v.ctype != nr->val.ctype) {
                v = toflt(v);
-               nr->val = toflt(nr->val);
+               rv = toflt(rv);
        }
 
        // run op
@@ -445,65 +447,65 @@ evconst(Node *n)
                return;
 
        case TUP(OADD, CTINT):
-               mpaddfixfix(v.u.xval, nr->val.u.xval);
+               mpaddfixfix(v.u.xval, rv.u.xval);
                break;
        case TUP(OSUB, CTINT):
-               mpsubfixfix(v.u.xval, nr->val.u.xval);
+               mpsubfixfix(v.u.xval, rv.u.xval);
                break;
        case TUP(OMUL, CTINT):
-               mpmulfixfix(v.u.xval, nr->val.u.xval);
+               mpmulfixfix(v.u.xval, rv.u.xval);
                break;
        case TUP(ODIV, CTINT):
-               if(mpcmpfixc(nr->val.u.xval, 0) == 0) {
+               if(mpcmpfixc(rv.u.xval, 0) == 0) {
                        yyerror("division by zero");
                        mpmovecfix(v.u.xval, 1);
                        break;
                }
-               mpdivfixfix(v.u.xval, nr->val.u.xval);
+               mpdivfixfix(v.u.xval, rv.u.xval);
                break;
        case TUP(OMOD, CTINT):
-               if(mpcmpfixc(nr->val.u.xval, 0) == 0) {
+               if(mpcmpfixc(rv.u.xval, 0) == 0) {
                        yyerror("division by zero");
                        mpmovecfix(v.u.xval, 1);
                        break;
                }
-               mpmodfixfix(v.u.xval, nr->val.u.xval);
+               mpmodfixfix(v.u.xval, rv.u.xval);
                break;
 
        case TUP(OLSH, CTINT):
-               mplshfixfix(v.u.xval, nr->val.u.xval);
+               mplshfixfix(v.u.xval, rv.u.xval);
                break;
        case TUP(ORSH, CTINT):
-               mprshfixfix(v.u.xval, nr->val.u.xval);
+               mprshfixfix(v.u.xval, rv.u.xval);
                break;
        case TUP(OOR, CTINT):
-               mporfixfix(v.u.xval, nr->val.u.xval);
+               mporfixfix(v.u.xval, rv.u.xval);
                break;
        case TUP(OAND, CTINT):
-               mpandfixfix(v.u.xval, nr->val.u.xval);
+               mpandfixfix(v.u.xval, rv.u.xval);
                break;
        case TUP(OANDNOT, CTINT):
-               mpandnotfixfix(v.u.xval, nr->val.u.xval);
+               mpandnotfixfix(v.u.xval, rv.u.xval);
                break;
        case TUP(OXOR, CTINT):
-               mpxorfixfix(v.u.xval, nr->val.u.xval);
+               mpxorfixfix(v.u.xval, rv.u.xval);
                break;
        case TUP(OADD, CTFLT):
-               mpaddfltflt(v.u.fval, nr->val.u.fval);
+               mpaddfltflt(v.u.fval, rv.u.fval);
                break;
        case TUP(OSUB, CTFLT):
-               mpsubfltflt(v.u.fval, nr->val.u.fval);
+               mpsubfltflt(v.u.fval, rv.u.fval);
                break;
        case TUP(OMUL, CTFLT):
-               mpmulfltflt(v.u.fval, nr->val.u.fval);
+               mpmulfltflt(v.u.fval, rv.u.fval);
                break;
        case TUP(ODIV, CTFLT):
-               if(mpcmpfltc(nr->val.u.fval, 0) == 0) {
+               if(mpcmpfltc(rv.u.fval, 0) == 0) {
                        yyerror("division by zero");
                        mpmovecflt(v.u.fval, 1.0);
                        break;
                }
-               mpdivfltflt(v.u.fval, nr->val.u.fval);
+               mpdivfltflt(v.u.fval, rv.u.fval);
                break;
 
        case TUP(OEQ, CTNIL):
@@ -512,52 +514,52 @@ evconst(Node *n)
                goto setfalse;
 
        case TUP(OEQ, CTINT):
-               if(mpcmpfixfix(v.u.xval, nr->val.u.xval) == 0)
+               if(mpcmpfixfix(v.u.xval, rv.u.xval) == 0)
                        goto settrue;
                goto setfalse;
        case TUP(ONE, CTINT):
-               if(mpcmpfixfix(v.u.xval, nr->val.u.xval) != 0)
+               if(mpcmpfixfix(v.u.xval, rv.u.xval) != 0)
                        goto settrue;
                goto setfalse;
        case TUP(OLT, CTINT):
-               if(mpcmpfixfix(v.u.xval, nr->val.u.xval) < 0)
+               if(mpcmpfixfix(v.u.xval, rv.u.xval) < 0)
                        goto settrue;
                goto setfalse;
        case TUP(OLE, CTINT):
-               if(mpcmpfixfix(v.u.xval, nr->val.u.xval) <= 0)
+               if(mpcmpfixfix(v.u.xval, rv.u.xval) <= 0)
                        goto settrue;
                goto setfalse;
        case TUP(OGE, CTINT):
-               if(mpcmpfixfix(v.u.xval, nr->val.u.xval) >= 0)
+               if(mpcmpfixfix(v.u.xval, rv.u.xval) >= 0)
                        goto settrue;
                goto setfalse;
        case TUP(OGT, CTINT):
-               if(mpcmpfixfix(v.u.xval, nr->val.u.xval) > 0)
+               if(mpcmpfixfix(v.u.xval, rv.u.xval) > 0)
                        goto settrue;
                goto setfalse;
 
        case TUP(OEQ, CTFLT):
-               if(mpcmpfltflt(v.u.fval, nr->val.u.fval) == 0)
+               if(mpcmpfltflt(v.u.fval, rv.u.fval) == 0)
                        goto settrue;
                goto setfalse;
        case TUP(ONE, CTFLT):
-               if(mpcmpfltflt(v.u.fval, nr->val.u.fval) != 0)
+               if(mpcmpfltflt(v.u.fval, rv.u.fval) != 0)
                        goto settrue;
                goto setfalse;
        case TUP(OLT, CTFLT):
-               if(mpcmpfltflt(v.u.fval, nr->val.u.fval) < 0)
+               if(mpcmpfltflt(v.u.fval, rv.u.fval) < 0)
                        goto settrue;
                goto setfalse;
        case TUP(OLE, CTFLT):
-               if(mpcmpfltflt(v.u.fval, nr->val.u.fval) <= 0)
+               if(mpcmpfltflt(v.u.fval, rv.u.fval) <= 0)
                        goto settrue;
                goto setfalse;
        case TUP(OGE, CTFLT):
-               if(mpcmpfltflt(v.u.fval, nr->val.u.fval) >= 0)
+               if(mpcmpfltflt(v.u.fval, rv.u.fval) >= 0)
                        goto settrue;
                goto setfalse;
        case TUP(OGT, CTFLT):
-               if(mpcmpfltflt(v.u.fval, nr->val.u.fval) > 0)
+               if(mpcmpfltflt(v.u.fval, rv.u.fval) > 0)
                        goto settrue;
                goto setfalse;
 
@@ -586,29 +588,29 @@ evconst(Node *n)
                        goto settrue;
                goto setfalse;
        case TUP(OADDSTR, CTSTR):
-               len = v.u.sval->len + nr->val.u.sval->len;
+               len = v.u.sval->len + rv.u.sval->len;
                str = mal(sizeof(*str) + len);
                str->len = len;
                memcpy(str->s, v.u.sval->s, v.u.sval->len);
-               memcpy(str->s+v.u.sval->len, nr->val.u.sval->s, nr->val.u.sval->len);
+               memcpy(str->s+v.u.sval->len, rv.u.sval->s, rv.u.sval->len);
                str->len = len;
                v.u.sval = str;
                break;
 
        case TUP(OOROR, CTBOOL):
-               if(v.u.bval || nr->val.u.bval)
+               if(v.u.bval || rv.u.bval)
                        goto settrue;
                goto setfalse;
        case TUP(OANDAND, CTBOOL):
-               if(v.u.bval && nr->val.u.bval)
+               if(v.u.bval && rv.u.bval)
                        goto settrue;
                goto setfalse;
        case TUP(OEQ, CTBOOL):
-               if(v.u.bval == nr->val.u.bval)
+               if(v.u.bval == rv.u.bval)
                        goto settrue;
                goto setfalse;
        case TUP(ONE, CTBOOL):
-               if(v.u.bval != nr->val.u.bval)
+               if(v.u.bval != rv.u.bval)
                        goto settrue;
                goto setfalse;
        }
diff --git a/test/fixedbugs/bug247.go b/test/fixedbugs/bug247.go
new file mode 100644 (file)
index 0000000..1ae30f2
--- /dev/null
@@ -0,0 +1,20 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: bug247
+
+// Copyright 2010 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+func main() {
+       const (
+               Delta = 100 * 1e6
+               Count = 10
+       )
+       _ = int64(Delta * Count)
+       var i interface{} = Count
+       j := i.(int)
+       if j != Count {
+               panicln("j=", j)
+       }
+}