Address #11245: Ensure the non-matched list is always non-empty
authorGeorge Karachalias <george.karachalias@gmail.com>
Wed, 30 Dec 2015 15:09:29 +0000 (16:09 +0100)
committerBen Gamari <ben@smart-cactus.org>
Wed, 30 Dec 2015 18:35:20 +0000 (19:35 +0100)
When there is an uncovered vector of length 0 (which in turn means that
it represents a guard failure) print "(incomplete guards)" instead of an
empty list of non-covered vectors.

Test Plan: validate

Reviewers: austin, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D1717

GHC Trac Issues: #11245

compiler/deSugar/Check.hs

index 78a8eaa..fd0c6e0 100644 (file)
@@ -1420,9 +1420,11 @@ dsPmWarn dflags ctx@(DsMatchContext kind loc) mPmResult
       vcat (map (ppr_eqn f kind) (take maximum_output qs)) $$ dots qs
 
     pprEqnsU qs = pp_context ctx (ptext (sLit "are non-exhaustive")) $ \_ ->
-      let us = map ppr_uncovered qs
-      in  hang (ptext (sLit "Patterns not matched:")) 4
-               (vcat (take maximum_output us) $$ dots us)
+      case qs of -- See #11245
+           [([],_)] -> ptext (sLit "Guards do not cover entire pattern space")
+           _missing -> let us = map ppr_uncovered qs
+                       in  hang (ptext (sLit "Patterns not matched:")) 4
+                                (vcat (take maximum_output us) $$ dots us)
 
 dots :: [a] -> SDoc
 dots qs | qs `lengthExceeds` maximum_output = ptext (sLit "...")