summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2011-05-31 15:05:40 -0400
committerRuss Cox <rsc@golang.org>2011-05-31 15:05:40 -0400
commitd031851b1406d5ac92eb9457744987abd2f5ae89 (patch)
tree30de12affd2d07d06ce572436f000126a9f81973
parente9d9760818188983f5586620b996890831ff1a54 (diff)
downloadgo-d031851b1406d5ac92eb9457744987abd2f5ae89.tar.gz
gc: implement new shift rules
The change is that 1.0<<2 is now okay. R=ken2 CC=golang-dev http://codereview.appspot.com/4524084
-rw-r--r--src/cmd/gc/const.c4
-rw-r--r--test/golden.out15
-rw-r--r--test/shift2.go2
3 files changed, 5 insertions, 16 deletions
diff --git a/src/cmd/gc/const.c b/src/cmd/gc/const.c
index a36ec68c0..8fe9072b2 100644
--- a/src/cmd/gc/const.c
+++ b/src/cmd/gc/const.c
@@ -103,6 +103,8 @@ convlit1(Node **np, Type *t, int explicit)
case ORSH:
convlit1(&n->left, t, explicit && isideal(n->left->type));
t = n->left->type;
+ if(t != T && t->etype == TIDEAL && n->val.ctype != CTINT)
+ n->val = toint(n->val);
if(t != T && !isint[t->etype]) {
yyerror("invalid operation: %#N (shift of type %T)", n, t);
t = T;
@@ -514,6 +516,8 @@ evconst(Node *n)
n->right = nr;
if(nr->type && (issigned[nr->type->etype] || !isint[nr->type->etype]))
goto illegal;
+ nl->val = toint(nl->val);
+ nr->val = toint(nr->val);
break;
}
diff --git a/test/golden.out b/test/golden.out
index ba60fbfed..4400e41dd 100644
--- a/test/golden.out
+++ b/test/golden.out
@@ -40,21 +40,6 @@ hello, world
-9223372036854775808
9223372036854775807
-=========== ./shift1.go
-BUG: errchk: ./shift1.go:33: error message does not match 'overflow'
-errchk: ./shift1.go:34: error message does not match 'overflow'
-errchk: ./shift1.go:35: error message does not match 'overflow'
-
-=========== ./shift2.go
-./shift2.go:22: illegal constant expression: ideal LSH uint
-./shift2.go:35: illegal constant expression: ideal LSH uint
-./shift2.go:36: illegal constant expression: ideal LSH uint
-./shift2.go:36: invalid operation: 2 << c (shift of type float64)
-./shift2.go:39: illegal constant expression: ideal LSH uint
-./shift2.go:40: illegal constant expression: ideal LSH uint
-./shift2.go:40: invalid operation: 2 << c (shift of type float64)
-./shift2.go:40: cannot use 2 << c as type interface { } in function argument
-
=========== ./sigchld.go
survived SIGCHLD
diff --git a/test/shift2.go b/test/shift2.go
index b08b37b7f..ec4c7addc 100644
--- a/test/shift2.go
+++ b/test/shift2.go
@@ -1,4 +1,4 @@
-// $G $D/$F.go && $L $F.$A && ./$A.out
+// $G $D/$F.go || echo BUG: shift2
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style