diff options
author | sheaf <sam.derbyshire@gmail.com> | 2021-08-14 03:41:03 +0200 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2021-08-15 09:00:29 -0400 |
commit | 1e896b476086e83ed6e97fb9d0ba8b96fed07783 (patch) | |
tree | 9f55f42c4630878ed94f31ffefa0f8026da8e2b6 /compiler/GHC/Tc/Solver/Monad.hs | |
parent | a975583c70e57434340d9a20c976c8f06fde9beb (diff) | |
download | haskell-1e896b476086e83ed6e97fb9d0ba8b96fed07783.tar.gz |
Detect TypeError when checking for insolubility
We detect insoluble Givens by making getInertInsols
take into account TypeError constraints, on top of insoluble equalities
such as Int ~ Bool (which it already took into account).
This allows pattern matches with insoluble contexts to be reported
as redundant (tyOracle calls tcCheckGivens which calls getInertInsols).
As a bonus, we get to remove a workaround in Data.Typeable.Internal:
we can directly use a NotApplication type family, as opposed to
needing to cook up an insoluble equality constraint.
Fixes #11503 #14141 #16377 #20180
Diffstat (limited to 'compiler/GHC/Tc/Solver/Monad.hs')
-rw-r--r-- | compiler/GHC/Tc/Solver/Monad.hs | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/compiler/GHC/Tc/Solver/Monad.hs b/compiler/GHC/Tc/Solver/Monad.hs index 5796e2bd6a..b957b0ed0c 100644 --- a/compiler/GHC/Tc/Solver/Monad.hs +++ b/compiler/GHC/Tc/Solver/Monad.hs @@ -824,10 +824,16 @@ getInnermostGivenEqLevel = do { inert <- getInertCans ; return (inert_given_eq_lvl inert) } getInertInsols :: TcS Cts --- Returns insoluble equality constraints --- specifically including Givens +-- Returns insoluble equality constraints and TypeError constraints, +-- specifically including Givens. +-- +-- Note that this function only inspects irreducible constraints; +-- a DictCan constraint such as 'Eq (TypeError msg)' is not +-- considered to be an insoluble constraint by this function. +-- +-- See Note [Pattern match warnings with insoluble Givens] in GHC.Tc.Solver. getInertInsols = do { inert <- getInertCans - ; return (filterBag insolubleEqCt (inert_irreds inert)) } + ; return $ filterBag insolubleCt (inert_irreds inert) } getInertGivens :: TcS [Ct] -- Returns the Given constraints in the inert set |