Add a missing case to Lint's understanding of empty cases
authorSimon Peyton Jones <simonpj@microsoft.com>
Fri, 22 Nov 2013 15:03:15 +0000 (15:03 +0000)
committerSimon Peyton Jones <simonpj@microsoft.com>
Fri, 22 Nov 2013 18:57:08 +0000 (18:57 +0000)
   case x:Int# of {}

is OK

compiler/coreSyn/CoreLint.lhs

index 2b76a4a..f38a69a 100644 (file)
@@ -550,8 +550,17 @@ checkCaseAlts :: CoreExpr -> OutType -> [CoreAlt] -> LintM ()
 checkCaseAlts e ty alts = 
   do { checkL (all non_deflt con_alts) (mkNonDefltMsg e)
      ; checkL (increasing_tag con_alts) (mkNonIncreasingAltsMsg e)
-     ; checkL (isJust maybe_deflt || not is_infinite_ty)
-          (nonExhaustiveAltsMsg e) }
+
+          -- For types Int#, Word# with an infinite (well, large!) number of
+          -- possible values, there should usually be a DEFAULT case
+          -- But (see Note [Empty case alternatives] in CoreSyn) it's ok to
+          -- have *no* case alternatives.
+          -- In effect, this is a kind of partial test. I suppose it's possible
+          -- that we might *know* that 'x' was 1 or 2, in which case
+          --   case x of { 1 -> e1; 2 -> e2 }
+          -- would be fine.   
+     ; checkL (isJust maybe_deflt || not is_infinite_ty || null alts)
+              (nonExhaustiveAltsMsg e) }
   where
     (con_alts, maybe_deflt) = findDefault alts