Ensure shiftL/shiftR arguments aren't negative
authorBen Gamari <ben@smart-cactus.org>
Tue, 6 Oct 2015 17:30:50 +0000 (19:30 +0200)
committerBen Gamari <ben@smart-cactus.org>
Wed, 7 Oct 2015 06:49:22 +0000 (08:49 +0200)
Fixes #10571.

libraries/base/Data/Bits.hs

index 84b1c03..38025f8 100644 (file)
@@ -515,8 +515,12 @@ instance Bits Integer where
    complement = complementInteger
    shift x i@(I# i#) | i >= 0    = shiftLInteger x i#
                      | otherwise = shiftRInteger x (negateInt# i#)
-   shiftL x (I# i#) = shiftLInteger x i#
-   shiftR x (I# i#) = shiftRInteger x i#
+   shiftL x i@(I# i#)
+     | i < 0        = error "Bits.shiftL(Integer): negative shift"
+     | otherwise    = shiftLInteger x i#
+   shiftR x i@(I# i#)
+     | i < 0        = error "Bits.shiftR(Integer): negative shift"
+     | otherwise    = shiftRInteger x i#
 
    testBit x (I# i) = testBitInteger x i