bug in default implementation of popCount
base 4.5.0.0 (http://hackage.haskell.org/packages/archive/base/4.5.0.0/doc/html/src/Data-Bits.html#popCount) gives the default implementation of popCount of the Bits class like this:
popCount :: a -> Int
popCount = go 0
where
go !c 0 = c
go c w = go (c+1) (w .&. w - 1)
Alas, .&. binds more tightly than -, thus the last expression parses as ((w .&. w) - 1) not as (w .&. (w-1)), as it was intended.
At the least, this causes popCount :: Integer -> Int to behave erratically:
Prelude Data.Bits> map popCount [2::Integer .. 4]
[2, 3, 4]
Trac metadata
| Trac field | Value |
|---|---|
| Version | 7.4.1 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | libraries/base |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |