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 |