Advice for #11475

Jonas Scholl anselm.scholl at
Fri Feb 19 11:13:40 UTC 2016

Hello GHC-Devs,

I am currently giving #11475 a try. However I hit a few problems and
wanted to ask for a bit of advice about how to proceed.

I already can handle the following:

case x of
  A y -> e1
  _   -> ....(case x of
                B -> r2
                C -> r3) ...

My first problem then was the following construct:

case (case ... of ... -> Left x) of
  Left y -> ...

Or more simple:

case Left x of
  Left y -> ...

So I have to check which constructors the scrutinee may return. I know
the simplifier has to implement such logic somewhere but did not want to
use the implementation for two reasons:
 - I didn't know where to find it
 - If GHC uses the same test to prune impossible alternatives and to
check if they were pruned correctly, extending the linter is useless. A
bug in the test code will cause also cause a bug in the linter.

So I implemented such a test myself, but now I am stuck at something
like this:

foo a b = a : b

bar = ... case foo a b of
  (:) x y -> ...

I cannot see through foo, so I assume it may return (:) and []. The
simplifier on the other hand is able to see through foo and did remove
the [] case, causing my current implementation to throw an incorrect
lint error.

How can I get a list/set of all possible AltCons returned by a
function/constant? Or a list of the impossible ones? I tried to get some
information from the unfolding of a variable, but it seems like
unfoldings are only attached to top-level names.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: OpenPGP digital signature
URL: <>

More information about the ghc-devs mailing list