Skip to content

Too many guards warning causes issues

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:

    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.

Trac metadata
Trac field Value
Version 7.11
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information