[GHC] #7411: Exceptions are optimized away in certain situations
GHC
ghc-devs at haskell.org
Mon May 7 14:45:01 UTC 2018
#7411: Exceptions are optimized away in certain situations
-------------------------------------+-------------------------------------
Reporter: SimonHengel | Owner: tdammers
Type: bug | Status: new
Priority: high | Milestone: 8.6.1
Component: Compiler | Version: 7.6.1
Resolution: | Keywords: seq, deepseq,
| evaluate, exceptions
Operating System: Linux | Architecture: x86_64
| (amd64)
Type of failure: Incorrect result | Test Case:
at runtime | simplCore/should_fail/T7411
Blocked By: | Blocking:
Related Tickets: #5129 | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by tdammers):
OK, boiled it down to a simpler test case that doesn't even involve
`deepseq`:
{{{
import Control.Exception
dslist :: [a] -> b -> b
dslist xs b = go xs `seq` b
where
go [] = ()
go (x:xs) = x `seq` go xs
-- the following variation also reproduces the problem:
-- go (x:xs) = go (x `seq` xs)
main = evaluate (('a':undefined) `dslist` return () :: IO ())
}}}
This is essentially what `deepseq` does on lists, with all the typeclass
instances and type variables manually unrolled.
Note that in order to trigger the bug, we actually do need the `go`
function; if instead we pass the `b` around and recurse directly, the
problem goes away, like so:
{{{
import Control.Exception
dslist :: [a] -> b -> b
dslist xs b = go xs `seq` b
where
dslist [] a = a
dslist (x:xs) a = x `seq` dslist xs a
main = evaluate (('a':undefined) `dslist` return () :: IO ())
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/7411#comment:22>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list