Fix #15450 by refactoring checkEmptyCase'
authorRyan Scott <ryan.gl.scott@gmail.com>
Wed, 1 Aug 2018 18:26:44 +0000 (14:26 -0400)
committerBen Gamari <ben@smart-cactus.org>
Wed, 1 Aug 2018 23:38:48 +0000 (19:38 -0400)
commit7f3cb50dd311caefb536d582f1e3d1b33d6650f6
treee13646cbe101422eeef935d717a143c915da9c77
parentb803c40608119469bdda330cb88860be2cbed25b
Fix #15450 by refactoring checkEmptyCase'

`checkEmptyCase'` (the code path for coverage-checking
`EmptyCase` expressions) had a fair bit of code duplication from the
code path for coverage-checking non-`EmptyCase` expressions, and to
make things worse, it behaved subtly different in some respects (for
instance, emitting different warnings under unsatisfiable
constraints, as shown in #15450). This patch attempts to clean up
both this discrepancy and the code duplication by doing the
following:

* Factor out a `pmInitialTmTyCs` function, which returns the initial
  set of term and type constraints to use when beginning coverage
  checking. If either set of constraints is unsatisfiable, we use an
  empty set in its place so that we can continue to emit as many
  warnings as possible. (The code path for non-`EmptyCase`
  expressions was doing this already, but not the code path for
  `EmptyCase` expressions, which is the root cause of #15450.)

  Along the way, I added a `Note` to explain why we do this.
* Factor out a `pmIsSatisfiable` constraint which checks if a set of
  term and type constraints are satisfiable. This does not change any
  existing behavior; this is just for the sake of deduplicating code.

Test Plan: make test TEST=T15450

Reviewers: simonpj, bgamari

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #15450

Differential Revision: https://phabricator.haskell.org/D5017
compiler/deSugar/Check.hs
testsuite/tests/pmcheck/should_compile/T15450.hs [new file with mode: 0644]
testsuite/tests/pmcheck/should_compile/T15450.stderr [new file with mode: 0644]
testsuite/tests/pmcheck/should_compile/all.T