unsafeCoerce leaks types
Forgive the cryptic summary, here's the code:
import Unsafe.Coerce
import Foreign
import Data.Bits
foo = (unsafeCoerce (0.50094324::Float))::Int32
bar = (unsafeCoerce (0.30295494::Float))::Int32
main = print (foo, foo .&. 0xffffffff)
>> print (bar, bar .&. 0xffffffff)
giving the output
% runhaskell bug.hs
(1056980433,1056980433)
(140502315506921,140502315506921)
*Main> :t bar
bar :: Int32
*Main> bar
140549560147177
where the too-big number changes from run to run, presumably because it has a different type-tag on each invocation. It does seem to include the correct data in the low 32 bits, though.
I couldn't replicate this with compiled code, but both GHCi and TH exhibit this behaviour.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 6.12.1 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Template Haskell |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | barsoap@web.de |
| Operating system | |
| Architecture |