summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <bgamari.foss@gmail.com>2015-10-10 14:32:28 +0200
committerBen Gamari <ben@smart-cactus.org>2015-10-10 15:41:05 +0200
commit182c44da50db028a432a81789048c87922bd30f4 (patch)
treeabc889e99d07c2d1d543cd2f3bb05146ae00c8ee
parent5d841108acef950fed6a5e608ac9b18e7431aa87 (diff)
downloadhaskell-182c44da50db028a432a81789048c87922bd30f4.tar.gz
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
-rw-r--r--libraries/base/Data/Bits.hs8
-rw-r--r--libraries/base/changelog.md3
2 files changed, 3 insertions, 8 deletions
diff --git a/libraries/base/Data/Bits.hs b/libraries/base/Data/Bits.hs
index 38025f877c..9134e13ba8 100644
--- a/libraries/base/Data/Bits.hs
+++ b/libraries/base/Data/Bits.hs
@@ -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
diff --git a/libraries/base/changelog.md b/libraries/base/changelog.md
index 4874808d2d..7c4bf770f4 100644
--- a/libraries/base/changelog.md
+++ b/libraries/base/changelog.md
@@ -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