Commit 5ab096d0 authored by Russ Cox's avatar Russ Cox

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
parent 9b82408f
......@@ -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;
}
......
......@@ -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
......
// $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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment