[GHC] #15450: Inconsistency w.r.t. coverage checking warnings for EmptyCase under unsatisfiable constraints

GHC ghc-devs at haskell.org
Mon Jul 30 10:58:54 UTC 2018


#15450: Inconsistency w.r.t. coverage checking warnings for EmptyCase under
unsatisfiable constraints
-------------------------------------+-------------------------------------
        Reporter:  RyanGlScott       |                Owner:  (none)
            Type:  bug               |               Status:  patch
        Priority:  normal            |            Milestone:  8.6.1
       Component:  Compiler          |              Version:  8.4.3
      Resolution:                    |             Keywords:
                                     |  PatternMatchWarnings
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Poor/confusing    |  Unknown/Multiple
  error message                      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  #12957            |  Differential Rev(s):  Phab:D5017
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Changes (by RyanGlScott):

 * cc: mpickering (added)


Comment:

 Replying to [comment:2 simonpj]:
 > (Commenting here because my reflections concern the specification, not
 the coding.)
 >
 > The patch says
 > {{{
 > We decide to better than this. When beginning coverage checking, we
 first
 > check if the constraints in scope are unsatisfiable, and if so, we start
 > afresh with an empty set of constraints. This way, we'll get the
 warnings
 > we expect.
 > }}}
 > That seems quite odd behaviour!   The door closes gradually, but when it
 becomes shut we slam it open again??

 This is all explained in the commentary in
 https://phabricator.haskell.org/D3064 (which I've attempted to turn into
 Note form in this patch). Also cc'ing mpickering, who established this
 convention.

 Replying to [comment:3 simonpj]:
 > Another thing.  I see in `Note [Checking EmptyCase Expressions]` (in
 `Check.hs`) this:
 > {{{
 > Empty case expressions are strict on the scrutinee. That is, `case x of
 {}`
 > will force argument `x`. Hence, `checkMatches` is not sufficient for
 checking
 > empty cases, because it assumes that the match is not strict (which is
 true
 > for all other cases, apart from EmptyCase). This gave rise to #10746.
 > }}}
 > I had no idea!  The [http://downloads.haskell.org/~ghc/master/users-
 guide/glasgow_exts.html#empty-case-alternatives user manual entry] says
 nothing about this non-uniform behaviour of empty case expressions.
 >
 > What actually stops us from treating an empty case as an ordinary case
 expression with no alternatives?  Anything else seems.. unexpected.

 I'm not sure I understand this question. Did you read #10746? That seems
 to lay out pretty clearly why `EmptyCase` needs to be treated specially
 (because it's strict, unlike other `case` expressions).

 > The explanation in the user manual is cryptic (see the text about
 `absurd`.  And it relates directly to this ticket, because it has `True ~
 False` in scope, which is a contradiction.  So maybe fixing comment:2
 would mean we could treat case expressions uniformly, which would mean we
 could delete code?

 Maybe. But I have no interest in doing this here. I only opened this
 ticket because the lack of sharing between code paths in `checkEmptyCase`
 and `checkSingle` made it difficult to implement #15305, so I did the
 exact minimum amount of work to fix the discrepancy. Anything more than
 this deserves to be in a separate feature request, in my opinion.

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15450#comment:4>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list