mirror of https://github.com/golang/go.git
cmd/vet: allow large shifts of constants
Large shifts of constants are frequently used for fancy 32/64 bit detection. This removes 14 false positives from the standard library. Updates #11041 Change-Id: Ib39346e5c161da04c38a6a3067932ef43bf74f2d Reviewed-on: https://go-review.googlesource.com/27155 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
parent
4e79c152b1
commit
794442375d
|
|
@ -41,6 +41,12 @@ func checkShift(f *File, node ast.Node) {
|
|||
// checkLongShift checks if shift or shift-assign operations shift by more than
|
||||
// the length of the underlying variable.
|
||||
func checkLongShift(f *File, node ast.Node, x, y ast.Expr) {
|
||||
if f.pkg.types[x].Value != nil {
|
||||
// Ignore shifts of constants.
|
||||
// These are frequently used for bit-twiddling tricks
|
||||
// like ^uint(0) >> 63 for 32/64 bit detection and compatibility.
|
||||
return
|
||||
}
|
||||
v := f.pkg.types[y].Value
|
||||
if v == nil {
|
||||
return
|
||||
|
|
|
|||
|
|
@ -75,4 +75,6 @@ func ShiftTest() {
|
|||
_ = p >> 32 // ERROR "p might be too small for shift of 32"
|
||||
p <<= 32 // ERROR "p might be too small for shift of 32"
|
||||
p >>= 32 // ERROR "p might be too small for shift of 32"
|
||||
|
||||
const oneIf64Bit = ^uint(0) >> 63 // allow large shifts of constants; they are used for 32/64 bit compatibility tricks
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue