1
0
mirror of https://github.com/golang/go synced 2024-11-24 18:10:02 -07:00

gc: implement new shift rules

The change is that 1.0<<2 is now okay.

R=ken2
CC=golang-dev
https://golang.org/cl/4524084
This commit is contained in:
Russ Cox 2011-05-31 15:05:40 -04:00
parent 9b82408f6d
commit 5ab096d030
3 changed files with 5 additions and 16 deletions

View File

@ -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;
}

View File

@ -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

View File

@ -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