
#11379: Solver hits iteration limit in code without recursive constraints -------------------------------------+------------------------------------- Reporter: bgamari | Owner: simonpj Type: bug | Status: closed Priority: highest | Milestone: 8.0.1 Component: Compiler (Type | Version: 8.0.1-rc1 checker) | Resolution: fixed | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Compile-time | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by NeilMitchell): * cc: ndmitchell (added) Comment: For info, I found a similar bug while trying Shake with GHC 8.0-rc1 provided by hvr (8.0.0.20160111+git.0.497454f). Chopping out the relevant bit leaves: {{{#!hs -- optIntArg :: (Ord a0, Read a0, Show a0) => a0 -> [Char] -> t0 -> (Maybe a0 -> t2) -> Maybe String -> Either [Char] ([t1], t2) optIntArg mn flag a f = maybe (Right ([], f Nothing)) $ \x -> case reads x of [(i,"")] | i >= mn -> Right ([],f $ Just i) _ -> Left $ "the `--" ++ flag ++ "' option requires a number, " ++ show mn ++ " or above" }}} Uncommenting the type signature makes it work. Without, it fails with: {{{ solveWanteds: too many iterations (limit = 4) Unsolved: WC {wc_simple = [D] _ :: Eq a (CDictCan) [D] _ :: Ord a (CDictCan) [D] _ :: Read a (CDictCan) [D] _ :: Show a (CDictCan) [W] hole{a5xW} :: a ~ a (CNonCanonical) [D] _ :: Eq a (CDictCan)} New superclasses found Set limit with -fconstraint-solver-iterations=n; n=0 for no limit] }}} Given the size of the code fragment that triggers it, and the fact a number of bugs were found, this might be another useful test case. Tweaking to give: {{{#!hs optIntArg mn flag a f = maybe (Right ([], f Nothing)) $ \x -> case reads x of [(i,"")] | i == mn -> Right ([],f $ Just i) _ -> Left $ "the `--" ++ flag ++ "' option requires a number, or above" }}} I end up with a very different error: {{{ src\Demo.hs:5:41: error: * Couldn't match type `a' with `a1' because type variable `a1' would escape its scope This (rigid, skolem) type variable is bound by a type expected by the context: Maybe a1 at src\Demo.hs:5:37-46 Expected type: Maybe a1 Actual type: Maybe a }}} This code compiles fine with GHC 7.10, so seems like a different bug, or different manifestation of the same bug. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11379#comment:9 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler