Keep `shift{L,R}` on `Integer` from segfaulting
authorBen Gamari <bgamari.foss@gmail.com>
Sat, 10 Oct 2015 12:32:28 +0000 (14:32 +0200)
committerBen Gamari <ben@smart-cactus.org>
Sat, 10 Oct 2015 13:41:05 +0000 (15:41 +0200)
This can happen because the underlying primitive operations in
`integer-gmp` don't support negative shift-amounts, and since
`integer-gmp` can't throw proper exceptions and just provides a
low-level API, it simply segfaults instead...

This patch simply removes the `shift{L,R}` method definitions (and
defines `unsafeShift{L,R}` instead) whose default-impls fallback on
using `shift` which properly handles negative shift arguments.

This addresses #10571

Test Plan: harbormaster can do it

Reviewers: hvr, austin, rwbarton

Subscribers: rwbarton, thomie, bgamari

Differential Revision: https://phabricator.haskell.org/D1018

GHC Trac Issues: #10571

libraries/base/Data/Bits.hs
libraries/base/changelog.md

index 38025f8..9134e13 100644 (file)
@@ -515,15 +515,7 @@ 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# 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
-
    zeroBits   = 0
 
 #if HAVE_INTEGER_GMP1
index 4874808..7c4bf77 100644 (file)
@@ -66,6 +66,9 @@
     `GHC.Generics` as part of making GHC generics capable of handling
     unlifted types (#10868)
 
+  * Keep `shift{L,R}` on `Integer` with negative shift-arguments from
+       segfaulting (#10571)
+
 ## 4.8.1.0  *Jul 2015*
 
   * Bundled with GHC 7.10.2