diff options
author | Russ Cox <rsc@golang.org> | 2011-05-31 15:05:40 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2011-05-31 15:05:40 -0400 |
commit | d031851b1406d5ac92eb9457744987abd2f5ae89 (patch) | |
tree | 30de12affd2d07d06ce572436f000126a9f81973 | |
parent | e9d9760818188983f5586620b996890831ff1a54 (diff) | |
download | go-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.c | 4 | ||||
-rw-r--r-- | test/golden.out | 15 | ||||
-rw-r--r-- | test/shift2.go | 2 |
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 |