
#7842: Incorrect checking of let-bindings in recursive do --------------------------------------+------------------------------------- Reporter: diatchki | Owner: Type: bug | Status: new Priority: normal | Component: Compiler (Type checker) Version: 7.7 | Keywords: Os: Unknown/Multiple | Architecture: Unknown/Multiple Failure: GHC rejects valid program | Blockedby: Blocking: | Related: --------------------------------------+------------------------------------- Comment(by parcs): Another test case: {{{ bug :: IO (Char,Bool) bug = mdo a <- return b let f = id b <- return a return (f 'a', f True) }}} which gets renamed to: {{{ finish rnSrc bug :: IO (Char, Bool) bug = mdo { rec { a <- return b; let f = id; -- 'f' can be placed outside the recursive block b <- return a }; return (f 'a', f True) } }}} Possible solution: At the moment, all statements are kept in order during segment glomming (`RnExpr.glomSegments`) but that seems overly restrictive. Let-statements inside an `mdo` block should be able to get rearranged during segment glomming so that they can possibly be placed outside a recursive segment. -- Ticket URL: http://hackage.haskell.org/trac/ghc/ticket/7842#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler