
#14521: Infinite loop at runtime -------------------------------------+------------------------------------- Reporter: OlivierSohn | Owner: (none) Type: bug | Status: closed Priority: high | Milestone: 8.2.3 Component: Compiler | Version: 8.2.2 Resolution: invalid | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Incorrect result | Unknown/Multiple at runtime | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by bgamari): * status: new => closed * resolution: => invalid Comment: So I'm not certain why the program runs successfully without optimization, but it seems to me like the compiler indeed loop. The gist of the program (eliminating some irrelevant bits) is {{{#!hs data Animator a = Animator { _animatorIO :: !(Tree -> Animation -> IO (Maybe Animation)) } mkAnimator :: (t -> Tree -> Animation -> IO (Maybe Animation)) -> t -> Animator a mkAnimator io_ params = Animator (io_ params) animatedNumber :: Int -> Tree -> Animation -> IO (Maybe Animation) animatedNumber n = animate' (mkAnimator animatedNumber n) }}} After inlining `mkAnimator` into `animatedNumber` and expressing the constructor's strictness explicitly we have, {{{#!hs animatedNumber :: Int -> Tree -> Animation -> IO (Maybe Animation) animatedNumber n = animate' (let x = animatedNumber n in x `seq` Animator x) }}} Consequently if `animate'` demands its argument the program will loop. This function is defined as, {{{#!hs animate' :: Animator a -> Tree -> Animation -> IO (Maybe Animation) animate' (Animator pure_ io_) = animate pure_ io_ }}} Which indeed does demand its argument. Moreover, this is consistent with your observation that adding an `INLINE` on `animate'` eliminates the loop (since in the real program `Animator` contains two fields, only the first, which I elided above, is needed). Given this, it seems like looping is a completely valid compilation of this program. I would remove the bang from the constructor if laziness is needed (which it seems it is). -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14521#comment:20 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler