mirror of
https://github.com/golang/go
synced 2024-11-25 15:47:56 -07:00
f44404ebbf
For int8, int16, and int32, comparing their unsigned value to MaxInt64 to determine non-negativity doesn't make sense, because they have negative values whose unsigned representation is smaller than that. Fix is simply to compare with the appropriate upper bound based on the value type's size. Fixes #32560. Change-Id: Ie7afad7a56af92bd890ba5ff33c86d1df06cfd9a Reviewed-on: https://go-review.googlesource.com/c/go/+/181797 Run-TryBot: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: David Chase <drchase@google.com> Reviewed-by: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
52 lines
690 B
Go
52 lines
690 B
Go
// run
|
|
|
|
// Copyright 2019 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.
|
|
|
|
// Values smaller than 64-bits were mistakenly always proven to be
|
|
// non-negative.
|
|
//
|
|
// The tests here are marked go:noinline to ensure they're
|
|
// independently optimized by SSA.
|
|
|
|
package main
|
|
|
|
var x int32 = -1
|
|
|
|
//go:noinline
|
|
func a() {
|
|
if x != -1 {
|
|
panic(1)
|
|
}
|
|
if x > 0 || x != -1 {
|
|
panic(2)
|
|
}
|
|
}
|
|
|
|
//go:noinline
|
|
func b() {
|
|
if x != -1 {
|
|
panic(3)
|
|
}
|
|
if x > 0 {
|
|
panic(4)
|
|
}
|
|
}
|
|
|
|
//go:noinline
|
|
func c() {
|
|
if x > 0 || x != -1 {
|
|
panic(5)
|
|
}
|
|
if x > 0 || x != -1 {
|
|
panic(6)
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
a()
|
|
b()
|
|
c()
|
|
}
|