Commit 182c44da authored by Ben Gamari's avatar Ben Gamari Committed by Ben Gamari

Keep `shift{L,R}` on `Integer` from segfaulting

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
parent 5d841108
......@@ -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
......
......@@ -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
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment