diff options
author | Robert Griesemer <gri@golang.org> | 2022-04-01 17:02:28 -0700 |
---|---|---|
committer | Robert Griesemer <gri@golang.org> | 2022-04-07 17:19:55 +0000 |
commit | c0bbeb0982403db17bacb1533776fb638cb449ae (patch) | |
tree | cc1734f83baf56074f35a8210a0b54c5a7857417 /test | |
parent | 063f4032f5ea8820d265ee1196ef9b8eba02c63f (diff) | |
download | go-c0bbeb0982403db17bacb1533776fb638cb449ae.tar.gz go-c0bbeb0982403db17bacb1533776fb638cb449ae.zip |
cmd/compile: adjust types2 shift check to match go/types (cleanup)
With this change, the shift checking code matches the corresponding
go/types code, but for the differences in the internal error reporting,
and call of check.overflow.
The change leads to the recording of an untyped int value if the RHS
of a non-constant shift is an untyped integer value. Adjust the type
in the compiler's irgen accordingly. Add test/shift3.go to verify
behavior.
Change-Id: I20386fcb1d5c48becffdc2203081fb70c08b282d
Reviewed-on: https://go-review.googlesource.com/c/go/+/398236
Trust: Robert Griesemer <gri@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
Trust: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
Diffstat (limited to 'test')
-rw-r--r-- | test/shift3.go | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/test/shift3.go b/test/shift3.go new file mode 100644 index 00000000000..bed2fd66ef7 --- /dev/null +++ b/test/shift3.go @@ -0,0 +1,41 @@ +// run + +// Copyright 2022 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. + +// Test that the compiler's noder uses the correct type +// for RHS shift operands that are untyped. Must compile; +// run for good measure. + +package main + +import ( + "fmt" + "math" +) + +func f(x, y int) { + if x != y { + panic(fmt.Sprintf("%d != %d", x, y)) + } +} + +func main() { + var x int = 1 + f(x<<1, 2) + f(x<<1., 2) + f(x<<(1+0i), 2) + f(x<<0i, 1) + + f(x<<(1<<x), 4) + f(x<<(1.<<x), 4) + f(x<<((1+0i)<<x), 4) + f(x<<(0i<<x), 1) + + // corner cases + const M = math.MaxUint + f(x<<(M+0), 0) // shift by untyped int representable as uint + f(x<<(M+0.), 0) // shift by untyped float representable as uint + f(x<<(M+0.+0i), 0) // shift by untyped complex representable as uint +} |