#8091: retry# lacks strictness information -------------------------------------+------------------------------------ Reporter: parcs | Owner: Type: bug | Status: patch Priority: normal | Milestone: Component: Compiler | Version: 7.6.3 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Unknown/Multiple Type of failure: None/Unknown | Difficulty: Unknown Test Case: | Blocked By: Blocking: | Related Tickets: -------------------------------------+------------------------------------ Comment (by parcs): Ah, subtle.. But in this particular example , `f` seems to be lazy in `y` even when `retry` is replaced with `throw Overflow`: its strictness signature is `<S,1*U(U)><L,1*U(U)><L,U>` either way.. (It would be incorrect, I think, to have `f` strict in `y` since that could potentially elide the side-effect-having call to `readTVar`.) I found an example of a function whose strictness does change due to this patch (courtesy of the comments for `RaiseIOOp` in primops.txt.pp): {{{ #!haskell g :: Int -> Int -> STM Int g x y | x>0 = retry | y>0 = return 1 | otherwise = return 2 }}} This function is now strict in `y`, where it originally wasn't. It looks like this change will only have strictness implications in fairly contrived functions where `retry` is used in such a way that the transaction could not possibly make any progress; and in that case behaving as if `retry` returns bottom makes a good amount of sense. -- Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8091#comment:3> GHC <http://www.haskell.org/ghc/> The Glasgow Haskell Compiler