Override default `clearBit` method impl for `Natural`
authorHerbert Valerio Riedel <hvr@gnu.org>
Mon, 16 Oct 2017 20:12:03 +0000 (22:12 +0200)
committerHerbert Valerio Riedel <hvr@gnu.org>
Mon, 16 Oct 2017 20:18:52 +0000 (22:18 +0200)
The default implementation of `clearBit` is in terms of
`complement`. However, `complement` is not well-defined
for `Natural` and this consequently renders the default
implementation of `clearBit` dysfunctional.

This implements `clearBit` in terms of `testBit`
and `setBit` which are both well-defined for `Natural`s.

This addresses #13203

libraries/base/GHC/Natural.hs

index 99cfb8f..edffb10 100644 (file)
@@ -345,6 +345,11 @@ instance Bits Natural where
 
     -- TODO: setBit, clearBit, complementBit (needs more primitives)
 
+    -- NB: We cannot use the default impl of 'clearBit' due to
+    -- 'complement' not being well-defined for 'Natural' (c.f. #13203)
+    clearBit x i | testBit x i = complementBit x i
+                 | otherwise   = x
+
     shiftL n           0 = n
     shiftL (NatS# 0##) _ = NatS# 0##
     shiftL (NatS# 1##) i = bit i