-unfailablePats :: [OutPat a b c] -> Bool
-unfailablePats pat_list = all unfailablePat pat_list
-
-unfailablePat (AsPat _ pat) = unfailablePat pat
-unfailablePat (WildPat _) = True
-unfailablePat (VarPat _) = True
-unfailablePat (LazyPat _) = True
-unfailablePat (DictPat ds ms) = (length ds + length ms) <= 1
-unfailablePat other = False
+irrefutablePats :: [OutPat a b c] -> Bool
+irrefutablePats pat_list = all irrefutablePat pat_list
+
+irrefutablePat (AsPat _ pat) = irrefutablePat pat
+irrefutablePat (WildPat _) = True
+irrefutablePat (VarPat _) = True
+irrefutablePat (LazyPat _) = True
+irrefutablePat (DictPat ds ms) = (length ds + length ms) <= 1
+irrefutablePat other = False
+
+failureFreePat :: OutPat a b c -> Bool
+
+failureFreePat (WildPat _) = True
+failureFreePat (VarPat _) = True
+failureFreePat (LazyPat _) = True
+failureFreePat (AsPat _ pat) = failureFreePat pat
+failureFreePat (ConPat con tys pats) = only_con con && all failureFreePat pats
+failureFreePat (ConOpPat pat1 con pat2 _) = only_con con && failureFreePat pat1 && failureFreePat pat1
+failureFreePat (RecPat con _ fields) = only_con con && and [ failureFreePat pat | (_,pat,_) <- fields ]
+failureFreePat (ListPat _ _) = False
+failureFreePat (TuplePat pats) = all failureFreePat pats
+failureFreePat (DictPat _ _) = True
+failureFreePat other_pat = False -- Literals, NPat
+
+only_con con = maybeToBool (maybeTyConSingleCon (dataConTyCon con))
+\end{code}