diff options
author | Russ Cox <rsc@golang.org> | 2011-07-28 13:03:30 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2011-07-28 13:03:30 -0400 |
commit | 438919266995560920fa109e199cf9cbf2660e41 (patch) | |
tree | 76a88ffe112fe1d50c8d3af34916a3e7c8bf802d | |
parent | ca68b2810d599b56e9e9a640f715de7485caf593 (diff) | |
download | go-438919266995560920fa109e199cf9cbf2660e41.tar.gz go-438919266995560920fa109e199cf9cbf2660e41.zip |
gc: shift type bug
Fixes #1664.
R=ken2
CC=golang-dev
https://golang.org/cl/4798056
-rw-r--r-- | src/cmd/gc/const.c | 20 | ||||
-rw-r--r-- | test/fixedbugs/bug363.go | 21 |
2 files changed, 39 insertions, 2 deletions
diff --git a/src/cmd/gc/const.c b/src/cmd/gc/const.c index 8fe9072b23..36a64cb97c 100644 --- a/src/cmd/gc/const.c +++ b/src/cmd/gc/const.c @@ -947,8 +947,24 @@ defaultlit(Node **np, Type *t) dump("defaultlit", n); fatal("defaultlit"); } - defaultlit(&n->left, t); - defaultlit(&n->right, t); + // n is ideal, so left and right must both be ideal. + // n has not been computed as a constant value, + // so either left or right must not be constant. + // The only 'ideal' non-constant expressions are shifts. Ugh. + // If one of these is a shift and the other is not, use that type. + // When compiling x := 1<<i + 3.14, this means we try to push + // the float64 down into the 1<<i, producing the correct error + // (cannot shift float64). + if(t == T && (n->right->op == OLSH || n->right->op == ORSH)) { + defaultlit(&n->left, T); + defaultlit(&n->right, n->left->type); + } else if(t == T && (n->left->op == OLSH || n->left->op == ORSH)) { + defaultlit(&n->right, T); + defaultlit(&n->left, n->right->type); + } else { + defaultlit(&n->left, t); + defaultlit(&n->right, t); + } if(n->type == idealbool || n->type == idealstring) n->type = types[n->type->etype]; else diff --git a/test/fixedbugs/bug363.go b/test/fixedbugs/bug363.go new file mode 100644 index 0000000000..7e89749a0a --- /dev/null +++ b/test/fixedbugs/bug363.go @@ -0,0 +1,21 @@ +// errchk $G $D/$F.go + +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// issue 1664 + +package main + +func main() { + var i uint = 33 + var a = (1<<i) + 4.5 // ERROR "shift of type float64" + println(a) + + var b = (1<<i) + 4.0 // ERROR "shift of type float64" + println(b) + + var c int64 = (1<<i) + 4.0 // ok - it's all int64 + println(b) +} |