
#16314: Improve confusing error message with MINIMAL pragma -------------------------------------+------------------------------------- Reporter: lerkok | Owner: (none) Type: feature request | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.6.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 lerkok): Here's a modest proposal to handle this case. The user guide says the syntax for `MINIMAL` is: {{{#!hs mindef ::= name | '(' mindef ')' | mindef '|' mindef | mindef ',' mindef }}} Strictly speaking the above is actually incorrect because it doesn't capture the fact that you can simply write `{-# MINIMAL #-}`, i.e., no methods listed at all, but that obviously would correspond to the empty set. Abusing the notation in the obvious way, define the following function from a `MINIMAL` expression to a set of names: {{{#!hs required empty_decls = Set.empty -- the missing case in the grammar required name = Set.singleton name required ('(' expr ')') = required expr required (left '|' right) = required left `Set.intersection` required right required (left ',' right) = required left `Set.union` required right }}} For each class declaration with a `MINIMAL` pragma, compute: {{{#!hs D = set of all methods with default definitions R = the required set, as defined above E = D `Set.difference` R }}} If `E` is ''not'' empty, then GHC should emit a warning saying the methods in `E` are required by the `MINIMAL` pragma but also are given a default definition. If `E` is empty, no warning is generated. I don't think we want to put definitions given with the "default signatures" extension into the set `D`; because they can be arguably considered as missing for the general case. But perhaps including them in `D` can be even a stricter check. I'd vote to leave them out to avoid false positives. This sounds simple enough to be worth an explicit GHC proposal, but I'm happy to create one if you deem it's worth it. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/16314#comment:6 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler