
#11316: Too many guards warning causes issues -------------------------------------+------------------------------------- Reporter: NeilMitchell | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.11 Keywords: | Operating System: Unknown/Multiple Architecture: | Type of failure: None/Unknown Unknown/Multiple | Test Case: | Blocked By: Blocking: | Related Tickets: Differential Rev(s): | Wiki Page: -------------------------------------+------------------------------------- GHC HEAD warns if you have too many guards, for example: {{{ src/HSE/Bracket.hs:44:5: warning: Too many guards in an equation for ‘needBracket’ Guard checking has been over-simplified (Use: -Wno-too-many-guards to suppress this warning -ffull-guard-reasoning to run the full checker (may increase compilation time and memory consumption)) }}} The code in question is from https://github.com/ndmitchell/hlint/blob/master/src/HSE/Bracket.hs#L44 and reads: {{{#!hs needBracket i parent child | isAtom child = False | InfixApp{} <- parent, App{} <- child = False | isSection parent, App{} <- child = False | Let{} <- parent, App{} <- child = False | ListComp{} <- parent = False | List{} <- parent = False | Tuple{} <- parent = False | If{} <- parent, isAnyApp child = False | App{} <- parent, i == 0, App{} <- child = False | ExpTypeSig{} <- parent, i == 0, isApp child = False | Paren{} <- parent = False | isDotApp parent, isDotApp child, i == 1 = False | RecConstr{} <- parent = False | RecUpdate{} <- parent, i /= 0 = False | Case{} <- parent, i /= 0 || isAnyApp child = False | Lambda{} <- parent, i == length (universeBi parent :: [Pat_]) - 1 = False -- watch out for PViewPat | Do{} <- parent = False | otherwise = True }}} For code that runs with the default flags, and likes to have zero warnings (or warnings as errors), and compile with multiple GHC versions, that is problematic. How can I suppress this warning? * Adding {{{-Wno-too-many-guards}}} will only work with GHC 8, so I need to either use CPP to version select my warning suppression, or conditionality outside the compiler select the flags. * Or I can give up on detecting warnings as errors, which is a bit sad, as it's generally a useful criteria. * Or I can modify my code to make it harder to read in order to satisfy a checker whose semantics might change in future. * Or GHC could not warn on too many guards, because it's really a warning that the compiler can't cope, not that too many guards is necessarily bad. I suggest the last option, because warnings should generally be about code issues, not compiler issues. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11316 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler