throwIO gets subsumed by a later imprecise exception
The code below exits with exception "Boom" when compiled with no options (the expected behavior, since throwIO should always subsume exceptions that come later in the IO monad), but with a head-of-empty-list exception when compiled with -O. Similar code has shown this problem on 7.2 and 7.4.
{-# LANGUAGE DeriveDataTypeable #-}
import Control.Exception (throwIO, Exception)
import Control.Monad (when)
import Data.Typeable (Typeable)
data Boom = Boom deriving (Show, Typeable)
instance Exception Boom
main = do
args <- return []
-- Should throw this exception.
when (length args /= 1) (throwIO Boom)
-- With -O, instead throws this one from head [].
let n = read (head args)
when (n < 0) (throwIO Boom)
return (fromInteger n :: Int)
Trac metadata
Trac field | Value |
---|---|
Version | 7.6.1 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |