+
+isBangHsBind :: HsBind id -> Bool
+-- In this module because HsPat is above HsBinds in the import graph
+isBangHsBind (PatBind { pat_lhs = L _ (BangPat p) }) = True
+isBangHsBind bind = False
+
+isIrrefutableHsPat :: LPat id -> Bool
+-- This function returns False if it's in doubt; specifically
+-- on a ConPatIn it doesn't know the size of the constructor family
+-- But if it returns True, the pattern is definitely irrefutable
+isIrrefutableHsPat pat
+ = go pat
+ where
+ go (L _ pat) = go1 pat
+
+ go1 (WildPat _) = True
+ go1 (VarPat _) = True
+ go1 (VarPatOut _ _) = True
+ go1 (LazyPat pat) = True
+ go1 (BangPat pat) = go pat
+ go1 (ParPat pat) = go pat
+ go1 (AsPat _ pat) = go pat
+ go1 (SigPatIn pat _) = go pat
+ go1 (SigPatOut pat _) = go pat
+ go1 (TuplePat pats _ _) = all go pats
+ go1 (ListPat pats _) = False
+ go1 (PArrPat pats _) = False -- ?
+
+ go1 (ConPatIn _ _) = False -- Conservative
+ go1 (ConPatOut (L _ con) _ _ _ details _)
+ = isProductTyCon (dataConTyCon con)
+ && all go (hsConArgs details)
+
+ go1 (LitPat _) = False
+ go1 (NPat _ _ _ _) = False
+ go1 (NPlusKPat _ _ _ _) = False
+
+ go1 (TypePat _) = panic "isIrrefutableHsPat: type pattern"
+ go1 (DictPat _ _) = panic "isIrrefutableHsPat: type pattern"