Care with impossible-cons in combineIdenticalAlts
authorSimon Peyton Jones <simonpj@microsoft.com>
Thu, 18 Jun 2015 07:51:08 +0000 (08:51 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Thu, 18 Jun 2015 07:51:08 +0000 (08:51 +0100)
commit023a0ba938b69bbb89cb2ce48a07459b07783391
tree40e15e16fa74027bd870086635919639313733bb
parentb98ca17e12c7efdc906f4901f25e6263a5399be1
Care with impossible-cons in combineIdenticalAlts

This was a nasty, long-standing bug exposed in Trac #10538.
Symptoms were that we had an empty case
   case (x :: Either a) of {}
Core Lint correctly picked this bogus code up.

Here is what happened

* In SimplUtils.prepareAlts, we call
        filterAlts
  then
        combineIdenticalAlts

* We had    case x of { Left _ -> e1; Right _ -> e1 }

* filterAlts did nothing, but correctly retuned imposs_deflt_cons
  saying that 'x' cannot be {Left, Right} in the DEFAULT branch,
  if any (there isn't one.)

* combineIdentialAlts correctly combines the identical alts, to give
     case x of { DEFAULT -> e1 }

* BUT combineIdenticalAlts did no adjust imposs_deft_cons

* Result: when compiling e1 we did so in the belief that 'x'
  could not be {Left,Right}.  Disaster.

Easily fixed.

(It is hard to trigger; I can't construct a simple test case.)
compiler/simplCore/SimplUtils.hs