]> Cypherpunks repositories - gostls13.git/commitdiff
gc: bug246
authorRuss Cox <rsc@golang.org>
Tue, 2 Feb 2010 07:05:15 +0000 (23:05 -0800)
committerRuss Cox <rsc@golang.org>
Tue, 2 Feb 2010 07:05:15 +0000 (23:05 -0800)
R=ken2
CC=golang-dev
https://golang.org/cl/198057

src/cmd/gc/align.c
src/cmd/gc/const.c
src/cmd/gc/go.h
src/cmd/gc/walk.c
test/fixedbugs/bug246.go [moved from test/bugs/bug246.go with 51% similarity]
test/golden.out

index 7a27a040c9f88ffe103558dfdbcffe0f619fbd07..dfb9f9e892119313d27603e71a9faaeb7cb3b818 100644 (file)
@@ -410,6 +410,7 @@ typeinit(void)
                        okforarith[i] = 1;
                        okforadd[i] = 1;
                        okforand[i] = 1;
+                       okforconst[i] = 1;
                        issimple[i] = 1;
                        minintval[i] = mal(sizeof(*minintval[i]));
                        maxintval[i] = mal(sizeof(*maxintval[i]));
@@ -419,6 +420,7 @@ typeinit(void)
                        okforcmp[i] = 1;
                        okforadd[i] = 1;
                        okforarith[i] = 1;
+                       okforconst[i] = 1;
                        issimple[i] = 1;
                        minfltval[i] = mal(sizeof(*minfltval[i]));
                        maxfltval[i] = mal(sizeof(*maxfltval[i]));
@@ -434,6 +436,9 @@ typeinit(void)
        okforcap[TARRAY] = 1;
        okforcap[TCHAN] = 1;
 
+       okforconst[TBOOL] = 1;
+       okforconst[TSTRING] = 1;
+
        okforlen[TARRAY] = 1;
        okforlen[TCHAN] = 1;
        okforlen[TMAP] = 1;
index d7d6e3503773fc46993715b5847b8ff9ce00b76e..a78c122fecb48c716947548005c2fc7ec90595c5 100644 (file)
@@ -93,6 +93,9 @@ convlit1(Node **np, Type *t, int explicit)
                }
                return;
        case OLITERAL:
+               // target is invalid type for a constant?  leave alone.
+               if(!okforconst[t->etype] && n->type->etype != TNIL)
+                       return;
                break;
        case OLSH:
        case ORSH:
@@ -105,6 +108,7 @@ convlit1(Node **np, Type *t, int explicit)
                n->type = t;
                return;
        }
+
        // avoided repeated calculations, errors
        if(cvttype(n->type, t) == 1) {
                n->type = t;
@@ -345,7 +349,6 @@ evconst(Node *n)
        case OANDNOT:
        case OARRAYBYTESTR:
        case OCOM:
-       case OCONV:
        case ODIV:
        case OEQ:
        case OGE:
@@ -365,6 +368,12 @@ evconst(Node *n)
        case OSUB:
        case OXOR:
                break;
+       case OCONV:
+               if(n->type == T)
+                       return;
+               if(!okforconst[n->type->etype] && n->type->etype != TNIL)
+                       return;
+               break;
        }
 
        nl = n->left;
index 16cf87f0c22a9682613e9eb60bd0cd0e60a8d86e..98a15970118ce1f697fc4e0047635c65a31d6ff1 100644 (file)
@@ -680,6 +680,7 @@ EXTERN      uchar   okforbool[NTYPE];
 EXTERN uchar   okforcap[NTYPE];
 EXTERN uchar   okforlen[NTYPE];
 EXTERN uchar   okforarith[NTYPE];
+EXTERN uchar   okforconst[NTYPE];
 EXTERN uchar*  okfor[OEND];
 EXTERN uchar   iscmp[OEND];
 
index f560d5be27a60f3b1f086ad7bfcf563142c78482..ffdd17a95da55ed1fe446dfa9373b6813b5560f0 100644 (file)
@@ -182,7 +182,7 @@ walkdef(Node *n)
                t = n->type;
                if(t != T) {
                        convlit(&e, t);
-                       if(!isint[t->etype] && !isfloat[t->etype] && t->etype != TSTRING && t->etype != TBOOL)
+                       if(!okforconst[t->etype])
                                yyerror("invalid constant type %T", t);
                }
                n->val = e->val;
similarity index 51%
rename from test/bugs/bug246.go
rename to test/fixedbugs/bug246.go
index e46cdfd048f6ee30a4b4f0caff823997a35cf536..1c4dc0d5370529ddbaeafd88fb0f59b89033a77d 100644 (file)
@@ -1,4 +1,4 @@
-// $G $D/$F.go || echo BUG: bug246
+// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: bug246
 
 // Copyright 2009 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
@@ -10,9 +10,13 @@ import "unsafe"
 
 func main() {
        // works
-       addr := uintptr(0)
-       = (*int)(unsafe.Pointer(addr))
+       addr := uintptr(0x234)
+       x1 := (*int)(unsafe.Pointer(addr))
 
        // fails
-       _ = (*int)(unsafe.Pointer(uintptr(0)))
+       x2 := (*int)(unsafe.Pointer(uintptr(0x234)))
+       
+       if x1 != x2 {
+               panicln("mismatch", x1, x2)
+       }
 }
index 63d179cba5423c817f7f100798739dd4888b1b54..cf2297e1a73e4715517199946c8d2bf5c288017c 100644 (file)
@@ -150,8 +150,3 @@ throw: interface conversion
 panic PC=xxx
 
 == bugs/
-
-=========== bugs/bug246.go
-bugs/bug246.go:17: cannot convert 0 to type unsafe.Pointer
-bugs/bug246.go:17: cannot convert 0 (type uintptr) to type *int in conversion
-BUG: bug246