From 794442375d87e57d012bab2d7424575f6cdff018 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Mon, 18 Jul 2016 17:05:54 -0700 Subject: [PATCH] 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 Reviewed-by: Robert Griesemer --- src/cmd/vet/shift.go | 6 ++++++ src/cmd/vet/testdata/shift.go | 2 ++ 2 files changed, 8 insertions(+) diff --git a/src/cmd/vet/shift.go b/src/cmd/vet/shift.go index 8c038b4bdd..55f3ea369f 100644 --- a/src/cmd/vet/shift.go +++ b/src/cmd/vet/shift.go @@ -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 diff --git a/src/cmd/vet/testdata/shift.go b/src/cmd/vet/testdata/shift.go index 6624f09cc1..99acaadf6d 100644 --- a/src/cmd/vet/testdata/shift.go +++ b/src/cmd/vet/testdata/shift.go @@ -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 } -- 2.48.1