[GHC] #11316: Too many guards warning causes issues
GHC
ghc-devs at haskell.org
Wed Dec 30 11:07:52 UTC 2015
#11316: Too many guards warning causes issues
-------------------------------------+-------------------------------------
Reporter: NeilMitchell | Owner:
Type: bug | Status: new
Priority: high | Milestone: 8.0.1
Component: Compiler | Version: 7.11
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: |
-------------------------------------+-------------------------------------
Changes (by bgamari):
* priority: normal => high
* cc: gkaracha (added)
* milestone: => 8.0.1
Comment:
> 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.
Indeed I'm quite uncertain of the right way forward here as all options
are quite bad,
On one hand, remaining silent in this case means that the user may rely on
the compiler's pattern checker when it can't be relied upon. In passing
`-Wall` to GHC, the user has requested that we provide warnings on non-
exhaustive patterns. If we can't deliver on this promise it seems to me
that we have a duty to ensure that the user knows this. To remain silent
will mean that users may be taken by surprise when their warning-free code
nevertheless crashes. For this reason I think it is quite important that a
warning of this sort is available (although perhaps not enabled by
default).
Of course, this is made slightly trickier by the fact that pattern match
checking is a hard problem and therefore will always be approximate.
Moreover, before George's work we couldn't reason about guards at all.
Further, even now the check necessarily breaks down completely in the face
of boolean guards.
Moreover, I am sympathetic to the complaint that it is too difficult to
disable this warning in the presence of multiple compiler versions.
== A pragma? ==
Our current approach to this issue, the `-Wtoo-many-guards` warning, has
always been a bit of a compromise. For one, it is far too coarse-grained.
In an ideal world, I would say that this flag ought to be a pragma
attached to a particular binding, which would solve several problems,
* someone reading or modifying the binding will be faced with a reminder
that they cannot count on full pattern checking
* one doesn't need to completely give up on full pattern checking in a
module on account of a single large binding
Unfortunately the fact that unknown pragmas are errors with `-Werror`
makes this option just as inconvenient as the current flag.
== A Proposal ==
Given the fact that guard checking is merely nice to have and will always
be approximate, I tend to think we should just disable this warning by
default.
Hopefully for 8.2 we will have a
[[https://ghc.haskell.org/trac/ghc/wiki/Design/Warnings#ProposedChange|richer
scheme]] for managing warnings, at which point we can add `-Wtoo-many-
warnings` to `-Weverything`. In the meantime, we'll just need to ensure
that the user's guide makes it known that the user must enable this flag
if they want to be notified when the pattern checker gives up.
George, what do you think?
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11316#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list