CoreLint check for case with no alts

Ömer Sinan Ağacan omeragacan at
Mon Feb 29 03:16:09 UTC 2016

Hi all,

CoreLint has a check that, when seeing a case expression with empty list of
alternatives, checks whether the scrutinee is bottom. This "bottom-ness" check
is, however, very simple and returning many false negatives. For example, when
it sees a case expression, all it does is:

    go _ (Case _ _ _ alts)       = null alts

Which is just too simple for some cases. (it could check if all the RHSs are
bottom, or if the scrutinee is bottom etc.)

I guess this makes sense, since it's OK to generate unreachable code, but it's
not OK to not generate a code in a reachable path.

But in my case this is becoming problem as it's rejecting my seemingly
valid program. One of the relevant parts in my code is this:

    case ww_s4C3 of ww_X4Fb {
      (#_||#) ww_s4Ce ->
        case case ww_s4Ce of ww_s4F1 { (# ww_s4F2, ww_s4F3 #) ->
             lvl_s4F4 ww_s4F3 ww_s4F2
        of wild_00 {
          -- empty

    lvl_s4F4 :: Int# -> String -> Var
    [LclId, Arity=2, Str=DmdType (args: <L,U><L,U>) (res: x)]
    lvl_s4F4 =
      \ (ww_s4F3 :: Int#) (ww_s4F2 :: String) ->
        lvl_s3V4 (TyVar ww_s4F2 ww_s4F3)

    lvl_s3V4 :: Var -> Var
    [LclId, Arity=1, CallArity=1, Str=DmdType (args: <B,1*H>) (res: x)]
    lvl_s3V4 = \ (i_a1vO :: Var) -> lvl_s4EZ i_a1vO

    lvl_s4EZ :: Var -> Var
    [LclId, Arity=1, Str=DmdType (args: <L,U>) (res: x)]
    lvl_s4EZ = \ (i_a1vO :: Var) -> error ...

The scrutinee part of the case expression in the alternative is clearly bottom,
but this expression is rejected by the linter.

One easy solution is to implement a more precise test and use it in linter. But
I thought maybe the current implementation is deliberately so. Maybe the code
generator doesn't support that type of code etc. so I wanted to ask: Is there a
restriction on what kind empty case expressions are supported by the code
generator or can I just improve the lint check and assume that the code will be
handled by the code generator correctly?


More information about the ghc-devs mailing list