
#11475: Lint should check for inexhaustive alternatives -------------------------------------+------------------------------------- Reporter: simonpj | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.10.3 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by jscholl): Using the {{{CRPResult}}} did indeed help, I can now compile a few more modules. However, the next false positive is a little bit more complicated as there is no evidence I could use attached to it as far as I can tell. Suppose there is an expression {{{ foo x = case x of A -> ... B -> ... y -> error $ "foo" ++ (case y of C -> "C" D -> "D") }}} This is fine and works as expected. But now GHC decides to float out the expression, yielding: {{{ lvl y = error $ "foo" ++ (case y of C -> "C" D -> "D") foo x = case x of A -> ... B -> ... y -> lvl y }}} I don't see where GHC would record that {{{y}}} can only match {{{C}}} and {{{D}}}. I think it doesn't do it anywhere, most likely because no one needed that information until today. A possible solution might be to look for unexported local functions which are non-exhaustive and record the set of allowed constructors for their arguments. All calls to such a function would then be required to only included the correct possible constructors. Or is there a better way? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11475#comment:5 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler